0

JavaFX が稼働しているマルチモジュールの Maven プロジェクトがあります。Maven アセンブリを介して実行可能なすべてのクラスを含む jar ファイルを作成できるので、パッケージ化されたバンドルが機能することがわかります。便宜上、 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 は実行されますが、実行可能ファイルは次の 2 つのメッセージで正しく起動しません。

OpenPatricianDisplay-0.5.0-SNAPSHOT メイン クラスが指定されていません
OpenPatricianDisplay-0.5.0-SNAPSHOT JVM の起動に失敗しました

Windows と Linux バンドルの cfg ファイルを見ると、それらが異なっていることがわかります。Linux のものを Windows のものに置き換えると、別のエラーが作成されます。だから、違うということが原因ではないと思います。Linux でプラグインを使用して単一モジュールの JavaFX デモ アプリを作成すると機能します。それが Maven プラグインなのか、基礎となるパッケージャーなのかを判断するために、次のAnt の例を試しました。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: パックするファイルセットを少なくとも 1 つ指定する必要があります。

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 ビルドで問題にアプローチする方法、または b) maven プラグインを実行するときに問題になる可能性があるものについての洞察がさらに良いです。

環境: Linux Mint 17.2 KDE

  • JDK1.8.0_60
  • アリ 1.9.3
  • Maven 3.0.5
  • javafx-maven-plugin 8.1.4
4

1 に答える 1