Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPMS和fat\uber可执行JAR-如何协同工作?_Java_Maven_Jar_Java 11_Maven Assembly Plugin - Fatal编程技术网

Java JPMS和fat\uber可执行JAR-如何协同工作?

Java JPMS和fat\uber可执行JAR-如何协同工作?,java,maven,jar,java-11,maven-assembly-plugin,Java,Maven,Jar,Java 11,Maven Assembly Plugin,我想知道当使用JDK>8(实际上是JPMS)以及可执行jar时,fat\uber jar是如何工作的 我有两个关于这个话题的问题: 1。fat\uber jar创建\组装过程 每个java模块通常是一个jar,在根条目中保存module info.class。 我正在与maven合作,并使用maven汇编插件构建fat\uber jar(带有依赖项ref描述符的jar)。 如果我的应用程序依赖于许多模块化jar,那么所有这些jar将如何共存?毕竟,每个jar的module info.class将

我想知道当使用JDK>8(实际上是JPMS)以及可执行jar时,fat\uber jar是如何工作的

我有两个关于这个话题的问题:

1。fat\uber jar创建\组装过程

每个java模块通常是一个jar,在根条目中保存
module info.class
。 我正在与maven合作,并使用maven汇编插件构建fat\uber jar(带有依赖项ref描述符的jar)。 如果我的应用程序依赖于许多模块化jar,那么所有这些jar将如何共存?毕竟,每个jar的
module info.class
将覆盖另一个jar的
module info.class
文件,因为所有
module info.class
都将位于根条目中

(旁注:我已经用我创建的软件对它进行了测试,发现最后一个胖罐子只保存了第一个遇到的依赖项的
模块信息.class
。使用
-X
选项还发现,由于存在第一个
模块信息.class
文件,所有其他
模块信息.class
文件都被跳过了…)

2。可执行jar


众所周知,可执行jar可以使用
java-jar
运行。当以这种形式使用JDK 11时,我的(fat)jar及其所有依赖项是否会从类路径运行,并由此被视为未知模块的一部分?或者从模块路径?

简单的答案是,除了创建一个ueber/fat jar之外,您只能拥有一个module-info.java,这会破坏整个模块的各个部分……最终,ueber/fat jar中的模块信息是无用的。使用fat、可执行jar和“java-jar”一起工作命令是现代java应用程序中最常见的实践之一,您是说java生态系统所经历的整个JPMS(根本性的)变化(从运行时的角度)对于这种常见实践来说是不相关和不适用的?我必须承认,这对我来说没有任何意义。模块系统有它的优点,但对于胖罐子应用程序,只有在开发过程中使用它,模块系统才会有意义(强制架构约束;更干净的模块结构;更好的接口)但对于运行时来说,从技术角度来看,这是没有意义的,因为每个jar文件只能有一个模块信息。除此之外,许多单jar(fat)应用程序不再是真正的jar应用程序,例如spring boot、quarkus等。