主要是因为jar中“缺少MANIFEST.MF文件”或者是“MANIFEST.MF文件中未包含有主类的路径”,补充完善MANIFEST.MF文件后就能正常运行。
MANIFEST.MF的基本结构如下:
# 其他属性...
Manifest-Version: 1.0
Main-Class: com.xxx.xxx.Application
要处理这个问题也简单,在打包前后都可以进行。
1、打包前
1)spring-boot-maven-plugin插件
如果是maven项目的话,可以考虑使用spring-boot-maven-plugin(即使不是spring项目也可以),该插件可以自动在jar中生成MANIFEST.MF文件。
在pom文件中添加如下配置:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>3.0.11</version>
<executions>
<execution>
<id>repackage</id>
<configuration>
<attach>false</attach>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
2)手动创建MANIFEST.MF + maven-jar-plugin插件(同样是maven工程)
可以考虑先手动创建MANIFEST.MF文件(META-INF/MANIFEST.MF,其结构如开头所示),再通过maven-jar-plugin指定该文件。
如:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.2</version>
<configuration>
<archive>
<manifestEntries>
<build-time>${maven.build.timestamp}</build-time>
</manifestEntries>
<manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile>
</archive>
</configuration>
</plugin>
</plugins>
</build>
3)使用idea生成MANIFEST.MF文件
(此处为macos,windows应该也是类似的)
第一步:菜单栏 -> File -> Project Structure
第二步:Project Settings -> Artifacts -> “+”
第三步:JAR -> From modules with dependencies
第四步:填写主类以及MANIFEST.MF文件生成的位置
点击Main Class右侧的菜单图标选择主类;MANIFEST.MF文件生成的位置选择项目的src目录下即可,填写完毕后点击ok。
在完成了以上的操作后,打包为jar时,里面应该就含有MANIFEST.MF文件以及主类的路径了。
2、打包后(不推荐)
通过第一点也不难看出,其实MANIFEST.MF是一个很简单的配置文件,自己创建并添加至jar,或修改jar里面的MANIFEST.MF文件也是可以的。
如可以使用“360压缩”打开jar,利用360压缩不会立即解压,可以查看或修改里面的文件的特性,将MANIFEST.MF添加或修改,保存后运行即可。
但不推荐这种方式,很麻烦,每次都要修改。
刚开始接触打包java项目的时候,确实常常遇到这种问题,不过这只是个小坑,踩一遍就好。