問題タブ [java-platform-module-system]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - エクスポートされていないパラメーター型を含むメソッドを使用したインターフェース実装 (Java 9 モジュール)
Java 9 モジュール システムを使用しています。以下は、私の問題の簡略版です。
(モジュールで)実装するように(ClassA
モジュールで)定義しました。のメソッドを実装します。このメソッドは、型のパラメーターを受け取ります(モジュール内)。以下はコードです。com.foo
InterfaceB
com.bar
ClassA
print
InterfaceB
ClassC
com.baz
モジュールはcom.baz
何もエクスポートしません。そのため、とClassC
のコンパイル中にアクセスするには、フラグを使用します。InterfaceB
ClassA
--add-exports
InterfaceB
正常にコンパイルされますが、コンパイルしようとするClassA
と、次のエラーが表示されます。
コンパイラは何らかの形で の異なるインスタンスを使用していますClassC
か? で予期しないことが起こっているような気がし--add-exports
ます。
(補足として、私が使用している理由は--add-exports
、私の例でcom.baz
は、実際には内部 JDK パッケージであるためです。モジュール設定を変更してエクスポートすることはできません。)
java - Java 9 で InaccessibleObjectException (「{member} をアクセス可能にできません: モジュール {A} は {B} に対して {package} を開きません」) を解決する方法は?
この例外は、Java 9 でアプリケーションを実行しているときに、さまざまなシナリオで発生します。特定のライブラリとフレームワーク (Spring、Hibernate、JAXB) は、特に発生しやすい傾向があります。Javassist の例を次に示します。
メッセージには次のように書かれています。
保護された最終的な java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) を作成できないと、java.lang.ClassFormatError がアクセス可能になる: モジュール java.base名前のないモジュール @ 1941a8ff に対して「java.lang を開きません」
例外を回避し、プログラムを正常に実行するにはどうすればよいですか?
maven - 自動モジュールで分割パッケージを処理するにはどうすればよいですか?
現在、既存のアプリケーションをジグソー モジュールに移行するテストを行っています。私のモジュールの 1 つは、Groovy プラグインと共に ElasticSearch を使用します。
- org.elasticsearch:elasticsearch
- org.elasticsearch.module:lang-groovy
残念ながら、それらは分割パッケージを共有しているため、次のようになりmvn install
ます。
x は lang.groovy と elasticsearch の両方からパッケージ org.elasticsearch.script.groovy を読み取ります
記述子内の必要なモジュールごとに 1 回、x は各モジュールの名前です。
Java 9が最終版になるまでに、より新しいelasticsearchバージョンが分割パッケージを排除すると思いますが、通常、従来の依存関係で分割パッケージを処理する方法はありますか?
モジュールパスではなくクラスパスにそれらを配置できることを望んでいましたが、メーリングリストでこの会話を読んだ後、Mavenコンパイラにそうするように指示する方法がないようです.
maven 3.3.9 - maven-compiler-plugin 3.6.0 - jdk9-ea+149 - エラスティックサーチ 2.3.3
java - IntelliJ は Java9-ea の Java ライブラリを理解していません
jdk9-ea 149を使用しており、サンプルjavafx アプリケーションを作成しました
IntelliJ は Java ライブラリを認識しません。すべての import ステートメントが赤色で表示され、それらはすべてグレー表示されます。java.util.List、java.util.ArrayListでも同じ問題があります。
外部でフォームをコンパイルすることはできますが、IntelliJ 2016.3.2 Ultimate Editionからコードをコンパイルすることはできません。
IntelliJ プロジェクトにいくつかのライブラリを追加する必要があるようですが、java9 ビルド 149 ジグソーではその方法がわかりません。
私は実験的な機能を使用していますが、インポートステートメントを理解していません - 以下の intellij 設定を参照してください
IntelliJ バージョン: IntelliJ 2016.3.2 Ultimate Edition Java バージョン: Java 9-ea ビルド: 149
maven - クラスパスのジグソー テストの依存関係: 別の JAR のスーパークラスにアクセスできないのはなぜですか?
現在、jdk9-ea+147 と maven-compiler-plugin 3.6.0 を使用して、既存の Java 8 (Maven) プロジェクトを Java 9 / Jigsaw に移行するテストを行っています。
src
ディレクトリをモジュールに変換し、ディレクトリをtest
非モジュールのままにしました。
予期testCompile
しないエラーが発生しました:
エラー: ExtractedArtifactStoreBuilder の build() が、アクセスできないクラスまたはインターフェイスで定義されています
もちろん、両方ExtractedArtifactStoreBuilder
が公開されていることを確認しました。build()
(パブリック) スーパークラスおよびパブリックからも継承されます。このコードは、JDK 8 で正常にコンパイルおよび実行されます。
ExtractArtifactStoreBuilder
スーパークラスとは異なるサードパーティ JAR で定義されていますが、Maven は両方をクラスパスに正しく配置します。紛らわしいことに、スーパークラスのクラス名は同じです (ただし、別のパッケージに存在します)。
私が見る限り、テスト コードでパブリックに継承されたメソッドにアクセスできるはずです。これは jdk9 アーリー アクセス バージョンのバグですか?
編集:より理解しやすいように、関連する JAR とクラスを少し抽象化したものを次に示します。名前の混乱が少なく、重要でないものは省略されています (実際の依存関係については、以下を参照してください)。
プロセス.jar
mongo.jar
ソース/テスト/Java/ExampleTest
最小限のセットアップで動作を再現できました。
pom.xml(抜粋)
src/main/java/module-info.java
src/test/java/ExampleTest.java (抜粋)
java - Jdk9/java-9 での module-info.java コンパイル エラーの解決方法
jdk-9を使用して以下のコードを実行しようとしていますが、コマンドを使用してコンパイルすると問題に直面します
指示
エラー
モジュール情報.java
テスト.java
パッケージ構造は以下のようなものです
JDK バージョン