如何解决Jdk9/java-9中的module-info.java编译错误
我试图使用jdk-9运行下面的代码,但在使用命令编译时遇到了问题 命令如何解决Jdk9/java-9中的module-info.java编译错误,java,openjdk,java-9,java-platform-module-system,Java,Openjdk,Java 9,Java Platform Module System,我试图使用jdk-9运行下面的代码,但在使用命令编译时遇到了问题 命令 javac -d mods .\module-info.java com\nirav\modi\Test.java 错误 .\module-info.java:1: error: class, interface, or enum expected module module1 { } ^ 1 error 模块信息.java module module1 { } package com.nirav.modi;
javac -d mods .\module-info.java com\nirav\modi\Test.java
错误
.\module-info.java:1: error: class, interface, or enum expected
module module1 { }
^
1 error
模块信息.java
module module1 {
}
package com.nirav.modi;
class Test {
public static void main(String args[]){
System.out.println("Hello Modular...");
}
}
Test.java
module module1 {
}
package com.nirav.modi;
class Test {
public static void main(String args[]){
System.out.println("Hello Modular...");
}
}
包结构如下所示
module1\module-info.java
module1\com\nirav\modi\Test.java
JDK版本
java version "9-ea"
Java(TM) SE Runtime Environment (build 9-ea+153)
Java HotSpot(TM) 64-Bit Server VM (build 9-ea+153, mixed mode)
似乎您正在使用非拼图jdk构建进行编译。。。这是他们的链接 有了这个编译器,这些示例就可以在我的笔记本电脑上正常编译了 这是project jigsaw的java版本的外观:
java version "9-ea"
Java(TM) SE Runtime Environment (build 9-ea+153-jigsaw-nightly-h6003-20170124)
Java HotSpot(TM) 64-Bit Server VM (build 9-ea+153-jigsaw-nightly-h6003-20170124, mixed mode)
编辑
它同时适用于拼图和非拼图构建。我刚刚试过(build 149)
EDIT2所以我尝试了jdk-9 build 153,下面是我得到的:
javac -d mods module-info.java Modules.java
module-info.java:1: warning: [module] module name module1 should avoid terminal digits
module module1 {
^
1 warning
删除“1”并运行相同的命令compiled OK和mods目录,这两个类文件都编译得很好。根据,模块名称不能以数字结尾。其目的是阻止作者在模块名称中编码版本号。JSR376还不是最终版本,有几个主题仍在讨论中。关于#VersionsInModuleNames主题的最新提案如下: 根据,不禁止在模块名称中使用数字,但它们不应与版本控制相关 示例:
- log4j-好的
- java.compact3-OK
- 番石榴19-不正常-19与主要番石榴版本相关
- module1-如果1不是指一个版本,而是一个示例项目中的多个模块之一,则可以(在实际项目中应使用更好的名称)
@SuppressWarnings("module") // 1 in module1 is module number, not version
module module1 {
...
}
注释是可选的,但解释了警告被抑制的“原因”java-9有两个jdk吗?与普通和模块化一样,大多数模块化功能也可以在“常规”构建中找到@尤金:你有没有试过它是否真的对其中一个不起作用?(现在没有时间尝试。)@Nicolai我的失败。。它确实适用于简单的构建。我会更新的answer@Eugene我曾尝试过你建议的拼图构建,但对我来说仍然不起作用。从模块名称中删除编号后,需要与进行检查。请注意,当前(请参阅此注释时间戳)有一个“回退”限制的建议。(就个人而言,我希望它失败……但这不是我的要求。)@StephenC经过广泛的反馈后,规范被修改为允许在模块名称的末尾使用数字:那么jigsaw的目的是什么?我在使用前模块时代的Java包时遇到的唯一问题是缺少版本处理。如果jigsaw不能解决这个问题,而且还积极地阻止了解决方法,那么有什么意义呢?@Tamashegdus模块系统打算将版本解析留给构建工具。模块系统给您的是关于加载模块的编译时错误,而不是关于加载包/类的运行时错误。Jigsaw提供的另一个功能是使用jlink创建定制的JVM运行时,因为JDK本身是模块化的。欲了解更多信息,我最喜欢的答案就是SO中的这个问题: