【问题标题】:JDK 9 jlink is giving Error: --output must be specifiedJDK 9 jlink 给出错误:必须指定 --output
【发布时间】:2018-10-29 22:01:48
【问题描述】:

我是 JDK 9 的新手,正在尝试使用 jlink 为一个简单的应用程序生成运行时。

我有以下模块描述符

module reader{

        // no "requires" entries implies no dependency on other modules

        // other modules can access org.reader package
        // all other packages are implicitly unavailable

        exports org.reader;
    }

module decoder {

    // depends on reader module
    requires reader;

    // exposes com.decoder package to modules which require decoder module
    // all other packages in decoder module are implicitly unavailable to other modules
    exports com.decoder;
}

我定义了几个简单的类,分别称为 Reader.java 和 Decoder.java,并且能够使用以下步骤编译和运行它们。

(1) 下载JDK和JRE 9.0.4并解压到测试目录

(2) 在测试目录中创建如下目录结构。

/moduleExamples/readerDecoderExample/src/main/java
/moduleExamples/readerDecoderExample/src/main/java/reader
/moduleExamples/readerDecoderExample/src/main/java/decoder

(3) 将 reader module-info.java, org/reader/Reader.java 添加到 reader 目录。将decoder module-info.java, com/decoder/Decoder .java 添加到decoder目录中。

(4)导航到test/moduleExamples/readerDecoderExample目录,运行以下命令

导出 JAVA_HOME=test/jdk9.0.4 mkdir 模组 导出 MODULE_PATH=test/moduleExamples/readerDecoderExample/mods

(5) 编译阅读器和解码器模块

${JAVA_HOME}/bin/javac -d mods --module-source-path src/main/java/ $(find src/main/java -name "*.java")

(6) 运行解码器类

${JAVA_HOME}/bin/java --module-path mods -m decoder/com.decoder.Decoder input.txt

(7) mkdir mlibs

(8) 使用以下命令将模块打包到 jar 中。

    ${JAVA_HOME}/bin/jar --create --file mlibs/reader@1.0.jar --module-version=1.0 -C mods/reader .

${JAVA_HOME}/bin/jar --create --file mlibs/decoder.jar --main-class=com.decoder.Decoder -C mods/decoder .

(9)在步骤(8)的最后,我有一个mlibs dir,如下图

readerDecoderExample/mlibs/decoder.jar
readerDecoderExample/mlibs/reader@1.0.jar

(10) 当我尝试使用以下命令构建 JRE 时

${JAVA_HOME}/bin/jlink --module-path ${JAVA_HOME}/jmods;mlibs/reader@1.0.jar --add-modules reader@1.0 --output out

我收到以下错误。

错误:必须指定--输出

谁能告诉我我做错了什么?

提前谢谢你!

【问题讨论】:

  • 您确定,您正在尝试--add-modules reader@1.0 而不仅仅是reader?版本不只是为了您的信息。
  • 我重新打包了模块,所以我现在没有版本 readerDecoderExample/mlibs/decoder.jar readerDecoderExample/mlibs/reader.jar 并重新运行jlink,如下所示。 ${JAVA_HOME}/bin/jlink --module-path ${JAVA_HOME}/jmods;mlibs --add-modules reader,decoder --output out 我还是遇到同样的错误。
  • ${JAVA_HOME}/bin/jlink --module-path ${JAVA_HOME}/jmods:mlibs --add-modules reader,decoder --output 怎么样?另外,您使用的是什么操作系统?请相应地验证您的分隔符。
  • 哪个操作系统还在?如果是 Linux 或 macOS,那么您在模块路径中使用冒号,而不是分号。如果您使用分号,那么它将截断您的命令(这是一个 shell 问题,而不是 jlink 问题)。
  • 我在 Windows 上的 GIT bash shell 中运行该命令。我跑了 ${JAVA_HOME}/bin/jlink -v --module-path ${JAVA_HOME}/jmods:libs --add-modules decoder --output imageFromLibs 这给了我以下消息“错误:非法字符 <:>在索引 32:/c/GIT/JDK9/test/jdk9.0.4//jmods:libs"。我跳到 DOS 命令提示符并运行 %JAVA_HOME%/bin/jlink -v --module-path %JAVA_HOME%/jmods;libs --add-modules decoder --output imageFromLibs 这有效,谢谢您的输入!

标签: java java-9 jlink


【解决方案1】:

当我在工作中做演示时,我在 gitbash 上遇到了同样的问题。我之前在 Mac 上尝试过,${JAVA_HOME}/jmods;mlibs/reader@1.0.jar 工作正常,只是在移动到 PC 时将: 更改为;

错误似乎在 jmods 周围,所以我刚刚删除它并且它工作正常 - 不知道如何或为什么,这种方法在 mac 上不起作用。

以下应该有效:

${JAVA_HOME}/bin/jlink --module-path mlibs/reader@1.0.jar --add-modules reader@1.0 --output out

【讨论】:

    猜你喜欢
    • 2018-03-06
    • 2018-03-06
    • 1970-01-01
    • 2020-06-21
    • 2015-06-22
    • 2018-08-07
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多