为了账号安全,请及时绑定邮箱和手机立即绑定

编译依赖于外部 Jar 的模块

编译依赖于外部 Jar 的模块

倚天杖 2022-01-12 14:48:47
我使用Java 11.0.1 中的Project Jigsaw完成了一个简单的示例,该示例使用Ubuntu 18.04 上的 oracle JDK 11 构建。按照那个例子,我创建了一个简单的项目,它编译成一个模块,将模块打包到一个 jar 中,然后jlink用来创建一个独立的发行版。一切正常——最终结果是一个小型文件夹,其中包含一个精简的 JRE 和我的模块。该项目仅由三个文件和一些文件夹组成:.:build.sh  src./src:com  module-info.java./src/com:greetings./src/com/greetings:Main.javasrc/com/greetings/Main.javapackage com.greetings;public class Main {   public static void main(String[] args) {      System.out.println("Greetings!");   }}src/模块信息.javamodule com.greetings { }构建.sh#/bin/bash#clean up from last buildrm -rf greetingsapp mlib mods#compilejavac -d mods/com.greetings src/module-info.java src/com/greetings/Main.java#Make module jarmkdir mlibjar --create --file=mlib/com.greetings.jar --main-class=com.greetings.Main -C mods/com.greetings .#build distributionjlink --module-path /usr/lib/jvm/java-11-oracle/jmods/:mlib --add-modules com.greetings --output greetingsapp --strip-debug --no-header-files --no-man-pages --launcher greetings=com.greetings#rungreetingsapp/bin/greetings
查看完整描述

1 回答

?
HUH函数

TA贡献1836条经验 获得超4个赞

您已将 jar 放在类路径中,因此它会生成一个未命名的模块。.

未命名的模块导出它的所有包。...

但是,这并不意味着命名模块中的代码可以访问未命名模块中的类型。...

这种限制是有意的,因为允许命名模块依赖于类路径的任意内容会使可靠的配置变得不可能。

而是尝试将相同的 jar 放在可以推断为自动模块的模块路径上。


您还需要确保相应地更新模块的模块声明,以定义对新添加的模块的依赖以访问其导出的包。

module com.greetings { 
    requires commons.cli;
    }

编辑:在您的情况下尝试完整的build.sh仍然会失败,链接步骤中因为存在自动模块


查看完整回答
反对 回复 2022-01-12
  • 1 回答
  • 0 关注
  • 166 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信