背景
服务器重新拉了个环境,IDEA创建了一个demo打包Jar包测试。结果运行Jar包报错:No main manifest attribute, in xxx.jar,没有主清单属性。
刚开始略有诧异,简单demo还能报错?初始打包配置如下。
初始pom配置
<build>
<!--修改编译出来的jar包名,仅为{artifactId}.jar-->
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>com.example.inittestdemo.InitTestDemoApplication</mainClass>
<skip>true</skip>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
原因
查看pom文件,我在demo中使用了 spring-boot-maven-plugin
来打包 Spring Boot 应用,并且在 configuration
部分设置了 <skip>true</skip>
。
这个设置实际上会导致 spring-boot-maven-plugin
的 repackage
目标被跳过,因此不会生成可执行的 jar,也就是说,不会创建包含主清单属性的 JAR 文件。
Spring Boot JAR 文件的主要特点是它包含了一个 META-INF/MANIFEST.MF
文件,它有一个 Start-Class
属性,用来指示运行 JAR 时要调用的主类。但是,因为我默认设置了 <skip>true</skip>
,所以 repackage
目标不会执行,相应的主清单属性也就不会被添加到 JAR 文件中。导致jar包运行失败。
要解决这个问题,只需要移除 <skip>true</skip>
配置,以便让 spring-boot-maven-plugin
的 repackage
目标可以执行并创建正确的可执行 JAR 文件。重新打包运行,一切OK,没有问题。
结果
修改后的pom配置文件:
<build>
<!--修改编译出来的jar包名,仅为{artifactId}.jar-->
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>com.example.inittestdemo.InitTestDemoApplication</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>