在离开java世界一段时间后,我尝试使用javafx11,jdk11在NetBeans 10中打包一个javafx应用程序。由于Javafx已经脱离了标准的jdk,而且NetBeans仍在Apache中孵化,所以事情比以前更加艰难了。
幸运的是,我找到了这个伟大的教程和这个伟大的答案,这允许我从NetBeans内部运行一个简单的Hello应用程序。
但是,我无法使它在IDE之外工作:当使用输出的jar调用时,jre会给出以下错误:
java.lang.NoClassDefFoundError: javafx/application/Application因此,我想我需要在jar中打包javafx运行时才能运行它,但我不知道如何运行它。
我找到了一些指针,但它们都使用命令行来指向javafx,但我并不是针对安装了此sdk的机器,而是希望打包jar中所需的一切( jre本身除外)。
任何帮助都很感激。
发布于 2019-04-08 04:51:16
这在很大程度上归功于何塞·佩雷达( JoséPereda )的宝贵帮助(以及他的评论中值得称赞的耐心)。所以应该归功于他。
所以,我们开始:
你的目标是什么?
您的jar必须符合以下规格:
现在,如果您可以以任何方式做到这一点(Ant、Makefile、自定义脚本、特定的IDE特性.)那一切都会很顺利的。
如何在NetBeans (以及其他使用Ant的地方,只需稍作修改)中执行此操作
首先,我在我的项目中创建了一个lib文件夹,并将库直接放在那里(这不是必要的,只是在我的例子中更容易),然后在我的build.xml中高估了“post”目标,添加了以下内容来创建第二个"dist“存储库,我称之为"dist-portable”,并在其中构建了胖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。旧版本仍然可以在任何地方找到并运行良好,您可以考虑简单地使用它们。请注意,他们不再被更新(这可能是一个安全问题)。
发布于 2019-04-07 14:32:04
一个月前我也有同样的问题。为了解决这个问题,我使用了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工件这里的列表。
你所要做的就是:
mvn compile assembly:single命令构建jarhttps://stackoverflow.com/questions/55559930
复制相似问题