Java项目用WiX构建可执行程序无法加载FlatLaf依赖问题
一、Jar打包解决方案(包含依赖)
默认Maven生成的是瘦Jar,仅包含自身代码,不包含FlatLaf这类第三方依赖。可以通过maven-shade-plugin打包成胖Jar,将所有依赖合并到一个Jar文件中:
修改你的pom.xml,添加以下插件配置:
<build> <plugins> <!-- Shade插件:打包包含所有依赖的胖Jar --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.5.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <!-- 指定主类,让Jar可直接运行 --> <mainClass>myname.myproj.MyProj</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build>
在NetBeans中执行clean和package命令后,target目录会生成两个Jar:
myProj-1.0.jar:原始瘦JarmyProj-1.0-shaded.jar:包含所有依赖的胖Jar,可直接运行
测试胖Jar:
java -jar target/myProj-1.0-shaded.jar
二、jpackage构建MSI安装包解决方案
方案1:基于胖Jar打包
直接使用上面生成的胖Jar执行jpackage命令:
jpackage --input target --win-console --name MyProj --main-jar myProj-1.0-shaded.jar --type msi
此方式打包出的MSI安装后,程序自带所有依赖,不会出现NoClassDefFoundError。
方案2:基于瘦Jar+依赖Jar打包
若不想使用胖Jar,需将主Jar和依赖Jar统一放置后,让jpackage识别类路径:
先通过Maven将依赖导出到指定目录,比如
lib:
在pom.xml添加maven-dependency-plugin:<build> <plugins> <!-- 将依赖导出到target/lib目录 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.6.1</version> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> </configuration> </execution> </executions> </plugin> </plugins> </build>执行
package命令后,target/lib目录会包含FlatLaf的依赖Jar。执行jpackage命令,指定主Jar和依赖类路径:
jpackage --input target --win-console --name MyProj --main-jar myProj-1.0.jar --main-class myname.myproj.MyProj --type msi --class-path "lib/*"--class-path "lib/*"用于告诉jpackage加载lib目录下的所有依赖Jar。
内容的提问来源于stack exchange,提问作者Rodrigo Oliveira
相关产品推荐
相关产品推荐

