[英]Runtime error for a basic javafx11 application using jdk11 and Eclipse 2019-03 (4.11.0)
[英]How to package a javafx11/jdk11 application using NetBeans 10
一段時間后,我試圖在NetBeans 10中使用javafx11,jdk11打包javafx應用程序。 由於Javafx被淘汰出標准的jdk,而NetBeans仍在Apache進行孵化,因此情況比以前要粗糙一些。
幸運的是,我找到了這個很棒的教程和這個很棒的答案 ,使我能夠從NetBeans內部運行一個簡單的Hello World應用程序。
但是我無法使其在IDE之外運行:當用輸出的jar調用時,jre給出以下錯誤:
java.lang.NoClassDefFoundError: javafx/application/Application
所以我想我需要在jar中打包一個javafx運行時才能運行它,但是我不知道該怎么做。
我找到了一些指針,但是它們都使用命令行指向javafx sdk,但是我並不是針對安裝了該sdk的計算機,而是希望將所需的所有內容(jre本身除外)打包到jar中。
任何幫助,不勝感激。
感謝JoséPereda的寶貴幫助(在他的評論中值得稱贊的耐心),我在很大程度上解決了這一問題。 因此,應歸功於他。
所以,我們開始:
您的罐子必須符合以下規格:
現在,如果您可以通過任何方式做到這一點(Ant,Makefile,自定義腳本,特定的IDE功能...),那么一切將正常運行。
首先,我在項目中創建了一個lib文件夾,然后將庫直接放置在此處(這是沒有必要的,只是以我為例),然后在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年上半年)發布,並在幾個月前得到正式支持:它們並不古老 。 ..他們只是開箱即用,無需執行任何操作。 “ 11”代可能必須成熟一些,我認為並不是所有環境都已躍升至最先進的JDK11。 仍然可以找到較舊的版本,並且在任何地方都可以正常使用,您可以考慮簡單地使用它們。 請注意,它們不再被更新了(這可能是安全問題)。
一個月前,我遇到了同樣的問題。 為了解決這個問題,我將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工件的列表。
您要做的就是:
添加文件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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.