web-dev-qa-db-ja.com

Java11 / JavaFXおよびMavenはNetBeans IDE 9の外部で実行されません

JavaFXデプロイメントライブラリがアクティブなJDKに見つかりません

JoséPereda Mavenアプローチを使用し、NetBeansでうまく機能しますが、「Java -jar mavenproject1-1.0-SNAPSHOT-jar-with-dependencies.jar」で外部で実行しようとすると、次のエラーが表示されます
「エラー:JavaFXランタイムコンポーネントが見つからないため、このアプリケーションを実行する必要があります」
「md.mavenproject1.MainApp」は、これを理解しようと試みている間は単なる一時的な名前です。
私のpomファイルは次のようになります。

<?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>md</groupId>
    <artifactId>mavenproject1</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>mavenproject1</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <mainClass>md.mavenproject1.MainApp</mainClass>
    </properties>

    <organization>
        <!-- Used as the 'Vendor' for JNLP generation -->
        <name>Your Organisation</name>
    </organization>

    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>11-ea+25</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>11-ea+25</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.7.0</version>
                <configuration>
                    <release>11</release>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.ow2.asm</groupId>
                        <artifactId>asm</artifactId>
                        <version>6.1.1</version>
                        <!--  Use newer version of ASM  -->
                    </dependency>
                </dependencies>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>Java</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <mainClass>md.mavenproject1.MainApp</mainClass>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-Assembly-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>md.mavenproject1.MainApp</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin> 
        </plugins>
    </build>
</project>

そして、私のnbactions.xmlファイルは次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<actions>
        <action>
            <actionName>run</actionName>
            <goals>
                <goal>clean</goal>
                <goal>package</goal>
                <goal>org.codehaus.mojo:exec-maven-plugin:1.2.1:Java</goal>
            </goals>
            <properties>
                <runfx.args>-jar "${project.build.directory}/${project.build.finalName}.jar"</runfx.args>
            </properties>
        </action>
        <action>
            <actionName>debug</actionName>
            <goals>
                <goal>clean</goal>
                <goal>package</goal>
                <goal>org.codehaus.mojo:exec-maven-plugin:1.2.1:Java</goal>
            </goals>
            <properties>
                <runfx.args>-Xdebug -Xrunjdwp:transport=dt_socket,server=n,address=${jpda.address} -Dglass.disableGrab=true -jar "${project.build.directory}/${project.build.finalName}.jar"</runfx.args>
                <jpda.listen>true</jpda.listen>
            </properties>
        </action>        
    </actions>

JavaFXの変更に伴い、高校のプログラミングの子供をantからmavenに切り替えることを考えているので、あなたが私に与えることができる助けは非常に助けになりますが、彼らはそこにプログラムを持ち帰って使いたいと思うでしょう。システムでOpenJDK 11を実行しています。
**編集**
プログラムを実行する行を次のように変更しました。

Java --module-path c:\javafx-sdk-11\lib --add-modules javafx.controls -jar mavenproject1-1.0-SNAPSHOT-jar-with-dependencies.jar

そして今、私は得る:

Exception in Application start method
Java.lang.reflect.InvocationTargetException
        at Java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at Java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)
        at Java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
        at Java.base/Java.lang.reflect.Method.invoke(Method.Java:566)
        at javafx.graphics/com.Sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.Java:464)
        at javafx.graphics/com.Sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.Java:363)
        at Java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at Java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)
        at Java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
        at Java.base/Java.lang.reflect.Method.invoke(Method.Java:566)
        at Java.base/Sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.Java:1051)
Caused by: Java.lang.RuntimeException: Exception in Application start method
        at javafx.graphics/com.Sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.Java:900)
        at javafx.graphics/com.Sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.Java:195)
        at Java.base/Java.lang.Thread.run(Thread.Java:834)
Caused by: Java.lang.IllegalAccessError: class com.Sun.javafx.fxml.FXMLLoaderHelper (in unnamed module @0x11a24f71) cannot access class com.Sun.javafx.util.Utils (in module javafx.graphics) because module javafx.graphics does not export com.Sun.javafx.util to unnamed module @0x11a24f71
        at com.Sun.javafx.fxml.FXMLLoaderHelper.<clinit>(FXMLLoaderHelper.Java:38)
        at javafx.fxml.FXMLLoader.<clinit>(FXMLLoader.Java:2056)
        at md.test33.MainApp.start(MainApp.Java:15)
        at javafx.graphics/com.Sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.Java:846)
        at javafx.graphics/com.Sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.Java:455)
        at javafx.graphics/com.Sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.Java:428)
        at Java.base/Java.security.AccessController.doPrivileged(Native Method)
        at javafx.graphics/com.Sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.Java:427)
        at javafx.graphics/com.Sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.Java:96)
        at javafx.graphics/com.Sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at javafx.graphics/com.Sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.Java:174)
        ... 1 more
Exception running application md.mavenproject1.MainApp

しかし、ローカルjdkを使用する必要がないMavenの依存関係を使用します。誰でもできる助けは本当に役立つでしょう。依存関係を取り出し、Or​​acle Java 10 jdkプログラムを使用し、netbeansの外部で実行しますが、Java 11で実行します。内部でのみ実行します。

**編集**

 <plugin>
                <artifactId>maven-Assembly-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>md.mavenproject1.MainApp</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin> 

代わりに次を使用します:

  <!--  Used to make dependencys needed to run the program -->  
            <plugin>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                            <overWriteReleases>false</overWriteReleases>
                            <overWriteSnapshots>false</overWriteSnapshots>
                            <overWriteIfNewer>true</overWriteIfNewer>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <!-- makes the JAR file to run the program outside -->
            <plugin>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.1.0</version>
                <configuration>           
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>${mainClass}</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>

これで、ダウンロードしたSDKを使用する代わりに、追加したJavaFXライブラリを使用するように起動ラインを変更できました。

Java --module-path lib --add-modules javafx.controls --add-exports=javafx.graphics/com.Sun.javafx.util=ALL-UNNAMED --add-exports=javafx.base/com.Sun.javafx.reflect=ALL-UNNAMED --add-exports=javafx.base/com.Sun.javafx.beans=ALL-UNNAMED --add-exports=javafx.graphics/com.Sun.glass.utils=ALL-UNNAMED --add-exports=javafx.graphics/com.Sun.javafx.tk=ALL-UNNAMED -jar mavenproject1-1.0-SNAPSHOT.jar

ローカルのものを使用する代わりに、jreを含めるようにします。誰かがそれがどのように素晴らしいだろうか考えているなら。

14
Mathew Dusome

これを修正する1つの方法は、次の引数をコマンドラインに追加することです

--add-exports=javafx.graphics/com.Sun.javafx.util=ALL-UNNAMED
16
Naman

IntelliJ IDEA openjdk 11およびopenjfx 11でデフォルトのhello world javafxプロジェクトを実行すると、同様の問題が発生します。回避策は、提供されたCLIをプロジェクト構成で使用することです。

enter image description here

ただし、この場合、ソリューションは適切な構成修正ではなく、一種のハッキングです。私の問題は、module-info.Java適切な初期化Javaプラットフォームモジュール。したがって、IntelliJモジュールは実際にはunnamed moduleです。適切なモジュール記述子を作成した後プロジェクトはもう名前のないプラットフォームモジュールではありません。

私が手に入れた次の問題は、外部Javaプラットフォームモジュールをjarファイルとして使用することに関連しています(具体的にはopenjfx libs)。これはプロジェクト構造設定のライブラリ

enter image description here

そして、追加のCLI引数なしで動作します。

1
domino