Java JPMS和fat\uber可执行JAR-如何协同工作?
我想知道当使用JDK>8(实际上是JPMS)以及可执行jar时,fat\uber jar是如何工作的 我有两个关于这个话题的问题: 1。fat\uber jar创建\组装过程 每个java模块通常是一个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将
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等。