gpt4 book ai didi

java - 编译依赖于外部 Jar 的模块

转载 作者:搜寻专家 更新时间:2023-10-31 20:25:05 24 4
gpt4 key购买 nike

我完成了 simple example using Project Jigsaw在 Java 11.0.1 中,在 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/module-info.java

module com.greetings { }

build.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

所有这些都有效。现在问题来了:

我接下来要做的是使用外部库,所以我在 Main.java 中添加了几行:

Main.java - 已更新

package com.greetings;

import org.apache.commons.cli.CommandLine; //new line

public class Main {

CommandLine line; //new line

public static void main(String[] args) {
System.out.println("Greetings!");
}
}

然后我放置了commons-cli-1.4.jar在名为 lib 的新目录中。

创建了这个文件结构:

.:
build.sh lib src

./lib:
commons-cli-1.4.jar

./src:
com module-info.java

./src/com:
greetings

./src/com/greetings:
Main.java

我修改了编译行以在类路径中包含公共(public) jar:

javac -cp lib/commons-cli-1.4.jar:. \
-d mods/com.greetings \
src/module-info.java src/com/greetings/Main.java

但是,当我尝试编译它时,出现了这个错误:

src/com/greetings/Main.java:10: error: package org.apache.commons.cli is not visible
import org.apache.commons.cli.CommandLine;
^
(package org.apache.commons.cli is declared in the unnamed module, but module org.apache.commons.cli does not read it)
1 error

如何修改我的项目以便我可以针对 commons-cli-1.4.jar 进行编译


编辑,在用户 nullpointer 的建议下,我尝试将 -cp 标志更改为一个 -p 标志,因此外部 jar 被添加到模块路径中。不幸的是,这也行不通。以下是我尝试过但也不起作用的各种 javac 命令:

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

javac --module-path=lib -d mods/com.greetings \
src/module-info.java src/com/greetings/Main.java

javac -p lib/commons-cli-1.4.jar -d mods/com.greetings \
src/module-info.java src/com/greetings/Main.java

最佳答案

您已将 jar 放在类路径中,因此它会导致 unnamed module. .

The unnamed module exports all of its packages. ...

It does not, however, mean that code in a named module can access types in the unnamed module. ...

This restriction is intentional, since allowing named modules to depend upon the arbitrary content of the class path would make reliable configuration impossible.

而是尝试将相同的 jar 放在 modulepath 上,从那里可以推断出它是 automatic module .


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

module com.greetings { 
requires commons.cli;
}

编辑:在您的案例中尝试完整的 build.sh 仍然会失败,但是 链接步骤because of the presence of an automatic module .

关于java - 编译依赖于外部 Jar 的模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53246066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com