项目结构
我有一个用Java 8编写的项目,想要将其更新为Java 9。因此,我将类分成了两个独立的模块。这两个模块如下:
org.ggp.base
模块,在目录org.ggp.base/src/main/java
中包含module-info.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/dolar-app/src/main/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:
error: module not found on module source pathmodule org.ggp.base {
还有其他 99 个位于 org.ggp.base
包内的类的错误,每一个错误都是这样的:
org.ggp.base/src/main/java/external/JSON/JSONObject.java:1:
error: not in a module on the module source pathpackage external.JSON;
或者
org.ggp.base/src/main/java/org/ggp/base/validator/OPNFValidator.java:1:
error: not in a module on the module source pathpackage org.ggp.base.validator;
我的要求
我想要消除这些错误并编译项目。我不必保留目录结构,但当我将它们全部放在一起时,用了 2 个 module-info.java
文件,编译器抱怨多个模块。我可以通过 IntelliJ IDEA 完成,但我不知道背后发生了什么,也不知道如何处理错误(Package is empty: org.ggp.base
)。
我已经找到的信息
很难找到关于 javac
命令中 --module-source-path
开关的文档。我找到了这个网站,它说:
如果你将模块的代码放在一个名为模块的封闭目录中,那么模块源路径就更像是一个简单的路径,例如--module-source-path Users/Me/MyProject/src或者如果它位于多个项目中,则使用--module-source-path /Users/Me/MyProject/src:/Users/Me/MyOtherProject/src
对于 Windows,请使用反斜杠和分号,但无论如何我都在使用 Linux。
还有一个对开放 JDK 缺陷的评论,与我的错误相同,但我想它仍未解决。
更新
-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
开关中路径的错误(与@StephanHerrmann指出的*src/main/java
相同的行为发生)。它读取应该读取的所有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 {
//...
}
*/src/main/java
或org.ggp.base/src/main/java:pl.edu.prz.klopusz/dolar-app/src/main/java
都无所谓。 - banan3'14*/src/main/java
模式,因为存在额外的dolar-app
中间目录,这妨碍了与模块名的匹配。 - Stephan Herrmannjavac
命令应该是什么样子,你也没有。为了完整起见,它应该是javac -d out --module-source-path "./*/src/main/java/" $(find . -name "*.java")
,对吧? - Abhijit Sarkar$(find org.ggp.base/src/main/java -name *.java) $(find pl.edu.prz.klopusz/src/main/java -name *.java)
,因为在当前目录中简单搜索find .
不起作用。我会把它添加到答案 https://stackoverflow.com/review/suggested-edits/21296807。 - banan3'14find
不起作用;这与javac
无关。我认为你在find
方面做错了什么。您的编辑因不同原因被拒绝,我会将我的评论发布为答案。 - Abhijit Sarkar