繁体   English   中英

为什么JavaFX不能和.jar文件一起打包?

[英]Why can't JavaFX be packaged with the .jar file?

我有以下错误,其中 json.org 依赖项未包含在最终 .jar 文件中。

Exception in thread "Thread-2" java.lang.NoClassDefFoundError: org/json/JSONTokener
        at gui.Main.lambda$awake$0(Main.java:91)
        at java.base/java.lang.Thread.run(Thread.java:830)
Caused by: java.lang.ClassNotFoundException: org.json.JSONTokener
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
        ... 2 more

然后我了解到您可以将 json.org jar 文件添加为“提取目录”,这解决了我的问题。 这样做之后,我想我会尝试为 JavaFX 做同样的事情。 在尝试将其添加为“提取目录”时,我注意到它已经在那里列出(如下图所示)。

在此处输入图片说明

但是,如果我尝试使用java -jar [filename].jar运行 jar 文件,则会收到Error: JavaFX runtime components are missing, and are required to run this application 我可以使用java -jar --module-path /usr/local/javafx-sdk-11.0.2/lib --add-modules javafx.controls,javafx.fxml [filename].jar运行它java -jar --module-path /usr/local/javafx-sdk-11.0.2/lib --add-modules javafx.controls,javafx.fxml [filename].jar但这不应该理论上是必要的。 我想知道是否有人知道为什么这不起作用? 谢谢。

注意:打包 JavaFX 会非常有用,因为这意味着我可以只发送 .jar 文件,它可以开箱即用,用户无需设置额外的依赖项。

我记得我在打包 JavaFX 项目时遇到了同样的问题。 解决方法是构建fat jar(包括所有依赖) 如果使用maven,可以搜索2个关键字: maven-assembly-pluginmaven-dependency-plugin

maven-assembly-plugin将帮助您构建胖 jar 文件

maven-dependency-plugin将帮助您复制外部 jar 文件(不由 maven 存储库管理)

 <plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <archive>
            <manifest>
                <mainClass>package.mainclass</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/lib</outputDirectory>
                <overWriteReleases>false</overWriteReleases>
                <overWriteSnapshots>false</overWriteSnapshots>
                <overWriteIfNewer>true</overWriteIfNewer>
            </configuration>
        </execution>
    </executions>
</plugin>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM