web-dev-qa-db-ja.com

Java 9:名前のないモジュールへのパッケージのエクスポートが失敗する

私はビルドしようとしています オープンソースプロジェクト に対してJava 9. 9.リフレクションを使用してアクセスする必要があるファイルがいくつかありますが、パッケージがエクスポートされていないためにアクセスできません引数--add-exportsを使用して、パッケージを名前のないモジュールにエクスポートします。

環境変数_Java_OPTIONSに次の引数を追加しました:

-Dsun.reflect.debugModuleAccessChecks=true 
--add-exports=javafx.graphics/com.Sun.javafx.scene.traversal=ALL-UNNAMED
--add-exports=javafx.controls/com.Sun.javafx.scene.control.behavior=ALL-UNNAMED

私は最新のJDK 9ビルドを使用しています(現在)。

C:\controlsfx>Java -version
Java version "9"
Java(TM) SE Runtime Environment (build 9+175)
Java HotSpot(TM) 64-Bit Server VM (build 9+175, mixed mode)

プロジェクトをビルドしようとしたときの出力は次のとおりです。

C:\controlsfx>.\gradlew :controlsfx:build
Picked up _Java_OPTIONS: -Dsun.reflect.debugModuleAccessChecks=true --add-exports=javafx.graphics/com.Sun.javafx.scene.traversal=ALL-UNNAMED --add-exports=javafx.controls/com.Sun.javafx.scene.control.behavior=ALL-UNNAMED
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
:controlsfx:compileJava
C:\controlsfx\controlsfx\src\main\Java\impl\org\controlsfx\behavior\SnapshotViewBehavior.Java:60: error: package com.Sun.javafx.scene.control.behavior is not visible
import com.Sun.javafx.scene.control.behavior.BehaviorBase;
                                   ^
  (package com.Sun.javafx.scene.control.behavior is declared in module javafx.controls, which does not export it to the unnamed module)

C:\controlsfx\src\main\Java\impl\org\controlsfx\ReflectionUtils.Java:3: error: package com.Sun.javafx.scene.traversal is not visible
import com.Sun.javafx.scene.traversal.ParentTraversalEngine;
                           ^
  (package com.Sun.javafx.scene.traversal is declared in module javafx.graphics, which does not export it to the unnamed module)

コンパイルはまだ失敗します。これは、何が間違っているのか不思議に思います。

13
ItachiUchiha

追加したフラグ(正しいフラグのようです)はコンパイラーには追加されず、Gradleを実行するプロセスに追加されるようです。そのことを示すメッセージが--illegal-access、これはJavaでのみ利用でき、javacでは利用できません。

Java 9を使用する場合、引数を適切な場所に取得するのが難しい場合があります。Gradleの場合 これが役立つ場合があります

8
Nicolai

(注:プロジェクトをコンパイルできませんでしたが、問題のエラーの一部(例:BehaviorBase)は次のようにクリーンアップされました。)

Jdk 9 b175と Gradle 4.1-milestone-1 を使用:

compileJava {
    options.encoding = "UTF-8"
    options.incremental = true

    options.compilerArgs.addAll([
        "--add-exports",
        "javafx.base/com.Sun.javafx.event=ALL-UNNAMED"
    ])  
    options.compilerArgs.addAll([
        "--add-exports",
        "javafx.controls/com.Sun.javafx.scene.control.behavior=ALL-UNNAMED"
    ])  
    options.compilerArgs.addAll([
        "--add-exports",
        "javafx.graphics/com.Sun.javafx.scene.traversal=ALL-UNNAMED"
    ])  
}

そして

sourceCompatibility = '9'
targetCompatibility = '9'
0
Michael Easter