IntelliJはOpenJDK11でJavaFX11を認識できません


82

IntellJにJavaFXパッケージを認識させるのに問題があります。OpenJDK 11を使用する新しいJavaFXプロジェクトでは、プロジェクトをビルドしようとすると、IntelliJはJavaFXパッケージを認識できません。

openjfx:javafx-base-11Mavenリポジトリからインポートしました。

私は他の質問を見てきましたが、解決策は、バイトコードが正しいレベルにあること(私のもの)から、プロジェクトの言語が正しいこと(私のもの)までさまざまです。

誰かアイデアはありますか?

写真1

写真2

写真3

編集:

エラー:

ここに画像の説明を入力してください


ターミナルからコンパイルして実行してみてください。
溺死

あなたはあなたの中にそのモジュールを要求する必要があるでしょうmodule-info.java
Jacob G.

このアーティファクトが必要だと思います:mvnrepository.com/artifact/org.openjfx/javafx/11ベースのものには私が推測するすべてが含まれているわけではありません。
Jorn Vernee 2018

@JornVerneeを試してみると、エラーが発生します。それでOPを編集しました。
alwaysNeedingHelp 2018

1
それはおそらく間違っていたとあなたに言った人は誰でも。あなたは、作成する必要がありmodule-info.java、あなたのソースフォルダ内のファイルを、明示的に使用しているという方JavaFXのモジュールが必要になりますrequires javafx.controls;requires javafx.graphics;など
ジェイコブG.

回答:


128

コメントで述べたように、スターティングガイドはJava11とJavaFX11から始める場所です。

Java 11の前と同じように機能するための鍵は、次のことを理解することです。

  • JavaFX11はJDKの一部ではなくなりました
  • SDKまたは通常の依存関係(maven / gradle)として、さまざまなフレーバーで入手できます。
  • プロジェクトがモジュール式でない場合でも、プロジェクトのモジュールパスに含める必要があります。

JavaFXプロジェクト

IntelliJ(MavenまたはGradleなし)で通常のJavaFXデフォルトプロジェクトを作成する場合は、ここからSDKをダウンロードすることをお勧めします。jmodもありますが、非モジュラープロジェクトの場合はSDKが推奨されます。

デフォルトのプロジェクトを実行する簡単な手順は次のとおりです。

  1. JavaFXプロジェクトを作成する
  2. JDK 11を設定します(ローカルのJava 11バージョンをポイントします)
  3. JavaFX 11SDKをライブラリとして追加します。URLはのようになります/Users/<user>/Downloads/javafx-sdk-11/lib/。これを行うと、JavaFXクラスがエディターで認識されるようになります。

JavaFX11プロジェクト

  1. デフォルトのプロジェクトを実行する前に、VMオプションにこれらを追加する必要があります。

    --module-path /Users/<user>/Downloads/javafx-sdk-11/lib --add-modules=javafx.controls,javafx.fxml

  2. 実行

Maven

Mavenを使用してプロジェクトをビルドする場合は、次の手順に従ってください。

  1. JavaFXアーキタイプでMavenプロジェクトを作成する
  2. JDK 11を設定します(ローカルのJava 11バージョンをポイントします)
  3. JavaFX11の依存関係を追加します。

    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>11</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>11</version>
        </dependency>
    </dependencies>
    

これを行うと、JavaFXクラスがエディターで認識されるようになります。

JavaFX 11Mavenプロジェクト

Mavenが必要な依存関係を管理していることに気付くでしょう。javafx.controlsにjavafx.baseとjavafx.graphicsが追加されますが、最も重要なのは、必要な依存関係が追加されることです。 れますプラットフォームに基づい分類子れることです。私の場合、Macです。

これがあなたの瓶org.openjfx:javafx-controls:11ですべてのクラスとネイティブ実装を含む3つの可能な分類子(Windows、Linux、およびMacプラットフォーム)があるためです。

