2017-03-01 57 views
8

JDK9開発実験用にIDEA-EAPを使用しています。java.baseモジュールからパッケージをエクスポートできません。

Error:(3, 20) java: package jdk.internal.misc is not visible 
(package jdk.internal.misc is declared in module java.base, which does 
not export it to module com.jigsaw.npe) 

クラス定義がようである - - 私が使用して作成したモジュール内にもmodule-info.javaファイルを含めて試してみた

package experiment; 
import jdk.internal.misc.Unsafe; 

public class CompareAndSwap { 

    static Unsafe UNSAFE = Unsafe.getUnsafe(); 
    ... 
} 

私は、次のエラーを取得しています次のステートメントを持つIDE -

module com.jigsaw.npe { 
    requires java.base; 
} 

のディレクトリ構造について絵に描かれているように見えます -

Directory Structure

IDEはしかし、未使用のようmodule-info.javaを反映し、おそらくこれは私が上記の試したようmodule com.jigsaw.npeを定義することはできませんしていた理由です。

module-info.javaや私が見逃したもの以外のものを正しく配置する方法については、いくつかの助けが必要です。

+0

@StefanZobelコマンドには正確に何が行われていますか、それに前提条件はありますか? – nullpointer

+3

セットアップはまったく問題ありません。これはIntelliJとは関係ありません。その部分を削除するために質問(およびタグ)を編集することをお勧めします。 – Nicolai

答えて

11

Nicolai's answerは、java.baseモジュールまたは他のモジュールからエクスポートされていないパッケージをエクスポートするのに必要な技術に関しては正しいです。

しかし、目的がUnsafeの場合は、jdk.unsupportedモジュールでエクスポートされたsun.misc.Unsafeを使用します。名前のないモジュールのコードをコンパイルする場合は、モジュールにアクセスするための特別な操作は必要ありません。あなたはモジュールのコードをコンパイルしている場合は、あなたのmodule-info.javaファイルに

requires jdk.unsupported; 

を追加する必要があります。 Unsafejdk.unsupportedであるにもかかわらず

import sun.misc.Unsafe; 

... 

Field theUnsafeField = Unsafe.class.getDeclaredField("theUnsafe"); 
theUnsafeField.setAccessible(true); 
Unsafe theUnsafe = (Unsafe)theUnsafeField.get(null); 

:あなたは以前のJDKリリースでなければならなかったのと同じであるフィールドへのアクセスを得るために反射setAccessible技術を、しなければならないUnsafe使用するには

このテクニックは、JEP 260に従って、JDK 9でサポートされています。

8

モジュールjava.baseはしていませんexportパッケージjdk.internal.misc.を、そのタイプjdk.internal.misc.Unsafeaccessibleではありません - 結果のコンパイルが失敗したとして。

あなたはそれは、次のコマンドラインオプションを追加することにより、パッケージをエクスポートすることができます:あなたは(java)のコードを実行している場合(javacをコンパイルするときにそれを行う必要があります

# if you want to access it from com.jigsaw.npe only: 
--add-exports java.base/jdk.internal.misc=com.jigsaw.npe 
# if you want to access from all code: 
--add-exports java.base/jdk.internal.misc=ALL-UNNAMED 

+0

'--add-exports'はもう存在しません – madduci

+1

はい、そうです。 'java -X'を呼び出して見てください:' --add-exports / = (、)* ' – Nicolai

+0

yesはコマンドラインのオプションとして存在しますが、 --add-exportsでjavaオプションを設定すると、それがわからないコマンドライン引数 – madduci

関連する問題