【问题标题】:How to resolve module-info.java compile error in Jdk9/java-9如何解决 Jdk9/java-9 中的 module-info.java 编译错误
【发布时间】:2017-01-25 10:35:26
【问题描述】:

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

}

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)

【问题讨论】:

    标签: java openjdk java-9 java-platform-module-system


    【解决方案1】:

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

    【讨论】:

    • 请注意,目前(请参阅此评论时间戳)提出了“退回”限制的提议。 (就个人而言,我希望它失败......但这不是我的电话。)
    • @StephenC 经过广泛的反馈,规范被修改为允许模块名称末尾的数字:openjdk.java.net/projects/jigsaw/spec/issues/…
    • 那么拼图的目的是什么?我对前模块时代的 Java 包的唯一问题是缺乏版本处理。如果jigsaw没有解决,而且主动阻止变通办法,那还有什么意义呢?
    • @TamasHegedus 模块系统旨在将版本解析留给构建工具。模块系统给你的是关于加载模块的编译时错误,而不是关于加载包/类的运行时错误。 Jigsaw 为您提供的另一件事是能够使用 jlink 制作定制的 JVM 运行时,因为 JDK 本身是模块化的。欲了解更多信息,我对 SO 中这个确切问题的最喜欢的答案在这里:stackoverflow.com/a/34813655/904556
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      似乎您在这里使用非拼图 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)
      

      编辑 它适用于拼图和非拼图构建。我刚刚试过(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 目录,其中两个类文件都编译得很好。

      【讨论】:

      • java-9 有两个 jdk 吗?像正常的和模块化的?
      • 大多数模块化功能也可以在“常规”构建中找到。 @Eugene:您是否尝试过它是否真的不适用于其中之一? (现在没时间尝试。)
      • @Nicolai 我的失败.. 它确实适用于简单的构建。我会更新答案
      • @Eugene 我曾尝试过您建议的拼图构建,但仍然对我不起作用。删除模块名称中的数字后需要检查。
      【解决方案4】:

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

      例子:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-14
        • 1970-01-01
        • 1970-01-01
        • 2023-01-03
        • 2019-09-04
        • 2013-03-17
        • 1970-01-01
        相关资源
        最近更新 更多