Java 如何在多模块maven项目中使用以前构建的JAR?
我有: dist pom插件的配置如下:Java 如何在多模块maven项目中使用以前构建的JAR?,java,maven,maven-shade-plugin,Java,Maven,Maven Shade Plugin,我有: dist pom插件的配置如下: <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.2</version>
<configuration>
<shadedClassifierName>all</shadedClassifierName>
<shadedArtifactAttached>true</shadedArtifactAttached>
<transformers>
<!--remove models from jar see mitie -->
<transformer implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer">
<resource>.dat</resource>
</transformer>
</transformers>
<artifactSet>
<excludes>
<exclude>log4j:log4j:jar:</exclude>
</excludes>
</artifactSet>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<id>make-dist</id>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptors>
<descriptor>src/assembly/all.xml</descriptor>
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
org.apache.maven.plugins
maven阴影插件
3.2.2
全部的
真的
.dat
log4j:log4j:jar:
包裹
阴凉处
maven汇编插件
包裹
制造距离
单一的
src/assembly/all.xml
以及程序集all.xml:
<assembly>
<id>all</id>
<formats>
<format>dir</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>${project.basedir}/src/main/docker</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>*</include>
</includes>
</fileSet>
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory>lib</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
</assembly>
全部的
迪尔
假的
${project.basedir}/src/main/docker
/
*
${project.build.directory}
解放党
*jar先生
由于模块a
对lucene 4.1
具有可传递的依赖关系(但重新定位后不会与模块b冲突),并且模块b
对lucene 7.5.0
具有可传递的依赖关系,我想在ModuleDist
的maven shaded插件中使用先前构建的和ModuleA
的着色jar(因为如果我在ModuleDist
中重新定位lucene,它将重新定位所有lucene类)
我怎么能这样做?或者还有其他方法吗?要将运行时依赖项的所有JAR添加到程序集,请添加如下内容:
<?xml version="1.0"?>
<assembly>
...
<dependencySets>
<dependencySet>
<outputDirectory>/lib</outputDirectory>
<unpack>false</unpack>
<scope>runtime</scope>
</dependencySet>
</dependencySets>
</assembly>
更多细节。
可以找到一个工作示例(未使用着色)
我个人的经验是,最好只有最后一个模块来组装所有的东西。这样,着色器就不必反复分解和组装所有内容
当使用Jackson和Log4j2时,着色是一个大问题,因为它破坏了一些期望所有内容都在一个单独的jar中的扩展查找机制。我建议不要再使用它。着色罐子可以用与模块相同的坐标来寻址,但您必须添加着色
…谢谢@khmarbaise,我们使用了另一个分类器名称,但这就是我们所做的。是的,但之后您将以可能以不同顺序加载的几个罐子结束,结果将是不同的顺序函数。我想以一个固定的JAR结束,这取决于您的喜好:加载顺序由类路径定义。如果您有一个着色jar,可能的冲突将由着色器“解决”(=通常未解决)。dependencySets部分是否适用于您?是的,我们在生成docker映像之前使用了dependencySets。但由于我们必须删除NLP模型,并在docker组装之前准备好一个jar,我们选择使用破坏最终jar的shade插件。我们最终得到了2个程序集,并将它们链接到最终的docker文件夹中。好:)!如果这解决了您的问题,那么您最好将问题标记为已解决。这并不是让解决问题的程序集(正如我在构建docker程序集之前告诉您的,我们正在这样做)而是让第二个程序集使用前一个程序集的可交付成果制作两个程序集。我对你的答案投了赞成票,但我会在另一篇文章中明确说明我们做了什么
<?xml version="1.0"?>
<assembly>
...
<dependencySets>
<dependencySet>
<outputDirectory>/lib</outputDirectory>
<unpack>false</unpack>
<scope>runtime</scope>
</dependencySet>
</dependencySets>
</assembly>