10

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

}

测试.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

4 回答 4

10

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

于 2017-01-25T18:44:33.120 回答
2

JSR 376 尚未最终确定,还有几个主题仍在讨论中。#VersionsInModuleNames 主题的最新提案在这里:

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

于 2017-03-26T08:32:24.520 回答
1

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

例子:

  • log4j - 好的
  • java.compact3 - 好的
  • guava19 - 不好 - 19 与主要 guava 版本有关
  • module1 - OK IF 1 并不意味着版本,而是示例项目中的许多模块之一(在实际项目中应该使用更好的名称)

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

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

评论是可选的,但解释了警告被抑制的“原因”

于 2020-04-30T10:37:18.043 回答
1

好像您在这里使用非拼图 jdk 构建进​​行编译......这是他们是拼图的链接

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

这是项目拼图的 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)

编辑 它适用于拼图和非拼图构建。我刚试过(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”并运行编译好的相同命令,并且使用编译好的两个类文件创建了 mods 目录。

于 2017-01-25T10:52:46.267 回答