JavaFX打包:NoClassDefFoundError

时间:2018-10-11 13:52:24

标签: java maven javafx

我使用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
  • 构建jar
  • 与javafx-maven-plugin一起修补
  • 明确地将JavaFX作为依赖项添加到我的pom.xml中,希望程序集插件可以为我打包它

以上均未成功。我能够启动我的应用程序的唯一方法是直接在IDE之外,这似乎意味着JavaFX库 在我的系统上仍然可用。

关于如何再次运行它的任何想法?

1 个答案:

答案 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运行我的应用程序。