Java 9错误:不在模块源路径上的模块中

ban*_*'14 4 java compiler-errors java-9 java-module

项目结构

我有一个用Java 8编写的项目,我想将它更新为Java 9.所以我把这些类分成了两个独立的模块.模块:

  • org.ggp.basemodule-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
Run Code Online (Sandbox Code Playgroud)

module-info.java文件内容如下:

org.ggp.base/SRC /主/爪哇/ 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;
}
Run Code Online (Sandbox Code Playgroud) pl.edu.prz.klopusz/DOLAR应用内/ SRC /主/爪哇/ 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;
}
Run Code Online (Sandbox Code Playgroud)

汇编

我尝试使用以下命令编译项目:

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)
Run Code Online (Sandbox Code Playgroud)

错误

我收到以下错误:

org.ggp.base/SRC /主/爪哇/ module-info.java:1:

error: module not found on module source path
module org.ggp.base {

org.ggp.base包内的类有99个其他错误,每个错误如下:

org.ggp.base/SRC /主/爪哇/外部/ JSON/JSONObject.java:1:

error: not in a module on the module source path
package external.JSON;

要么

org.ggp.base/SRC /主/ JAVA /组织/ GGP /碱/验证/ OPNFValidator.java:1:

error: not in a module on the module source path
package org.ggp.base.validator;

我想要的是

我想摆脱错误并编译项目.我没有保留目录结构,但当我把所有内容放在一起时,有两个module-info.java文件,编译器抱怨多个模块.我可以通过IntelliJ IDEA完成它,我不介意,我尝试过.但我不知道幕后发生了什么,我也不知道如何处理错误(Package is empty: org.ggp.base).

包是空的:org.ggp.base

我已经找到了什么

很难找到关于--module-source-pathswitch in javaccommand 的文档.这个网站是我发现的.它说:

如果您在模块中安排代码,以便将模块的代码放在为模块命名的封闭目录中,则模块源路径将变得更像一个简单的路径,如
--module-source-path Users/Me/MyProject/src
或者如果它在多个项目中,请使用
    --module-source-path 
        /Users/Me/MyProject/src:/Users/Me/MyOtherProject/src

对于Windows使用反斜杠和分号,但无论如何我都在使用Linux.

还有一个关于OpenJDK错误网站上的问题的评论,与我的错误相同,但我想它仍未解决.

UPDATE

-verbose 开关

-verbose在命令末尾添加了switch.这是编译器所说的一部分:

[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
Run Code Online (Sandbox Code Playgroud)

所以,我认为这不是--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 {
    //...
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*ann 8

根据JEP 261,--module-source-path选项(用于"多模块模式"中的编译)必须指向一个目录,该目录包含每个包含模块的一个子目录,其中目录名称必须等于模块名称.

为了适应其中源不直接包含在模块目录的布局中,选项支持的模式,其中该令牌*可用于在路径中,例如在任何部分来表示模块名称"./*/src/main/java/",这会发现模块my.mod1./my.mod1/src/main/java/module-info.java

JEP 261没有提及在其中的任何模式约束上*可能会出现,但显然javac不喜欢的图案开始使用*.这可能是也可能不是故意的.

稍微相关,我可以补充一点,在之前的讨论中,我被告知JEP 261包含过时的信息,但我的问题是在JEP完成后是否以及在何处维持此规范,没有产生任何答案.该javac的手动输入是不是给出了类似的选项足够的细节的地方--module-source-path.


Abh*_*kar 7

为了完整起见,完整的javac命令如下:

javac -d out --module-source-path "./*/src/main/java/" $(find . -name "*.java")
Run Code Online (Sandbox Code Playgroud)

基于OpenJDK的官方教程(稍微修改如下所示的目录结构)和 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
Run Code Online (Sandbox Code Playgroud)

  • 这是一个老问题,但以防万一有人偶然发现这一点:您应该能够在 Windows cmd 中执行以下操作: dir /s /b *.java > mySourceFiles.txt & javac -d out --module-source-path ".\ *\src\main\java\" @sourceFiles.txt &del mySourceFiles.txt (2认同)