【问题标题】:How can I use previously built jars in a multi-module maven project?如何在多模块 Maven 项目中使用以前构建的 jar?
【发布时间】:2020-03-05 03:26:33
【问题描述】:

我有this maven multi-module project

ModuleA
  src
  pom.xml
  target
    ModuleA-with-dependencies-shaded.jar (version 4.1 of lucene relocated)
ModuleB
  src
  pom.xml
  target
    ModuleB-with-dependencies.jar (version 7.5.0 of lucene)
ModuleDist
  assembly
    all.xml
  pom.xml (shaded plugin for jar + assembly for Docker)

dist pom 插件配置如下:

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

还有程序集 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>

由于ModuleAlucene 4.1 具有传递依赖(但已重新定位,因此它不会与模块B 冲突)并且ModuleBlucene 7.5.0 具有传递依赖,我想使用以前构建ModuleA 的阴影 jar 在 ModuleDist 的 maven 阴影插件中(因为如果我在 ModuleDist 中重新定位 lucene,它会重新定位所有 lucene 类)。

我该怎么做?
还是有其他方法可以做到这一点?

【问题讨论】:

  • 阴影 jar 可以通过与它完成的模块相同的坐标来寻址,但您必须添加 &lt;classifier&gt;shaded&lt;/classifier&gt; ...
  • 谢谢@khmarbaise,我们使用了另一个分类器名称,但这就是我们所做的。

标签: java maven maven-shade-plugin


【解决方案1】:

要将运行时依赖项的所有 jar 包添加到程序集,请添加如下内容:

<?xml version="1.0"?>
<assembly>
...
  <dependencySets>
    <dependencySet>
      <outputDirectory>/lib</outputDirectory>
       <unpack>false</unpack>
       <scope>runtime</scope>
    </dependencySet>
  </dependencySets>
</assembly>

查看组装插件documentation 了解更多详情。 可以在here 找到一个工作示例(未使用阴影)。

我个人的经验是,最好只有一个最终模块来组装所有东西。这样,着色器就不必一遍又一遍地拆卸和组装所有内容。

在使用 Jackson 和 Log4j2 时,阴影是一个大问题,因为它破坏了一些扩展查找机制,这些机制期望所有内容都位于单独的 jar 中。我建议不要再使用它了。

【讨论】:

  • 是的,但是你会得到几个可能以不同顺序加载的罐子,结果将是顺序的不同功能。我想以一个固定的罐子结束
  • 这取决于您的喜好:加载顺序由类路径定义。如果你有一个带阴影的罐子,可能的碰撞将由着色器“解决”(=通常不解决)。依赖集部分对你有用吗?
  • 是的,我们在构建 docker 镜像之前使用了依赖集。但是由于我们必须删除 NLP 模型并在 docker 程序集之前准备好一个 jar,我们选择使用破坏最终 jar 的 shade 插件。我们最终得到了 2 个程序集,并将它们链接到最终的 docker 文件夹中。
  • 好:)!如果这解决了您的问题,最好将问题标记为已解决。
  • 不是制作解决问题的程序集(正如我告诉过你的那样,我们在构建 docker 程序集之前就已经这样做了),而是制作两个程序集,第二个程序集的可交付成果前一个。我投票赞成你的答案,但我会在另一篇文章中明确我们做了什么
猜你喜欢
  • 2014-01-15
  • 2018-10-25
  • 1970-01-01
  • 2021-03-23
  • 1970-01-01
  • 2014-05-22
  • 2019-05-21
  • 1970-01-01
  • 2019-01-19
相关资源
最近更新 更多