ban*_*'14 4 java compiler-errors java-9 java-module
我有一个用Java 8编写的项目,我想将它更新为Java 9.所以我把这些类分成了两个独立的模块.模块:
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
Run Code Online (Sandbox Code Playgroud)
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 pathmodule org.ggp.base {
org.ggp.base包内的类有99个其他错误,每个错误如下:
org.ggp.base/SRC /主/爪哇/外部/ JSON/JSONObject.java:1:
error: not in a module on the module source pathpackage external.JSON;
要么
org.ggp.base/SRC /主/ JAVA /组织/ GGP /碱/验证/ OPNFValidator.java:1:
error: not in a module on the module source pathpackage org.ggp.base.validator;
我想摆脱错误并编译项目.我没有保留目录结构,但当我把所有内容放在一起时,有两个module-info.java文件,编译器抱怨多个模块.我可以通过IntelliJ IDEA完成它,我不介意,我尝试过.但我不知道幕后发生了什么,我也不知道如何处理错误(Package is empty: 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)
根据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.
为了完整起见,完整的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)
| 归档时间: |
|
| 查看次数: |
2779 次 |
| 最近记录: |