Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在没有本机安装程序的情况下为使用JavaFX的应用程序创建可运行的jar_Java_Eclipse_Ant_Jar_Javafx - Fatal编程技术网

如何在没有本机安装程序的情况下为使用JavaFX的应用程序创建可运行的jar

如何在没有本机安装程序的情况下为使用JavaFX的应用程序创建可运行的jar,java,eclipse,ant,jar,javafx,Java,Eclipse,Ant,Jar,Javafx,我有一个应用程序,在从Eclipse导出为可运行的jar并让它“将所需的库打包到生成的jar中”之后,它可以很好地使用“java-jar blah.jar”运行 我添加了一些JavaFX代码来弹出一个web浏览器。现在,似乎不可能制作一个能够跨小型Java版本运行的jar。当我将其导出为可运行的jar时,它会复制到jfxrt.jar中,该jfxrt.jar特定于我的次要版本。如果我使用“java-jar blah.jar”来运行这个jar,以获得完全匹配的java版本(jdk1.7.0_17),

我有一个应用程序,在从Eclipse导出为可运行的jar并让它“将所需的库打包到生成的jar中”之后,它可以很好地使用“java-jar blah.jar”运行

我添加了一些JavaFX代码来弹出一个web浏览器。现在,似乎不可能制作一个能够跨小型Java版本运行的jar。当我将其导出为可运行的jar时,它会复制到jfxrt.jar中,该jfxrt.jar特定于我的次要版本。如果我使用“java-jar blah.jar”来运行这个jar,以获得完全匹配的java版本(jdk1.7.0_17),那么它可以正常工作,但是如果我使用一个稍新的版本(jdk1.7.0_45),那么它就无法正确解析swingx类。“一次编写,随时随地运行”到此为止

我尝试使用javafxant任务,但无法让任务实际打包依赖的jar。这实际上并不包括它创建的jar中的fx:resources jar,就像magic eclipse“将所需库打包到生成的jar中”所做的那样:

<fx:jar destfile="${dist}/${dist.jar}"> 
        <fx:application id="BlahTesterApp" 
            mainClass="blah.MainClass" 
            toolkit="swing"/> 

        <fileset dir="${build}"/> 

        <fx:resources> 
            <fx:fileset dir="${lib}" includes="**/*.jar" />
        </fx:resources>

        <manifest> 
            <attribute name="Implementation-Vendor" value="My Team"/>
            <attribute name="Implementation-Title" value="Tester App"/> 
        </manifest> 
    </fx:jar> 

而且似乎只能创建我不想要的“本机捆绑包”。我不想让用户在过去只能运行该死的jar时安装rpm或deb


我不明白为什么Oracle必须在这里引入自己神奇的额外部署复杂性层。他们不希望人们使用JavaFX吗?

更新,2019年12月

随着时间的推移,这个问题的答案似乎在不断演变和变化(而且看起来它还会继续这样做)。我的建议是在上查看文档,以查看打包JavaFX应用程序的最新最佳实践

我尝试使用JavaFX ant任务,但我无法让任务实际打包依赖的JAR。。。而且似乎只能创建我不想要的“本机捆绑包”

openjfx.io目前建议为JavaFX应用程序创建一个跨平台jar,其中包括依赖项和跨平台JavaFX库,建议使用不同的构建工具(例如Maven或Gradle,而不是Ant)

使用这些构建工具(例如)的功能将依赖jar与代码打包到uber jar中

执行此操作时,如果希望生成的jar具有跨平台能力,例如在Windows+Mac+Linux上工作,则需要将所有跨平台jar作为依赖项打包到uber jar中(为您的项目使用适当的JavaFX版本)


...
org.openjfx
(链接到打包项目wiki页面)

拟议项目的存在是因为:

为了满足这些需求,Oracle的JDK 8发布了一个名为javapackager的打包工具。然而,作为JavaFX删除的一部分,它被从Oracle的JDK11中删除

注意,由于上面概述的更新,在Java14发布之前,下面提到的一些打包建议(如javafxpackager)只适用于现在已经过时的旧Java发行版(8-10)

另外,关于不包含Java平台库的建议已经过时。从OracleJava8到OracleJava10,JavaFX包含在基本JRE(Java运行时环境)中。从Java11开始,JavaFX不包括在基本JRE中,事实上,平台库必须单独添加到Java模块路径中。再次回顾一下JavaFX应用程序的打包选项


过期信息:

JavaFX包装替代方案

  • 遵循使用Eclipse为JavaFX应用程序创建可执行jar文件的步骤
  • Oracle java packaging ant任务和javafxpackager工具可以创建可执行JAR(在Oracle文档中描述为)。如果您不能使用这些工具生成这样的jar,那么您可能没有正确使用这些工具
  • 需要Java 8的最低版本,其中jfxrt.jar(即JavaFX类)位于引导类路径上
  • 使用第三方构建工具链,如或
  • 由于您使用的是Eclipse,建议您使用备选方案(1)e(fx)clipse打包

    建议


    不要试图在应用程序中包含Java平台库(如jfxrt.jar)。你在互联网上找到的任何指南都不应该指导你做这样的事情(因为你在问题中概述的次要版本问题之间明显不兼容)。此规则的唯一例外是,如果您正在构建一个独立的、本机安装的应用程序,该应用程序不依赖预安装的JRE(您不依赖预安装的JRE).

    无耻的自我提升:您可以使用创建自解压的可运行jar来为您处理本机库部署。这对跨版本jfxrt.jar问题没有帮助。您可以使用它来部署特定于平台的jar以及本机jar。其他人将其用于JavaFX部署。不过由你决定!我很理解你的沮丧。他们添加Fx,删除Fx,再次添加,然后将其发送给gluon(对该公司没有仇恨),现在我需要下载东西,使用e(Fx)clipse)某种ant构建文件n S%#t。还有模块,还有。。。是啊,我不记得所有的东西了。以前在eclipse中只是导出->运行Jar,BOM工作正常。现在这是一场噩梦-我无法在IntelliJ中制作jar,因为有外部jar。但4很容易解决问题。谢谢
    <dependencies>
        ...
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-graphics</artifactId>
            <version>13</version>
            <classifier>win</classifier>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-graphics</artifactId>
            <version>13</version>
            <classifier>linux</classifier>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-graphics</artifactId>
            <version>13</version>
            <classifier>mac</classifier>
        </dependency>
    </dependencies>