如何将JavaFX类加载到运行时?

5
我愿意尝试使用JavaFX,第一次去Oracle的JavaFX网站上查找,发现JavaFX现在随JDK 7u25一起提供。我已经更新了我的Java版本,但我不确定我要找什么。每当我尝试导入和使用JavaFX类时,都会出现“无法找到符号”错误。我在%JAVA_HOME%/lib中找到了“javafx-mx.jar”、“javafx-doclet.jar”、“ant-javafx.jar”文件,但据我所知,这些文件是用于JRE而非JDK的。我真的不想依赖任何Eclipse插件。我使用Maven进行构建过程。我看到了几个JavaFX Maven插件,但它们似乎针对JavaFX工具。我是否理解有误?如何正确地导入这些类?
编辑
现在我能够编译项目,使用我在here中找到的方法。它建议添加:
<dependency>
  <groupId>com.oracle</groupId>
  <artifactId>javafx</artifactId>
  <version>2.2</version>
  <scope>system</scope>
  <systemPath>${java.home}/lib/jfxrt.jar</systemPath>
</dependency>

这解决了我的构建问题,但我无法运行程序,我正在尝试运行这个简单的example,但我得到了这个错误:
java.lang.NoClassDefFoundError: javafx/application/Application
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:792)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:285)
    at java.lang.Thread.run(Thread.java:724)
Caused by: java.lang.ClassNotFoundException: javafx.application.Application
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

你有没有想过如何在运行时添加相同的库?我正在使用 maven-exec-plugin


可能是重复的内容,来自手动编译JavaFX 2.0 - jewelsea
@jewwlsea 谢谢,那个答案给了我一些启示,但如果你想用maven构建它,那就不一样了。 - amaurs
是的,同意,随着更新,它不再是重复的了。 - jewelsea
1个回答

4

不建议将jfxrt.jar作为Maven系统依赖项

我认为通过将jfxrt.jar作为JavaFX构建的系统依赖项与Maven集成不是一个好主意。

使用这种方法,您将能够构建应用程序(因为javafx运行时类的系统依赖项将允许Maven找到它们)。

但是,当您使用Java 7运行应用程序时,仍然需要手动添加classpath到您的java.exe命令中,类似于Compile code using JavaFX 2.0 (using command line)

我不使用Maven exec插件,但请参见add a jar to maven exec:java classpath,如果您想以这种方式使用该工具,则提供了设置适当的classpath的说明。

首选方法

首选方法是使用推荐的部署工具(例如JavaFX ant tasksjavafxpackagerjavafx-maven-pluginjavafx-gradle-plugin)来正确打包您的应用程序。

这些工具将在您的应用程序jar中嵌入一个小的包装器主类,该类将查找JavaFX运行时(如果可用)或帮助用户通过运行时安装向导进行操作。

此外,如果您使用Oracle Java 8,javafx将在默认classpath上,因此您不需要担心与classpath相关的问题。


javafx-maven-plugin 中的 fix-classpath 目标解决了问题,我真的想避免这些额外的步骤,但没关系,我猜我们得等待 Java 1.8 正式发布。 - amaurs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接