我使用maven和OpenJDK 1.8打包JavaFX应用程序 我的pom.xml的相关部分:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>ui.Main</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
现在重要的是这曾经有效。我知道这一点是因为我在包装最终起作用的地方专门进行了git commit。 经过大约一天的时间,并进行了多次这样的构建(我不知道更改了什么),由于以下错误,我无法再启动jar:
$ java -jar target/app.jar
Error: Could not find or load main class ui.Main Caused by:
java.lang.NoClassDefFoundError: javafx/application/Application
当我查看Jar的内容时,可以看到除了JavaFX类之外,所有依赖项都被明确包括在内。
我尝试过的事情:
javapackager
以上均未成功。我能够启动我的应用程序的唯一方法是直接在IDE之外,这似乎意味着JavaFX库 在我的系统上仍然可用。
关于如何再次运行它的任何想法?
答案 0 :(得分:3)
简短答案
我用openJDK 11运行jar,而用openJDK 8构建它时不包含JavaFX。
发现,详细信息和原因
由于我的IDE可以正常运行我的代码,因此我认为问题是特定于我的配置/机器的。事实证明,Canonical / Ubuntu决定
[对于] Bionic [...] 将主要的默认JRE / JDK 移至OpenJDK 11中 2018年9月/ 10月为SRU。 AskUbuntu
而且,正如在其他SO线程上指出的那样:
JavaFX 11不再是JDK的一部分 StackOverflow
(这还包括有关如何使用JDK 11修复此问题的说明)
最后,按照墨菲定律,我在10月4日设置了该项目的包装,并决定在10月8日通过apt安装eclipse,其中包括openjdk-11-jdk:amd64
(这在有用的{{1 }}。
此还更新了我的/var/log/apt/history.log
使其指向v11。由于我在运行jar时未明确指定Java二进制文件,因此它崩溃了。
运行
/etc/alternatives/java
快速测试按预期工作。现在,我只需要将项目升级到openJDK 11,否则始终使用特定的JDK 8运行我的应用程序。