Linux可执行文件使用javafx-maven-plugin失败

时间:2015-09-26 08:50:29

标签: linux maven javafx packager

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

创建本机包/可执行文件
MyNode mn = new MyNode(5);
Node n = mn;            // A raw type - compiler throws an unchecked warning
n.setData("Hello");     
Integer x = mn.data;    // Causes a ClassCastException to be thrown.

这在Windows上工作正常,创建一个可以运行的exe文件。无论如何在Linux上执行相同的操作,Maven都会运行,但可执行文件无法正确启动这两条消息:

  

OpenPatricianDisplay-0.5.0-SNAPSHOT没有指定的主类
  OpenPatricianDisplay-0.5.0-SNAPSHOT无法启动JVM

看一下Windows和Linux软件包的cfg文件,可以看出它们是不同的。使用Windows中的Linux替换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

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

因此看起来Java 1.8.0_60的示例并不是最新的。与示例中的build.xml唯一不同的是JAVA_HOME的路径。

有没有人知道: a)如何使用ant构建来解决问题,以证明/反驳打包器是问题所在 b)更好地了解运行maven插件时可能出现的问题。

环境: Linux Mint 17.2 KDE

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

1 个答案:

答案 0 :(得分:1)

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

<fx: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: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>

特别是<manifest><fx:fileset>。有了这个,我就可以将演示应用程序创建为可执行的本机包。

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