如何解决Jdk9/java-9中的module-info.java编译错误

如何解决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;

我试图使用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;

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不是指一个版本,而是一个示例项目中的多个模块之一,则可以(在实际项目中应使用更好的名称)
由于Lint无法理解数字的含义,因此默认情况下它会报告数字,您可以使用以下命令在模块文件中抑制它们:

@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中的这个问题: