web-dev-qa-db-ja.com

システムモジュールからのパッケージのエクスポートは、-releaseでは許可されていません

私は次のプログラムを持っています:

module-info.Java

module a {
}

Main.Java

public class Main {
    public static void main(String[] args) {
        System.out.println(Sun.nio.ByteBuffered.class);
    }
}

このプログラムは、--add-exportsオプションを使用して正常にコンパイルされます。

> javac --add-exports Java.base/Sun.nio=a module-info.Java Main.Java

ただし、--release引数を追加すると、失敗します。

> javac --add-exports Java.base/Sun.nio=a --release 9 module-info.Java Main.Java
error: exporting a package from system module Java.base is not allowed with --release
1 error

基本的に、これら2つのコマンドは同等です。では、なぜ後者は禁止されているのでしょうか。

また、IDEAは--release引数をjavacに渡すため、プロジェクトで内部APIが必要な場合、IDEAでの開発は不可能になります。

JDK 9 +178を使用しています。

11
ZhekaKozlov

このバグチケット から、--release--add-exports--add-reads、および--patch-moduleと組み合わせて使用​​することはできないようです。

リンクから:

ここでの全体的な提案は、次のようなコマンドの動作が異なる可能性があるという犠牲を払っても、make --release9をJDK9と(予想される)JDK10の間で一貫して機能させることです。
$ <jdk9>/javac Test.Java
$ <jdk9>/javac --release 9 Test.Java

また:

--release-の目的を考えると、これは許容できるはずです。特定のJDKリリースでサポートされているAPIを使用してコードをコンパイルできます。

特に提案は次のとおりです。

[編集]

--release(任意のバージョン)と組み合わせたシステムモジュールの--add-exports、-add-reads、および--patch-moduleの使用を防止します

ここ は以下を含むファイル差分です:

システムモジュール{0}からのパッケージのエクスポートは--releaseでは許可されていません

理論的根拠についてコメントすることはできませんが、上記の引用から、JDK9がJDK10と一貫して動作できるようにすることに関係しています。

3
Michael Easter

使用する -target-source代わりに:

-target 11 -source 11
3
William Lam

IntelliJアイデアを使用している場合は、Javaコンパイラ設定を確認してみてください:

[ファイル]メニュー-> [設定]-> [ビルド、実行、デプロイ]-> [Javaコンパイラ]に移動し、[プロジェクトのバイトコードバージョン]の設定を確認します。この値がまだバージョン9に設定されているときにJDK11を使用すると、同様のエラー(「システムモジュールJava.datatransferからのパッケージのエクスポートは--releaseでは許可されません」)が発生しました。11に設定すると問題が修正されました。

Screenshot

3
xoric

InetlliJ Ideaを使用している場合は、次の設定を行います。[ファイル]メニュー-> [設定]-> [ビルド、実行、デプロイメント]-> [Javaコンパイラ]に移動し、JDKバージョンを選択します。空の場合もあるため、Java [11を使用する場合]のようなバージョンを保存してから、プログラムをコンパイルして実行します。

0

[ファイル]メニュー-> [設定]-> [ビルド、実行、デプロイメント]-> [Javaコンパイラ]に移動し、JDKのバージョンを選択します。 (JDK 11よりも高いことを確認してください)

下の画像を参照

0
Sabbir Ahmed