java - 如何使用 NetBeans 10 打包 javafx 11/jdk 11 应用程序

标签 java javafx netbeans

在离开 Java 世界一段时间后,我试图在 NetBeans 10 中使用 javafx11、jdk11 打包一个 javafx 应用程序。由于 Javafx 被排除在标准 jdk 之外,而 NetBeans 仍在 Apache 中孵化,因此情况比以前更加艰难。

幸运的是我找到了this great tutorialthis great answer这使我能够从 NetBeans 内部运行一个简单的 Hello World 应用程序。

但我不能让它在 IDE 之外工作:当使用输出的 jar 调用时,jre 给出以下错误:

java.lang.NoClassDefFoundError: javafx/application/Application

所以我想我需要在 jar 中打包一个 javafx 运行时才能运行它,但我不知道该怎么做。

我找到了一些指针,但它们都使用命令行指向 javafx sdk,但我的目标不是安装了此 sdk 的机器,而是想将所需的一切(jre 本身除外)打包到 jar 中。

非常感谢任何帮助。

最佳答案

多亏了 José Pereda 的无价帮助(以及他的评论中值得称赞的耐心),我在很大程度上解决了这个问题。所以功劳应该归于他。

那么,我们开始吧:

你的目标是什么

您的 jar 必须符合以下规范:

  1. 它必须包含 javafx jar 库(意味着它们的包文件夹,从它们的 jar 中提取并放置在您的根目录中)。
  2. 它必须在根目录中包含二进制 javafx 库(对于 Linux 为 *.so)。
  3. 它必须(非常重要)有一个启动器:一个不扩展“应用程序”的主类。如果没有,错误将不清楚:它会告诉它找不到 javafx 运行时;这不是真正的问题。

现在,如果您可以通过任何方式(Ant、Makefile、自定义脚本、特定 IDE 功能...)做到这一点,那么一切都会很好地工作。

如何在 NetBeans 中执行此操作(以及其他使用 Ant 的地方,稍作修改)

首先,我在我的项目中创建了一个 lib 文件夹,并将库直接放在那里(这不是必需的,在我的情况下更容易),然后我覆盖了我的 build.xml 中的“post-jar”目标,添加了接下来创建第二个“dist”存储库,我称之为“dist-portable”并在其中构建了 fat jar:

<target name="-post-jar">

<property name="store.jar.name" value="${application.title}${application.desc}-portable"/>
<property name="store.dir" value="dist-portable"/>
<property name="store.jar" value="${store.dir}/${store.jar.name}.jar"/>

<echo message="Packaging ${application.title}${application.desc} into a single JAR at ${store.jar}"/>
    
    <delete dir="${store.dir}"/>
    <mkdir dir="${store.dir}"/>

    
    <jar destfile="${store.dir}/temp_final.jar" filesetmanifest="skip">
        <zipgroupfileset dir="dist" includes="*.jar"/>
        <zipgroupfileset dir="lib" includes="*.jar"/>
        <fileset dir="lib" includes="*.so"/>

        <manifest>
            <attribute name="Main-Class" value="${main.class}"/>
        </manifest>
    </jar>

    <zip destfile="${store.jar}">
        <zipfileset src="${store.dir}/temp_final.jar"
        excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/>
    </zip>

<delete file="${store.dir}/temp_final.jar"/>

</target>

替代方案

使用更高级的构建工具,例如 Maven 或 Gradle。我不想(因此我的问题的重点)因为他们似乎太复杂了,考虑到我只做小项目,不值得打扰。

更有争议的替代方案

“8”代(NetBeans 8、Javafx8 和 JDK8)是很棒的软件,发布时间不早(2014 年上半年),直到几个月前才正式支持:它们不是古老的 并且...它们开箱即用,无需执行任何操作。 “11”一代可能需要成熟一点,我认为还没有每个环境都跳到最前沿的 JDK11。 仍然可以找到旧版本并且几乎在任何地方都运行良好,您可以考虑简单地使用它们。请注意它们不再更新(这可能是一个安全问题)。

关于java - 如何使用 NetBeans 10 打包 javafx 11/jdk 11 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55559930/

相关文章:

JavaFX VBox 布局

java - EJB Lite 类在项目类路径上不可用

java - JPA impementor 是否实现 javax.persistence.Entity 注释?

java - 不同上下文中同一类的变量

java - 如果字符串可能在第一个位置包含像制表符这样的分隔符,如何将字符串拆分为非空单词

java - 在 Alert 上调用 initOwner 时的 NPE (JavaFX)

java - BigDecimal 刻度不起作用

JavaFX:TextArea 光标移回到新文本的第一行

java - 当方法抛出异常时,Netbeans 不强制我 try catch

java - Microsoft Intellimouse 滚轮不适用于 Vista 上的 Netbeans 6.5