Java 9 error: not in a module on the module source path
Java 9 error: not in a module on the module source path
项目结构
我有一个用 Java 8 编写的项目,我想将它更新为 Java 9。所以我将 classes 分成了 2 个单独的模块。模块:
org.ggp.base
和目录 org.ggp.base/src/main/java
中的 module-info.java
。在我开始更新到 Java 9 之前,它的构建是使用 Gradle 自动完成的。该模块使用 pl.edu.prz.klopusz
模块中包含的抽象 class 实现。
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
个文件的内容如下:
org.ggp.base/src/main/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 path
module org.ggp.base {
以及 org.ggp.base
包内的 classes 的 99 个其他错误,每个错误如下:
org.ggp.base/src/main/java/external/JSON/JSONObject.java:1:
error: not in a module on the module source path
package external.JSON;
或
org.ggp.base/src/main/java/org/ggp/base/validator/OPNFValidator.java:1:
error: not in a module on the module source path
package org.ggp.base.validator;
我想要的
我想排除错误并编译项目。我不必保留目录结构,但是当我将它们与 2 module-info.java
文件放在一起时,编译器抱怨有多个模块。我可以通过 IntelliJ IDEA 完成它,我不介意,我试过了。但是我不知道幕后发生了什么,我也不知道如何处理错误(Package is empty: org.ggp.base
)。
我已经找到的
很难在 javac
命令中找到关于 --module-source-path
开关的文档。 This site is what I found。它说:
if you arrange the code in your
modules such that you put the code for a module in an enclosing
directory named for the module, the module source path becomes more like
a simple path, as in--module-source-path Users/Me/MyProject/src
or if it is in multiple projects, use
--module-source-path
/Users/Me/MyProject/src:/Users/Me/MyOtherProject/src
Windows 使用反斜杠和分号,但我还是使用 Linux。
还有一个问题on 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
开关中路径的错误(@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 {
//...
}
根据 JEP 261,--module-source-path
选项(用于 "multi-module mode" 中的编译)必须指向一个目录,该目录为每个包含的模块保存一个子目录,其中目录名称必须等于模块名称。
为了适应源不直接包含在模块目录中的布局,该选项支持 patterns,其中标记 *
可用于表示模块名称路径的任何部分,例如 "./*/src/main/java/"
,它将在 ./my.mod1/src/main/java/module-info.java
等
中找到模块 my.mod1
JEP 261 没有提及模式 *
可能出现的位置的任何限制,但显然 javac
不喜欢模式 starting with *
。这可能是故意的,也可能不是故意的。
有点相关,我可能会补充一点,在之前的讨论中我被告知 JEP 261 包含过时的信息,但我的问题是在 JEP 完成后是否以及在何处维护该规范,没有得到任何答案。 javac manual entry 不是为 --module-source-path
.
等选项提供足够详细信息的地方
为了完整起见,完整的javac
命令如下:
javac -d out --module-source-path "./*/src/main/java/" $(find . -name "*.java")
基于来自 OpenJDK 的 official tutorial(目录结构略有修改,如下所示)和 OpenJDK 版本“11.0.1”,上述命令 javac
对我有效:
.
├── com.greetings
│ └── src
│ └── main
│ └── java
│ ├── com
│ │ └── greetings
│ │ └── Main.java
│ └── module-info.java
├── org.astro
│ └── src
│ └── main
│ └── java
│ ├── module-info.java
│ └── org
│ └── astro
│ └── World.java
├── out
│ ├── classes
│ │ ├── com.greetings
│ │ │ ├── com
│ │ │ │ └── greetings
│ │ │ │ └── Main.class
│ │ │ └── module-info.class
│ │ └── org.astro
│ │ ├── module-info.class
│ │ └── org
│ │ └── astro
│ │ └── World.class
│ └── lib
│ ├── com.greetings.jar
│ └── org.astro@1.0.jar
项目结构
我有一个用 Java 8 编写的项目,我想将它更新为 Java 9。所以我将 classes 分成了 2 个单独的模块。模块:
org.ggp.base
和目录org.ggp.base/src/main/java
中的module-info.java
。在我开始更新到 Java 9 之前,它的构建是使用 Gradle 自动完成的。该模块使用pl.edu.prz.klopusz
模块中包含的抽象 class 实现。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 {
以及 org.ggp.base
包内的 classes 的 99 个其他错误,每个错误如下:
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
开关的文档。 This site is what I found。它说:
if you arrange the code in your modules such that you put the code for a module in an enclosing directory named for the module, the module source path becomes more like a simple path, as in--module-source-path Users/Me/MyProject/srcor if it is in multiple projects, use--module-source-path /Users/Me/MyProject/src:/Users/Me/MyOtherProject/src
Windows 使用反斜杠和分号,但我还是使用 Linux。
还有一个问题on 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
开关中路径的错误(@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 {
//...
}
根据 JEP 261,--module-source-path
选项(用于 "multi-module mode" 中的编译)必须指向一个目录,该目录为每个包含的模块保存一个子目录,其中目录名称必须等于模块名称。
为了适应源不直接包含在模块目录中的布局,该选项支持 patterns,其中标记 *
可用于表示模块名称路径的任何部分,例如 "./*/src/main/java/"
,它将在 ./my.mod1/src/main/java/module-info.java
等
my.mod1
JEP 261 没有提及模式 *
可能出现的位置的任何限制,但显然 javac
不喜欢模式 starting with *
。这可能是故意的,也可能不是故意的。
有点相关,我可能会补充一点,在之前的讨论中我被告知 JEP 261 包含过时的信息,但我的问题是在 JEP 完成后是否以及在何处维护该规范,没有得到任何答案。 javac manual entry 不是为 --module-source-path
.
为了完整起见,完整的javac
命令如下:
javac -d out --module-source-path "./*/src/main/java/" $(find . -name "*.java")
基于来自 OpenJDK 的 official tutorial(目录结构略有修改,如下所示)和 OpenJDK 版本“11.0.1”,上述命令 javac
对我有效:
.
├── com.greetings
│ └── src
│ └── main
│ └── java
│ ├── com
│ │ └── greetings
│ │ └── Main.java
│ └── module-info.java
├── org.astro
│ └── src
│ └── main
│ └── java
│ ├── module-info.java
│ └── org
│ └── astro
│ └── World.java
├── out
│ ├── classes
│ │ ├── com.greetings
│ │ │ ├── com
│ │ │ │ └── greetings
│ │ │ │ └── Main.class
│ │ │ └── module-info.class
│ │ └── org.astro
│ │ ├── module-info.class
│ │ └── org
│ │ └── astro
│ │ └── World.class
│ └── lib
│ ├── com.greetings.jar
│ └── org.astro@1.0.jar