それでも.m2リポジトリに移動し、そこから依存関係を手動で取得する場合は、適切なものを選択してください(たとえば.m2/repository/org/openjfx/javafx-controls/11/javafx-controls-11-mac.jar

  1. デフォルトのMavenプラグインをここからのものに置き換えます。

  2. を実行するmvn compile javafx:runと、動作するはずです。

ここで詳細に説明されているように、Gradleプロジェクトでも同様に機能します

編集

前述のスタートガイドには、IntelliJの更新されたドキュメントとサンプルプロジェクトが含まれています


1
パスは次のようなものです。フォルダ/Users/<user>/Downloads/javafx-sdk-11/lib/に注意してlibください。それはすべてのJavaFXのjarファイルが含まれている必要があり
ホセ・ペリーダに

5
モジュールパスに問題がある場合は、Windowsでは次のように表示する必要があります。--module-path = "C:\ Path \ To \ Your \ JavaFX \ lib" --add-modules = javafx.controls、javafx .fxml、javafx.base、javafx.media、javafx.graphics、javafx.swing、javafx.web「=」とその周囲の引用符に注意してください。これは私にとってはうまくいきましたが、他のアプローチではうまくいきませんでした。さらに、-jar YourJar.jarパラメーターは、モジュールパスおよびadd-modulesオプションの後に来る必要があることに注意してください。
ジャラウ2018年

4
こんにちは@JoséPereda。私はしばらくの間このガイドに苦労してきましたが、あなたが書いたものを正確に実行したとしても、IntelliJにコードを実行させることはできません。「エラー:java:モジュールが見つかりません:javafx.fxml」などが表示されます。この問題を解決するのに役立つプライベートチャットをする機会はありますか?ありがとうございました。
Davide3i

1
@jalauありがとうございます!引用は実際にそれをしました、あなたは答えとしてこれを書くべきです。
1

2
私はGradleのためのサンプルプロジェクトのディストリビューションを構築し、それを実行すると、私はエラーメッセージが表示されます:「エラー:JavaFXのランタイムコンポーネントが不足している、そしてこのアプリケーションを実行するために必要とされる」
Trejkaz

9

JavaFXがJDK11の一部ではなくなったという問題。次の解決策はIntelliJを使用して機能します(NetBeansでは試していません)。

  1. JavaFXグローバルライブラリを依存関係として追加します。

    [設定]-> [プロジェクト構造]-> [モジュール]。モジュールで、[依存関係]タブに移動し、[+]記号の追加->ライブラリ-> Java->リストからJavaFXを選択し、[選択項目の追加]、[設定の適用]の順にクリックします。

  2. JavaFXプロジェクトのソースファイル(src)を右クリックし、新しいmodule-info.javaファイルを作成し ます。ファイル内に次のコードを記述します。

    module YourProjectName { 
        requires javafx.fxml;
        requires javafx.controls;
        requires javafx.graphics;
        opens sample;
    }
    

    これらの2つのステップは、JavaFXに関するすべての問題を解決します。

参照:LearnProgrammingチャンネルによって作成されたYouTubeチュートリアルがあり、上記のすべての詳細をわずか5分で説明します。また、問題を解決するために視聴することをお勧めします:https//www.youtube.com/watch?v = WtOgoomDewo


8

上記のどれも私にはうまくいきませんでした。発生した他のエラーをクリアするのに時間がかかりすぎました。これが最も簡単で最良の方法であることがわかりました。

これは、Jdk 11、12、およびOpenJdk12でJavaFxを取得する場合にも機能します。

  • ビデオは、JavaFxSdkのダウンロードを示しています
  • グローバルライブラリとして設定する方法
  • module-info.javaを設定します(私は一番下のものを好みます)

module thisIsTheNameOfYourProject {
    requires javafx.fxml;
    requires javafx.controls;
    requires javafx.graphics;
    opens sample;
}

全部で5分しかかかりませんでした!!!


2019.3にグローバルライブラリが移動したので設定してください。これが今どこにあるのか指摘できますか?
マイケル・S.

どうもありがとう!私のためにも働いた!!! 賛成!
ダニエルベーム

4

簡単な要約では、次のいずれかを実行できます。

  1. --module-pathおよびを介してJavaFXモジュールを含める--add-modulesホセの答えのように。

    または

  2. JavaFXライブラリをプロジェクトに追加したら(手動またはmaven / gradleインポートを介して)、module-info.javaこの回答で指定されているものと同様のファイルを追加します。(このソリューションはアプリをモジュール化するため、他のライブラリを使用する場合は、module-info.javaファイル内にモジュールを要求するステートメントも追加する必要があることに注意してください)。


この答えは、ホセの答えを補足するものです。

状況はこれです:

  1. 最近のJavaバージョン(13など)を使用しています。
  2. MavenプロジェクトとしてJavaFXアプリケーションがあります。
  3. Mavenプロジェクトでは、Joseの回答に従って、JavaFXプラグインが構成され、JavaFX依存関係が設定されています。
  4. Applicationを拡張するメインクラスのソースコードに移動し、それを右クリックして実行しようとします。
  5. あなたは、取得IllegalAccessErrorアプリを起動しようとすると、「無名のモジュール」を含みます。

IllegalAccessErrorIntellij IdeaからJavaFXアプリを実行しようとしたときに生成されるスタックトレースの抜粋:

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:567)
    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:567)
    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:830)
