【问题标题】:Linux executable fails using javafx-maven-pluginLinux 可执行文件使用 javafx-maven-plugin 失败
【发布时间】:2015-09-26 08:50:29
【问题描述】:

我有一个运行 JavaFX 的多模块 maven 项目。我可以创建一个 jar 文件,其中包含可通过 maven 程序集执行的所有类,因此我知道打包的捆绑包可以工作。 为方便起见,我想使用 javafx-maven-plugin 创建一个本机包/可执行文件

<profile>
    <id>build-installer</id>
    <properties>
    <native.output.dir>${project.build.directory}/jfx/native/${project.build.finalName}</native.output.dir>
    <native.output.dir.app>${native.output.dir}/app</native.output.dir.app>
    <native.output.dir.security>${native.output.dir}/runtime/jre/lib/security</native.output.dir.security>
    <native.app.jar>${native.output.dir.app}/${project.build.finalName}-jfx.jar</native.app.jar>
    </properties>
    <dependencies>
    <dependency>
        <groupId>ch.sahits.game</groupId>
        <artifactId>OpenPatricianDisplay</artifactId>
        <version>${project.version}</version>
    </dependency>
    </dependencies>
    <build>

    <plugins>

        <plugin>
        <groupId>com.zenjava</groupId>
        <artifactId>javafx-maven-plugin</artifactId>
        <version>8.1.2</version>
        <configuration>
            <mainClass>ch.sahits.game.OpenPatrician</mainClass>
            <verbose>true</verbose>
        </configuration>
        <executions>
            <execution>
            <phase>package</phase>
            <goals>
                <goal>native</goal>
            </goals>
            </execution>
        </executions>
        </plugin>
        <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>1.7</version>
        <executions>
            <execution>
            <id>create zip archive</id>
            <phase>install</phase>
            <goals>
                <goal>run</goal>
            </goals>
            <configuration>
                <target>

                <echo>Creating self-contained zip</echo>
                <zip destfile="${project.build.directory}/OpenPatrician-${project.version}.zip" basedir="${native.output.dir}" />

                </target>
            </configuration>
            </execution>
        </executions>
        </plugin>

    </plugins>
    </build>

</profile>

这在 Windows 上运行良好,创建一个可以运行的 exe 文件。但是在 Linux 上执行相同的操作,Maven 运行,但可执行文件无法正常启动,并显示以下两条消息:

OpenPatricianDisplay-0.5.0-SNAPSHOT 未指定主类
OpenPatricianDisplay-0.5.0-SNAPSHOT 无法启动 JVM

查看 Windows 和 Linux 捆绑包的 cfg 文件表明它们是不同的。当用 Windows 替换 Linux 时,会产生不同的错误。所以我不认为他们不同的事实是原因。 在 Linux 上使用插件创建单个模块 JavaFX 演示应用程序是可行的。为了弄清楚它是 Maven 插件还是底层打包器,我尝试了以下Ant examples。 Hello World 示例运行良好(第 10.4.1 章),但是在尝试使用外部 jar 文件(第 10.4.3 章)的示例时,即使构建失败:

构建失败
/home/andi/eclipse/intellij/jdk1.8.0_60/demo/javafx_samples/src/Ensemble8/build.xml:34:您必须指定至少一个要打包的文件集。

build.xml

<?xml version="1.0" encoding="UTF-8" ?>

<project name="Ensemble8 JavaFX Demo Application" default="default" basedir="."
  xmlns:fx="javafx:com.sun.javafx.tools.ant">

  <property name="JAVA_HOME" value="/usr/lib/jvm/java-8-oracle"/>

  <path id="CLASSPATH">
    <pathelement location="lib/lucene-core-3.2.0.jar"/>
    <pathelement location="lib/lucene-grouping-3.2.0.jar"/>
    <pathelement path="classes"/>
  </path>

  <property name="build.src.dir" value="src"/>
  <property name="build.classes.dir" value="classes"/>
  <property name="build.dist.dir" value="dist"/>

  <target name="default" depends="clean,compile">

    <taskdef resource="com/sun/javafx/tools/ant/antlib.xml"
      uri="javafx:com.sun.javafx.tools.ant"
      classpath="${JAVA_HOME}/lib/ant-javafx.jar"/>

      <fx:application id="ensemble8"
        name="Ensemble8"
        mainClass="ensemble.EnsembleApp"/>

      <fx:resources id="appRes">
    <fx:fileset dir="${build.dist.dir}" includes="ensemble8.jar"/>
        <fx:fileset dir="lib"/>
        <fx:fileset dir="${build.classes.dir}"/>
      </fx:resources>

      <fx:jar destfile="${build.dist.dir}/ensemble8.jar">
        <fx:application refid="ensemble8"/>
        <fx:resources refid="appRes"/>
      </fx:jar>

      <fx:deploy outdir="." embedJNLP="true"
        outfile="ensemble8"
        nativeBundles="all">

        <fx:application refId="ensemble8"/>

        <fx:resources refid="appRes"/>

        <fx:info title="Ensemble8 JavaFX Demo Application"
          vendor="Oracle Corporation"/>

      </fx:deploy>

  </target>

  <target name="clean">
    <mkdir dir="${build.classes.dir}"/>
    <mkdir dir="${build.dist.dir}"/>

    <delete>
      <fileset dir="${build.classes.dir}" includes="**/*"/>
      <fileset dir="${build.dist.dir}" includes="**/*"/>
    </delete>

  </target>

  <target name="compile" depends="clean">

    <javac includeantruntime="false"
      srcdir="${build.src.dir}"
      destdir="${build.classes.dir}"
      fork="yes"
      executable="${JAVA_HOME}/bin/javac"
      source="1.8"
      debug="on"
      classpathref="CLASSPATH">
    </javac>

    <!-- Copy resources to build.classes.dir -->

      <copy todir="${build.classes.dir}">
        <fileset dir="src/app/resources"/>
        <fileset dir="src/generated/resources"/>
        <fileset dir="src/samples/resources"/>
      </copy>

  </target>

