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

时间:2017-01-25 10:35:27

标签: java openjdk java-9 jigsaw

我正在尝试使用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

module-info.java

module module1 { 

}

Test.java

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)

4 个答案:

答案 0 :(得分:7)

根据Jigsaw Issues List,模块名称不能以数字结尾。目的是阻止作者编写模块名称中的版本号。

答案 1 :(得分:2)

JSR 376尚未最终确定,有几个主题仍在讨论中。有关#VersionsInModuleNames主题的最新提议如下:

http://mail.openjdk.java.net/pipermail/jpms-spec-experts/2017-March/000659.html

答案 2 :(得分:1)

好像你正在使用非拼图jdk构建这里编译......这里的链接是jigsaw

使用该编译器,您可以在我的笔记本电脑上编译这些相同的样本。

这就是java -version对项目拼图的看法:

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)

修改 它适用于拼图和非拼图构建。我刚试过它(构建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"并运行相同的命令编译确定和mods目录创建时,两个类文件编译得很好。

答案 3 :(得分:0)

根据JDK-8160181,禁止在模块名称中使用数字,但是它们不应与版本控制相关。

示例:

  • log4j-确定
  • java.compact3-确定
  • guava19-不好-19与主要的番石榴版本有关
  • module1-好的,如果1不是一个版本,而是一个示例项目中的多个模块之一(在实际项目中应使用更好的名称)

由于Lint无法弄清数字的含义,因此默认情况下会报告数字,因此您可以使用以下命令在模块文件中取消显示数字:

@SuppressWarnings("module") // 1 in module1 is module number, not version
module module1 {
...
}

该评论是可选的,但解释了“为什么”警告被取消