项目结构
我有一个用 Java 8 编写的项目,我想将它更新到 Java 9。所以我将这些类分成 2 个单独的模块。模块:
org.ggp.base
与module-info.java
在目录中org.ggp.base/src/main/java
。在我开始更新到 Java 9 之前,它的构建是使用 Gradle 自动完成的。该模块使用 module.xml 中包含的抽象类实现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:
错误:在模块源路径上找不到模块模块 org.ggp.base {
包内的类还有 99 个其他错误org.ggp.base
,每个都像:
org.ggp.base/src/main/java/external/JSON/JSONObject.java:1:
错误:不在模块源路径上的模块中包外部.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 用户/我/MyProject/src或者如果它在多个项目中,请使用--模块源路径 /Users/Me/MyProject/src:/Users/Me/MyOtherProject/src
对于 Windows,使用反斜杠和分号,但无论如何我都在使用 Linux。
OpenJDK bugs site 上的问题也有评论,与我的错误相同,但我想它仍未解决。
更新
-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
switch 路径的错误(*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 {
//...
}