编译依赖于外部 Jar 的模块

我使用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.java

src/com/greetings/Main.java


package com.greetings;


public class Main {

   public static void main(String[] args) {

      System.out.println("Greetings!");

   }

}

src/模块信息.java


module com.greetings { }

构建.sh


#/bin/bash


#clean up from last build

rm -rf greetingsapp mlib mods


#compile

javac -d mods/com.greetings src/module-info.java src/com/greetings/Main.java


#Make module jar

mkdir mlib

jar --create --file=mlib/com.greetings.jar --main-class=com.greetings.Main -C mods/com.greetings .


#build distribution

jlink --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


#run

greetingsapp/bin/greetings


倚天杖
浏览 167回答 1
1回答

HUH函数

您已将 jar 放在类路径中,因此它会生成一个未命名的模块。.未命名的模块导出它的所有包。...但是,这并不意味着命名模块中的代码可以访问未命名模块中的类型。...这种限制是有意的,因为允许命名模块依赖于类路径的任意内容会使可靠的配置变得不可能。而是尝试将相同的 jar 放在可以推断为自动模块的模块路径上。您还需要确保相应地更新模块的模块声明,以定义对新添加的模块的依赖以访问其导出的包。module com.greetings {      requires commons.cli;     }编辑:在您的情况下尝试完整的build.sh仍然会失败,但在链接步骤中,因为存在自动模块。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java