Caused by: java.lang.IllegalAccessError: class com.sun.javafx.fxml.FXMLLoaderHelper (in unnamed module @0x45069d0e) 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 @0x45069d0e
    at com.sun.javafx.fxml.FXMLLoaderHelper.<clinit>(FXMLLoaderHelper.java:38)
    at javafx.fxml.FXMLLoader.<clinit>(FXMLLoader.java:2056)
    at org.jewelsea.demo.javafx.springboot.Main.start(Main.java:13)
    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(AccessController.java:391)
    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)
Exception running application org.jewelsea.demo.javafx.springboot.Main

OK、今あなたはちょっと立ち往生していて、何が起こっているのか見当がつかない。

実際に起こったことはこれです:

  1. MavenはアプリケーションのJavaFX依存関係を正常にダウンロードしたため、依存関係を個別にダウンロードしたり、JavaFXSDKやモジュールディストリビューションなどをインストールしたりする必要はありません。
  2. Ideaはモジュールをプロジェクトへの依存関係として正常にインポートしたため、すべてが正常にコンパイルされ、すべてのコード補完とすべてが正常に機能します。

だから、すべてが大丈夫なはずです。ただし、アプリケーションを実行すると、リフレクションを使用してアプリケーションクラス(launchを呼び出すとき)とFXMLコントローラークラス(FXMLをロードするとき)のインスタンスをインスタンス化しようとすると、JavaFXモジュールのコードが失敗します。助けがなければ、この反射の使用は場合によっては失敗し、あいまいなものを生成する可能性がありますIllegalAccessErrorます。これは、明示的に許可しない限り、他のモジュールのコードがクラスでリフレクションを使用できないようにするJavaモジュールシステムのセキュリティ機能によるものです(JavaFXアプリケーションランチャーとFXMLLoaderはどちらも、機能するために現在の実装でリフレクションを必要とします)正しく)。

ここで、この質問に対する他のいくつかの回答(参照module-info.java)が登場します。

それでは、Javaモジュールのクラッシュコースを受講しましょう。

重要な部分はこれです:

4.9。開く

プライベートタイプの反映を許可する必要があるが、すべてのコードを公開したくない場合は、opensディレクティブを使用して特定のパッケージを公開できます。

ただし、これによりパッケージが全世界に開かれることを忘れないでください。それが必要なものであることを確認してください。

module my.module { opens com.my.package; }

したがって、パッケージを全世界に公開したくない場合は、次のことができます。

4.10。開く…へ

さて、リフレクションは時々素晴らしいですが、それでもカプセル化から得られる限りのセキュリティが必要です。この場合、opens…toディレクティブを使用して、事前に承認されたモジュールのリストに対してパッケージを選択的に開くことができます。

module my.module {com.my.packageをmoduleOne、moduleTwoなどに開きます。}

したがって、次のようなsrc / main / java /module-info.javaクラスを作成することになります。

module org.jewelsea.demo.javafx.springboot {
    requires javafx.fxml;
    requires javafx.controls;
    requires javafx.graphics;
    opens org.jewelsea.demo.javafx.springboot to javafx.graphics,javafx.fxml;
}

ここで、org.jewelsea.demo.javafx.springbootはJavaFXApplicationクラスとJavaFXControllerクラスを含むパッケージの名前です(これをアプリケーションに適したパッケージ名に置き換えてください)。これは中クラスのためにOKであることをJavaランタイムに指示javafx.graphicsし、javafx.fxmlあなたのクラスの呼び出し反射するorg.jewelsea.demo.javafx.springbootパッケージ。これが行われ、アプリケーションがコンパイルされて再実行IllegalAccessErrorされると、正常に動作し、JavaFXによるリフレクションの使用によって生成されたものは発生しなくなります。

しかし、module-info.javaファイルを作成したくない場合はどうでしょうか。

IDEの上部ツールバーにある[実行]ボタンを使用してアプリケーションクラスを直接実行する代わりに、次のようにします。

  1. IDEの横にあるMavenウィンドウに移動しました。
  2. javafxmavenプラグインターゲットを選択しましたjavafx.run
  3. それを右クリックして、Run Maven Buildまたはを選択しましたDebug...

その後、アプリはmodule-info.javaファイルなしで実行されます。これは、mavenプラグインが、module-info.javaファイルがなくてもアプリをJavaFXクラスに反映できるようにする何らかの設定を動的に含めることができるほどスマートであるためだと思いますが、これがどのように行われるかはわかりません。

その設定を上部のツールバーの[実行]ボタンに転送するには、javafx.runMavenターゲットを右クリックして、ターゲットのオプションを選択しますCreate Run/Debug Configuration。次に、上部のツールバーから[実行]を選択するだけで、Mavenターゲットを実行できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.