首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用NetBeans 10打包javafx11 11/jdk11 11应用程序

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

Stack Overflow用户
提问于 2019-04-07 14:19:03
回答 2查看 2K关注 0票数 1

在离开java世界一段时间后,我尝试使用javafx11,jdk11在NetBeans 10中打包一个javafx应用程序。由于Javafx已经脱离了标准的jdk,而且NetBeans仍在Apache中孵化,所以事情比以前更加艰难了。

幸运的是,我找到了这个伟大的教程这个伟大的答案,这允许我从NetBeans内部运行一个简单的Hello应用程序。

但是,我无法使它在IDE之外工作:当使用输出的jar调用时,jre会给出以下错误:

代码语言:javascript
复制
java.lang.NoClassDefFoundError: javafx/application/Application

因此,我想我需要在jar中打包javafx运行时才能运行它,但我不知道如何运行它。

我找到了一些指针,但它们都使用命令行来指向javafx,但我并不是针对安装了此sdk的机器,而是希望打包jar中所需的一切( jre本身除外)。

任何帮助都很感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-08 04:51:16

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

所以,我们开始:

你的目标是什么?

您的jar必须符合以下规格:

  1. 它必须包含javafx库(即它们的包文件夹,从它们的jar中提取并放置在您的根目录中)。
  2. 它必须包含根处的二进制javafx库(*.so for Linux)。
  3. 它必须(非常重要)有一个启动程序:一个不扩展"Application“的主类。如果没有,错误将是不清楚的:它会告诉它找不到javafx运行时;这并不是真正的问题。

现在,如果您可以以任何方式做到这一点(Ant、Makefile、自定义脚本、特定的IDE特性.)那一切都会很顺利的。

如何在NetBeans (以及其他使用Ant的地方,只需稍作修改)中执行此操作

首先,我在我的项目中创建了一个lib文件夹,并将库直接放在那里(这不是必要的,只是在我的例子中更容易),然后在我的build.xml中高估了“post”目标,添加了以下内容来创建第二个"dist“存储库,我称之为"dist-portable”,并在其中构建了胖jar:

代码语言:javascript
复制
<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。旧版本仍然可以在任何地方找到并运行良好,您可以考虑简单地使用它们。请注意,他们不再被更新(这可能是一个安全问题)。

票数 3
EN

Stack Overflow用户

发布于 2019-04-07 14:32:04

一个月前我也有同样的问题。为了解决这个问题,我使用了Maven和下面的pom.xml:

代码语言:javascript
复制
<?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肯定会向您推荐)
  • 添加文件模块-info.java。我公司的内容如下: 模块{您的包名}{需要javafx.fxml;需要javafx.controls;需要javafx.graphics;需要javafx.base;需要javax.json;//更改列表以匹配您的依赖项将打开{ your package-name};}
  • 使用NetBeans或通过终端中的mvn compile assembly:single命令构建jar
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55559930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档