首页 > 编程语言 >解决IntelliJ IDEA执行maven打包,执行java -jar命令提示jar中没有主清单属性

解决IntelliJ IDEA执行maven打包,执行java -jar命令提示jar中没有主清单属性

时间:2023-09-23 13:32:09浏览次数:54  
标签:文件 java IntelliJ jar maven 清单 Main Class

问题场景

IDEA执行mvn clean package -DskipTest=true命令或者借助工具的Maven菜单进行打包操作,然后执行java -jar app.jar命令后,提示jar中没有主清单属性


D:\WorkSpace\demo\target>java -jar demo-SNAPSHOT.jar
demo-SNAPSHOT.jar中没有主清单属性

原因分析

这个错误通常是由于生成的JAR文件缺少一个主清单属性引起的。在使用java -jar命令运行JAR文件时,JVM需要查找JAR文件中包含Main-Class属性的清单文件。如果没有找到这个属性,就会出现该错误。

验证分析

打开Jar包,查看其构建的jar目录,可以看到有一个MANIFEST.MF文件。该文件就是jar运行时要查找的清单目录,其中主清单数据,就是要运行的主类,即main函数入口所在的类

在这里插入图片描述 正常情况下,该清单文件内会有一个:

Main-Class:cn.ybzy.demo.mainDemo

解决方案

添加Main-Class

手动创建一个包含Main-Class清单属性的MANIFEST.MF文件,然后将其添加到JAR文件中

打开Jar包,在MANIFEST.MF文件中,添加Main-Class主类

Main-Class:cn.ybzy.demo.mainDemo

使用插件

1.使用maven-jar-plugin插件

在pom.xml文件中使用maven-jar-plugin插件,并在其中指定了<mainClass>属性。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.2.0</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <mainClass>com.example.MainClass</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

2.使用maven-shade-plugin插件

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.2.4</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                  <mainClass>com.example.MainClass</mainClass>
                </transformer>
              </transformers>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

标签:文件,java,IntelliJ,jar,maven,清单,Main,Class
From: https://blog.51cto.com/chencoding/7577929

相关文章

  • 无涯教程-JavaScript - MAXA函数
    描述MAXA函数返回参数列表中的最大值。语法MAXA(value1,[value2]...)争论Argument描述Required/OptionalValue1Thefirstnumberargumentforwhichyouwanttofindthelargestvalue.RequiredValue2...Numberarguments2to255forwhichyouwanttofin......
  • 【Java 基础篇】Java Date 类详解:日期和时间操作的利器
    在Java编程中,处理日期和时间是一项常见但复杂的任务。Java提供了许多用于日期和时间操作的类,其中java.util.Date类是最早的日期和时间类之一。然而,它存在一些问题,因此Java8引入了java.time包,其中包含了java.time.LocalDate、java.time.LocalTime和java.time.LocalDat......
  • 【Java 基础篇】深入理解 Java 中的抽象类:提高代码可维护性与扩展性
    抽象类(AbstractClass)是Java面向对象编程中的一个重要概念。它允许我们定义一组抽象方法,这些方法可以被子类(类)实现。抽象类通常用于定义一些通用的方法和属性,但不能被实例化。本篇博客将深入探讨Java中抽象类的概念、语法和实际应用,适用于初学者,帮助你轻松理解和应用抽象类。什......
  • 【Java 基础篇】Java Date 类详解:日期和时间操作的利器
    在Java编程中,处理日期和时间是一项常见但复杂的任务。Java提供了许多用于日期和时间操作的类,其中java.util.Date类是最早的日期和时间类之一。然而,它存在一些问题,因此Java8引入了java.time包,其中包含了java.time.LocalDate、java.time.LocalTime和java.time.LocalDate......
  • 【Java 基础篇】Java 接口全面解析:简化多态性与代码组织
    接口(Interface)是Java面向对象编程中的一个重要概念。它允许定义一组抽象方法,这些方法可以被实现类(类)实现。接口提供了一种规范,规定了实现类必须提供哪些方法,但不关心具体的实现细节。本篇博客将深入探讨Java中接口的概念、语法和实际应用,适用于初学者,帮助你轻松理解和应用接口......
  • 【Java 基础篇】Java继承:打开面向对象编程的大门
    继承是面向对象编程(Object-OrientedProgramming,OOP)中的一个重要概念。在Java中,继承允许一个类(子类)从另一个类(父类)继承属性和方法。这种机制使得代码重用、扩展和维护变得更加容易。本篇博客将深入探讨Java中继承的概念、语法和最佳实践,适用于初学者,让你轻松理解和运用继承的强大功......
  • 【Java 基础篇】Java多态:让你的代码更灵活而强大
    多态是面向对象编程中的一个重要概念,它允许我们在不同的对象上调用相同的方法,但根据对象的不同,可以产生不同的行为。在Java中,多态性是一个强大的特性,它有助于代码的可扩展性和可维护性。本篇博客将深入探讨Java中的多态概念、语法和实际应用,适用于初学者,帮助你轻松理解和应用多......
  • 【Java 基础篇】Java ArrayList 简明教程:灵活管理数据集合
    在Java编程中,数组是一种常见的数据结构,用于存储一组元素。然而,数组有一些限制,例如大小固定,不支持动态增长等。为了克服这些限制,Java提供了一个灵活的数据结构——ArrayList。ArrayList是Java集合框架中的一部分,它允许我们创建可变大小的数组,方便地添加、删除、获取和修改元素。本篇......
  • 【Java 基础篇】StringBuilder的魔力:Java字符串处理探究
    在Java编程中,字符串是一个常见的数据类型,用于存储文本信息。然而,与字符串相关的操作可能会导致性能问题,因为字符串是不可变的,每次对字符串进行操作都会创建一个新的字符串对象。为了解决这个问题,Java提供了StringBuilder类,它允许我们有效地处理可变字符串。在本篇博客中,我们将详细......
  • 【Java 基础篇】Java StringBuffer详解:更高效的字符串处理
    在Java编程中,字符串是一个常见的数据类型,用于存储文本信息。然而,与字符串相关的操作可能会导致性能问题,因为字符串是不可变的,每次对字符串进行操作都会创建一个新的字符串对象。为了解决这个问题,Java提供了StringBuffer类,它允许我们有效地处理可变字符串。在本篇博客中,我们将详细讨......