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

问题描述 投票:0回答:3

项目结构

我有一个用 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
文件的内容如下:

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:

错误:在模块源路径上找不到模块
模块 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
switch 的文档。 这个网站是我发现的。它说:

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

 开关中路径的错误(@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 { //... }
    
java compiler-errors java-9 java-module module-path
3个回答
19
投票
根据

JEP 261--module-source-path

选项(用于在“多模块模式”下编译)必须指向一个目录,该目录为每个包含的模块保存一个子目录,其中目录名称必须等于模块名称。

为了适应源不直接包含在模块目录中的布局,该选项支持

patterns,其中标记 *

 可用于表示路径任何部分中的模块名称,例如 
"./*/src/main/java/"
,这将在 
my.mod1
 等中找到模块 
./my.mod1/src/main/java/module-info.java
 

JEP 261 没有提及对模式

*

 可能出现在何处的任何限制,但显然 
javac
 不喜欢模式 
starting*
。这可能是有意的,也可能不是有意的。

稍微相关的是,我可能会补充一点,在之前的讨论中,我被告知 JEP 261 包含过时的信息,但我的问题是 JEP 完成后是否以及在哪里维护该规范,但没有给出答案。

javac 手册条目 没有为 --module-source-path

 等选项提供足够的详细信息。


8
投票
为了完整起见,完整的

javac

命令如下:

javac -d out --module-source-path "./*/src/main/java/" $(find . -name "*.java")

基于 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 │   └── [email protected]
    

0
投票
如果您想更明确地了解模块源路径(在某些情况下,您无法在正则表达式中指定模式),可以使用 --module-source-path 标志的模块特定形式,如

https:// 中所述docs.oracle.com/en/java/javase/17/docs/specs/man/javac.html#module-specific-form.

javac -d out -m org.ggp.base,pl.edu.prz.klopusz --module-source-path org.ggp.base=org.ggp.base/src/main/java --module-source-path pl.edu.prz.klopusz=pl.edu.prz.klopusz/dolar-app/src/main/java
    
© www.soinside.com 2019 - 2024. All rights reserved.