一段时间后,我试图在NetBeans 10中使用javafx11,jdk11打包javafx应用程序。由于Javafx已被淘汰出标准的jdk,并且NetBeans仍在Apache进行孵化,因此情况比以前要粗糙一些。
幸运的是,我发现this great tutorial和this great answer使得我可以从NetBeans内部运行一个简单的Hello World应用程序。
但是我无法使其在IDE之外运行:当用输出的jar调用时,jre给出以下错误:
java.lang.NoClassDefFoundError: javafx/application/Application
所以我想我需要在jar中打包一个javafx运行时才能运行它,但是我不知道该怎么做。
我找到了一些指针,但是它们都使用命令行来指向javafx sdk,但是我并不是针对安装了该sdk的机器,而是希望将所需的所有内容(jre本身除外)打包到jar中。 / p>
非常感谢任何帮助。
答案 0 :(得分:2)
在很大程度上要归功于何塞·佩雷达(JoséPereda)的宝贵帮助(在他的评论中值得称赞的耐心)。所以应该归功于他。
所以,我们开始:
您的罐子必须符合以下规格:
现在,如果您可以通过任何方式(Ant,Makefile,自定义脚本,特定的IDE功能...)做到这一点,那么一切都将很好地工作。
首先,我在项目中创建了一个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的列表。
您要做的就是:
添加文件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