如何使用NetBeans 10打包javafx11 / jdk11应用程序

时间:2019-04-07 14:19:03

标签: java javafx netbeans

一段时间后,我试图在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中。 / p>

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

在很大程度上要归功于何塞·佩雷达(JoséPereda)的宝贵帮助(在他的评论中值得称赞的耐心)。所以应该归功于他。

所以,我们开始:

您的目标是什么

您的罐子必须符合以下规格:

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

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

如何在NetBeans(以及其他使用Ant的地方,进行少量修改)中做到这一点

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

<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年上半年)发布,并在几个月前得到正式支持:它们不是 ancient 和...他们可以直接使用而无需执行任何操作。 “ 11”代可能必须成熟一些,我认为并不是所有环境都已跃升至最先进的JDK11。 仍然可以找到较旧的版本,并且在任何地方都可以正常使用,您可以考虑简单地使用它们。请注意,它们不再被更新(这可能是安全问题)。

答案 1 :(得分:0)

一个月前,我遇到了同样的问题。为了解决这个问题,我将Maven与以下pom.xml结合使用:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>{your-groupId}</groupId>
<artifactId>{your-artifactId}</artifactId>
<version>0.1-SNAPSHOT</version>

<properties>
    <lwjgl.version>3.2.1</lwjgl.version>
    <joml.version>1.9.12</joml.version>
    <main.class>{your-package-name}.{your-main-class}</main.class>
    <maven.compiler.source>1.11</maven.compiler.source>
    <maven.compiler.target>1.11</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<!-- // Compiling : $ mvn clean compile assembly:single-->

<build>
    <directory>outputDirectory</directory>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.1.0</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>false</addClasspath>
                        <mainClass>${main.class}</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>${main.class}</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
                <source>11</source>
                <target>11</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.6.0</version>
            <executions>
                <execution>
                    <goals>
                        <goal>java</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <mainClass>${main.class}</mainClass>
            </configuration>
        </plugin>
    </plugins>
    <resources>
        <resource>
            <directory>src/main/java/{your-package-name}</directory>
            <includes>
                <include>sample.fxml</include>
            </includes>
        </resource>
    </resources>
</build>

<dependencies>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-base</artifactId>
        <version>13-ea+2</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-controls</artifactId>
        <version>13-ea+2</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-fxml</artifactId>
        <version>13-ea+2</version>
    </dependency>
    <dependency>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-graphics</artifactId>
        <version>13-ea+2</version>
    </dependency>
    <dependency>
        <groupId>javax.json</groupId>
        <artifactId>javax.json-api</artifactId>
        <version>1.1.4</version>
    </dependency>
</dependencies>

您可以找到所有可用的javafx工件here的列表。

您要做的就是:

  • 将pom.xml添加到您的项目中
  • 检查依赖项是否满足您的需求
  • 导入pom.xml(NetBeans肯定会向您建议)
  • 添加文件module-info.java。我的内容如下:

    module {your-package-name} {
    
        requires javafx.fxml;
        requires javafx.controls;
        requires javafx.graphics;
        requires javafx.base;
        requires javax.json;
        // Change the list to match your dependencies
    
        opens {your-package-name};
    
    }
    
  • 使用NetBeans或通过终端中的mvn compile assembly:single命令来构建jar