You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:原始瘦Jar
  • myProj-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识别类路径:

  1. 先通过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。

  2. 执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 20:15:06