</project>

所以看起来这些示例不是最新的 Java 1.8.0_60。与示例中的 build.xml 的唯一区别是 JAVA_HOME 的路径。

有没有人知道: a)如何处理 ant build 的问题以证明/反驳打包程序是问题或 b) 更好地了解运行 maven 插件时可能出现的问题。

环境: Linux Mint 17.2 KDE

  • JDK 1.8.0_60
  • 蚂蚁 1.9.3
  • Maven 3.0.5
  • javafx-maven-plugin 8.1.4

【问题讨论】:

  • 你为什么使用maven-antrun-plugin?使用javafx-maven-plugin 的全部目的是避免使用 ant 或对 ant 文件有任何依赖。我有一个small project,为此我使用 maven 插件在 Windows、Ubuntu 和 Mac 上创建了包,没有任何问题。
  • 您也不需要将 &lt;execution&gt; 配置传递给插件,除非您希望它成为 maven 生命周期的一部分。由于原生构建需要一些时间,因此更好、更简洁的方法是在需要时从命令行触发 mvn jfx:native
  • 我确实打算使用 javafx-maven-plugin,但是由于它目前无法在 Linux 上运行,我尝试了使用 ant 的方法(根本不打扰 maven),看看它是否是一个问题使用打包程序或 ma​​ven 插件。
  • 可以添加环境细节吗?
  • 我刚刚在 Linux Mint 17.2 上交叉检查了插件,一切正常。已创建 debian 包,双击它即可工作。你可能想克隆我的项目并在你的机器上运行mvn jfx:native

标签: linux maven javafx packager


【解决方案1】:

这至少是对 ant 构建问题的部分回答。事实证明documentation 已经过时了,但我在查看Ant task definition 时发现了这一点。

&lt;fx:jar&gt; 元素需要更多的子元素才能工作:

  <fx:application id="ensemble8"
    name="Ensemble8"
    mainClass="ensemble.EnsembleApp"/>

  <fx:resources id="appRes">
    <fx:fileset dir="${build.dist.dir}" includes="ensemble8.jar"/>
    <fx:fileset dir="lib"/>
    <fx:fileset dir="${build.classes.dir}"/>
  </fx:resources>

  <fx:jar destfile="${build.dist.dir}/ensemble8.jar">
    <fx:application refid="ensemble8"/>
    <fx:resources refid="appRes"/>
    <fx:fileset dir="${build.classes.dir}"/>
 <!-- Customize jar manifest (optional) -->
<manifest>
    <attribute name="Implementation-Vendor" value="Samples Team"/>
    <attribute name="Implementation-Version" value="1.0"/>
<attribute name="Main-Class" value="ensemble.EnsembleApp" />
</manifest>
</fx:jar>

尤其是&lt;manifest&gt;&lt;fx:fileset&gt;。有了它,我可以将演示应用程序创建为可执行的本机包。

编辑:javafx-maven-plugin 的原始问题原来是打包程序本身和配置文件查找中的问题。更新到版本8.1.5 并在&lt;configuration&gt; 中添加&lt;bundler&gt;linux.app&lt;/bundler&gt; 是一种解决方法,直到issue 在JDK 中修复。-

【讨论】:

  • 仅针对其他读者,发现此 SO 问题:oracle 打包程序中的问题/错误从 Java 1.8.0 更新 40 开始,仍未修复(今天:2015 年 11 月 22 日)。另一个问题来自Java 1.8.0 update 60,可以设置自定义JRE-runtime,但是存在bug when writing the CFG-file
猜你喜欢
  • 2018-10-19
  • 2020-01-26
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
  • 2011-03-29
  • 1970-01-01
  • 2022-12-03
相关资源
最近更新 更多