如何将javafx类转换为运行时?

时间:2013-07-18 21:38:07

标签: maven javafx

我愿意第一次尝试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

1 个答案:

答案 0 :(得分:4)

建议不要让jfxrt.jar成为maven系统依赖

我不认为通过系统依赖关系将jven与JavaFX构建集成到jfxrt.jar是一个好主意。

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

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

我不使用maven exec插件,但是如果你想以这种方式使用该工具,请参阅add a jar to maven exec:java classpath,它提供了为该exec插件设置相应类路径的说明。

首选方法

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

这些工具将在您的应用程序jar中嵌入一个小的包装器主类,如果它可用,它将找到JavaFX运行时,如果不可用,则帮助引导用户完成运行时安装。

此外,如果您使用Oracle Java 8,则javafx将位于您的默认类路径中,因此您无需担心与类路径相关的问题。