- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我完成了 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/
我想知道如果一个人需要并行处理项目 A、B 和 C,其中 A 依赖于 B,B 依赖于 C,那么完美的工作流程是什么。 目前,我将所有内容都放在一个存储库中,这加快了早期开发速度。所以我的工作目录如下所
尝试测试这款外观精美的 gem - http://icelab.com.au/articles/welcome-to-the-omnisocial/ - 这 promise 可以将 Twitter 和
因为每个版本flutter_localizations来自 SDK 取决于 intl 0.17.0而 fstore 依赖于 intl ^0.16.1 , 禁止来自 SDK 的 flutter_loca
类似于Typescript: Type of a property dependent on another property within the same object我想要一种属性依赖的类型。
我需要计算分页的结果数。 演示查询 select A.order_id, IF( E.assign_date IS NOT NULL AND E.assign_dat
我的表中有一个项目列表,其中包含字段 votes_up 和 votes_down 以及其他字段。现在我想根据这两个字段的功能根据受欢迎程度订购商品。问题在于受欢迎程度的算法取决于 votes_up 的
cloud_firestore:^0.14.4firebase_auth: ^0.18.4+1smooth_star_rating: ^1.0.4地理点:^0.7.1geoflutterfire: ^
是否可以定义两个不同的 PatternLayouts 并依赖于它使用第一个或第二个的应用程序 LogLevel? 示例: 如果我使用默认的 ERROR 级别运行我的应用程序,它应该打印如下日志语句:
我有一个函数 template void frobnicate()做的东西。我需要 T 成为少数几个选择类型之一,并且我需要一些关于这些类型的信息。我通过提供特征来做到这一点: template st
我目前正在开发我的一个项目,它是一个类似于 MSPaint 的 WPF 应用程序。但是,我不使用铅笔工具或类似的工具,而是使用对象(矩形、圆形、三角形等)进行绘画。我使用 Prism 和 MVVM 模
我在 ftable 周围写了一个包装器因为我需要计算许多变量的频率和百分比的平面表: mytable <- function(...) { tab <- ftable(...,
如果可以在 Gradle 中使用来自其他项目的任务,我想尝试一下。假设 ProjectB 是一个 src/main/groovy 包含 com.MyTask 的项目,有父 ProjectA 在 Pro
我需要测试一些依赖于当前上下文的静态方法。现在,我当然可以使用 HttpContextWrapper 从我自己的代码中删除这种依赖性。问题在于我在这些方法中使用的第 3 方 API。他们依赖于 Htt
我正在尝试创建一个通用的结构,具有通用实现特征的界限。特征本身是通用的。这是在 Rust 1.49.0 中。 如果我这样做: trait Foo {} struct Baz> { x: F,
如果 Makefile 本身被更改,一个安全的赌注是将所有目标视为过时的。 有没有聪明的方法来添加这种依赖?有没有其他选择? 最佳答案 一个安全的赌注,但一个可怕的想法。示例:您正在使用 automa
我有一种情况,我需要根据远程文件在 make 中执行规则。这是我正在尝试做的一个例子(实际的 Makefile 在这里不相关的方式要复杂得多): URL = http://cdn.sstatic.ne
这是我的第一个 Spring 应用程序,所以请原谅我对此事的无知。 我在 @Autowired 依赖项上遇到 NullPoinerException。 14:08:48,415 SEVERE [com
我在编程方面没有太多经验,所以这是我的问题: 我正在尝试编写一个转换器应用程序。最后,您可以输入一个数字。然后我有两个组件UIPickerView .使用第一个组件,您可以选择输入格式(例如 °Cel
假设我在 Haxe 中有以下类: class Pair { public var first:U = null; public var second:V = null; pub
在很多与向服务器发送请求相关的问题的回答中,我看到提倡使用 Javascript/AJAX。 从某种意义上说,我仍然是一个纯粹主义者,因为我首先尝试开发无需使用 Javascript/AJAX 即可完
我是一名优秀的程序员,十分优秀!