我在最终.jar文件中未包含json.org依赖项时遇到以下错误。
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
运行它,但是从理论上讲这不是必需的。我想知道是否有人知道为什么这行不通?谢谢。
注:打包JavaFX确实很有用,因为它意味着我可以发送.jar文件,它可以直接使用,而无需用户设置额外的依赖关系。
maven-assembly-plugin
将帮助您构建胖罐文件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>