簡體   English   中英

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

[英]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的寶貴幫助(在他的評論中值得稱贊的耐心),我在很大程度上解決了這一問題。 因此,應歸功於他。

所以,我們開始:

你的目標是什么

您的罐子必須符合以下規格:

  1. 它必須包含javafx jar庫(意味着它們的packages文件夾,從其jar中提取出來並放在您的根目錄中)。
  2. 它必須在根目錄中包含二進制javafx庫(對於Linux為* .so)。
  3. 它必須(非常重要)具有啟動器:不擴展“應用程序”的主類。 如果沒有,則錯誤將不清晰:它將告訴它找不到javafx運行時;否則,它將顯示錯誤。 那不是真正的問題。

現在,如果您可以通過任何方式做到這一點(Ant,Makefile,自定義腳本,特定的IDE功能...),那么一切將正常運行。

如何在NetBeans中(以及其他使用Ant的地方,進行少量修改)

首先,我在項目中創建了一個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工件的列表。

您要做的就是:

  • 將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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM