私は次のプログラムを持っています:
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を使用しています。
このバグチケット から、--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と一貫して動作できるようにすることに関係しています。
使用する -target
&-source
代わりに:
-target 11 -source 11
InetlliJ Ideaを使用している場合は、次の設定を行います。[ファイル]メニュー-> [設定]-> [ビルド、実行、デプロイメント]-> [Javaコンパイラ]に移動し、JDKバージョンを選択します。空の場合もあるため、Java [11を使用する場合]のようなバージョンを保存してから、プログラムをコンパイルして実行します。
[ファイル]メニュー-> [設定]-> [ビルド、実行、デプロイメント]-> [Javaコンパイラ]に移動し、JDKのバージョンを選択します。 (JDK 11よりも高いことを確認してください)