Java 8で書かれたプロジェクトがあり、それをJava 9に更新したいので、クラスを2つの個別のモジュールに分けました。モジュール:
org.ggp.base
module-info.java
ディレクトリ内org.ggp.base/src/main/java
。Java 9へのアップデートを開始する前に、そのビルドはGradleで自動化されましたpl.edu.prz.klopusz
。モジュールは、モジュールに含まれる抽象クラス実装を使用します。pl.edu.prz.klopusz
ディレクトリ内pl.edu.prz.klopusz/dolar-app/src/main/java
。Mavenを使用してビルドを自動化したいと思います。モジュールにはモジュールが必要org.ggp.base
です。ファイルツリーは次のようになります。
.
├── org.ggp.base/
│ ├── build.gradle
│ └── src/
│ └── main/
│ ├── java/
│ │ ├── external/
│ │ │ └── JSON/
│ │ │ ├── JSONArray.java
│ │ │ └── JSONObject.java
│ │ ├── META-INF/
│ │ │ └── MANIFEST.MF
│ │ ├── module-info.java
│ │ └── org/
│ │ └── ggp/
│ │ └── base/
│ │ └── util/
│ │ ├── statemachine/
│ │ │ ├── MachineState.java
│ │ │ └── StateMachine.java
│ │ └── symbol/
│ └── resources/
│ └── org/
│ └── ggp/
│ └── base/
└── pl.edu.prz.klopusz/
└── dolar-app/
└── src/
└── main/
└── java/
├── module-info.java
└── pl/
└── edu/
└── prz/
└── klopusz/
└── utilities/
└── decorators
└──StateMachineDecorator.java
module-info.java
ファイルの内容は次のとおりです。
module org.ggp.base {
requires guava;
requires reflections;
requires jdk.httpserver;
uses org.ggp.base.util.statemachine.StateMachine;
exports org.ggp.base;
}
pl.edu.prz.klopusz /ドルアプリ/ srcに/メイン/ javaの/ module-info.java
module pl.edu.prz.klopusz {
requires org.ggp.base;
provides org.ggp.base.util.statemachine.StateMachine
with pl.edu.prz.klopusz.utilities.decorators.StateMachineDecorator;
}
次のコマンドを使用して、プロジェクトをコンパイルしようとします。
javac -d out \
--module-source-path org.ggp.base/src/main/java:pl.edu.prz.klopusz/dolar-app/src/main/java \
$(find org.ggp.base/src/main/java -name *.java) \
$(find pl.edu.prz.klopusz/dolar-app/src/main/java -name *.java)
次のエラーが発生します。
org.ggp.base / src / main / java / module-info.java:1:
エラー:モジュールソースパスにモジュールが見つかりませんmodule org.ggp.base {
またorg.ggp.base
、パッケージ内のクラスに関するその他の99個のエラーは、それぞれ次のようになります。
org.ggp.base / src / main / java / external / JSON / JSONObject.java:1:
エラー:モジュールソースパスのモジュール内にありませんパッケージexternal.JSON;
または
org.ggp.base / src / main / java / org / ggp / base / validator / OPNFValidator.java:1:
エラー:モジュールソースパスのモジュール内にありませんパッケージorg.ggp.base.validator;
エラーを取り除き、プロジェクトをコンパイルしたい。ディレクトリー構造を保存する必要はありませんが、2つのmodule-info.java
ファイルをすべてまとめると、コンパイラーは複数のモジュールについて不平を言っていました。IntelliJ IDEAでそれを行うことができます。私は気にせず、試してみました。しかし、舞台裏で何が起こっているのか、またエラーの処理方法もわかりません(Package is empty: org.ggp.base
)。
コマンドの--module-source-path
切り替えに関するドキュメントを見つけるのは困難javac
でした。このサイトは私が見つけたものです。それは言う:
モジュールのコードをモジュールの名前が含まれるディレクトリに配置するようにモジュール内のコードを配置すると、モジュールのソースパスは次のように単純なパスのようになります。--module-source-path Users / Me / MyProject / srcまたは、複数のプロジェクトにある場合は、--module-source-path / Users / Me / MyProject / src:/ Users / Me / MyOtherProject / src
Windowsではバックスラッシュとセミコロンを使用しますが、とにかくLinuxを使用しています。
OpenJDKバグサイトの問題へのコメントもあり、私のエラーと同じですが、未解決のままだと思います。
更新
-verbose
スイッチ-verbose
コマンドの最後にスイッチを追加しました。それはコンパイラが言うことの一部です:
[parsing started SimpleFileObject[/home/sensitive/org.ggp.base/src/main/java/module-info.java]]
[parsing started SimpleFileObject[/home/sensitive/org.ggp.base/src/main/java/org/ggp/base/util/statemachine/MachineState.java]]
[parsing started SimpleFileObject[/home/sensitive/pl.edu.prz.klopusz/dolar-app/src/main/java/module-info.java]]
[parsing started SimpleFileObject[/home/sensitive/pl.edu.prz.klopusz/dolar-app/src/main/java/pl/edu/prz/klopusz/utilities/decorators/StateMachineDecorator.java]]
org.ggp.base/src/main/java/org/ggp/base/util/statemachine/MachineState.java:1: error: not in a module on the module source path
package org.ggp.base.util.statemachine;
^
[loading /modules/jdk.httpserver/module-info.class]
[loading /modules/java.base/module-info.class]
[total 263ms]
100 errors
したがって、これは--module-source-path
スイッチのパスの障害ではないと思います(*src/main/java
@StephanHerrmannによって指摘された場合と同じ動作が発生します)。読み取る必要があるすべてのJavaソースを読み取ります。pl.edu.prz.klopusz
モジュール内のソースに問題はありません。これらはの最初の行ですorg.ggp.base.util.statemachine.MachineState
:
package org.ggp.base.util.statemachine;
import org.ggp.base.util.gdl.grammar.GdlSentence;
import java.util.HashSet;
import java.util.Set;
public class MachineState {
//...
}
どおりJEP 261--module-source-path
(「マルチモジュールモード」でコンパイルするための)オプションディレクトリ名、モジュール名に等しくなければならない各モジュールに含まれる、のための1つのサブディレクトリを保持するディレクトリを指していなければなりません。
ソースがモジュールディレクトリに直接含まれていないレイアウトに対応するために、このオプションは、トークンを使用して、モジュールを検索するin などのパスの任意の部分でモジュール名を表すことができるパターンをサポートしています。*
"./*/src/main/java/"
my.mod1
./my.mod1/src/main/java/module-info.java
JEP 261はどこパターン内の任意のcontraints言及していない*
発生することが、どうやらjavac
パターン好きではないの開始に*
。これは意図的である場合とそうでない場合があります。
少し関連しますが、以前の議論でJEP 261に古い情報が含まれていると通知されましたが、JEPの完了後にこの仕様を維持するかどうか、どこで維持するかという私の質問には答えがありませんでした。javacのマニュアルのエントリはのようなオプションのために十分な詳細を提供する場所ではありません--module-source-path
。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加