目录
一、没有主清单属性
- 解决方案一:手动修改MANIFEST.MF 文件配置
- 通过 7z 等压缩工具打开 jar 包
- 修改 META-INF 目录中的 MANIFEST.MF 文件(选中文件后右键选择编辑而不是打开)
- 在原有内容的末尾加上一行:
Main-Class: com.zhiyin.screenshot.ScreenShotDemo(全限定名,不加后缀)
键值之间必须用英文冒号隔开,并且必须后接一个(仅有一个)空格
修改文件后记得保存,同时压缩工具会提醒是否更新压缩文件,选择是(选择否时修改不生效,该报错还报错)
- 解决方案二:使用插件并配置主函数
pom.xml 配置文件中加入以下配置(注意标签的嵌套)
<project>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<!-- 配置jar包主函数 -->
<mainClass>com.zhiyin.screenshot.ScreenShotDemo</mainClass>
</manifest>
</archive>
<!-- jar包名称 -->
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<!-- include标签存在但为空时不会默认构建目录下的配置文件 -->
<!--<include></include>-->
</includes>
<excludes>
<!-- 排除logs文件夹下的日志文件 -->
<exclude>logs/**</exclude>
</excludes>
</resource>
</resources>
</build>
</project>
待下载完成插件后,在项目的 Maven 窗口的 Plugins 下即可找到 assembly 插件(如果没有请刷新)
使用 assembly:assembly 完成项目的打包
二、报错:Invalid or corrupt jarfile xxx.jar
分析:使用步骤 1 中修改 MANIFEST.MF 文件的方式来设置主函数时是否配置正确,键和值之间是否有英文冒号加空格,且英文和符号必须全为半角状态
三、打包时未加入程序依赖包,导致程序启动报错
分析:因为是通过 IDEA 中 Maven 项目的 Lifecycle 中的 package 操作完成打包的,所以该命令默认是不会把依赖的 jar 包构建到 target 中
解决:借助于 Maven 插件完成
-
pom.xml 文件中加入配置
注意标签的嵌套
<project> <build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <archive> <manifest> <!-- 配置jar包主函数 --> <mainClass>com.zhiyin.screenshot.ScreenShotDemo</mainClass> </manifest> </archive> <!-- jar包名称 --> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </plugin> </plugins> <resources> <resource> <directory>src/main/resources</directory> <includes> <!-- include标签存在但为空时不会默认构建目录下的配置文件 --> <!--<include></include>--> </includes> <excludes> <!-- 排除logs文件夹下的日志文件 --> <exclude>logs/**</exclude> </excludes> </resource> </resources> </build> </project>
-
加入配置后,等待插件完成下载后,在项目的 Maven 窗口 Plugs 下就会出现
-
通过 assembly 插件进行打包的操作,再进入到 target 目录中,会发现多出一个
descriptorRef
标签中的指定名称的 jar 包,打开 jar 包时会发现依赖的 jar 的也在其中
四、知识点
全限定名:包名 + 类名(不包括类的后缀名),包与包之间,包与类之间的层级关系用 .
表示,包的最顶层为程序中的源代码目录,Maven 项目中则为 Sources Root
下的包