Maven Shade插件:“ mvn install”如何在本地存储库中包含通过“ mvn package”生成的同一jar? workspace-01 workspace-02

问题描述

具有以下情况:

  • STS
  • Java
  • 行家

机器一号

workspace-01

带有Maven的Java应用基于单个模块。

通过应用的mvn packagemvn install生成相应的jar。当然,两者是相同的,但是我们坚信,最有效或最稳定的是可通过本地存储库获得的信息。

现在通过mvn install将jar安装在本地存储库中,并使用 script ,可以引用本地存储库,然后在其他计算机中找到并复制master-project.jar文件,然后手动安装。出于简单目的。

重点是:对于其他项目,依赖关系可以和平使用

<dependency>
  <groupId>com.manuel.jordan</groupId>
  <artifactId>master-project</artifactId>
  <version>0.0.1.SNAPSHOT</version>
</dependency>

直到这里一切正常

workspace-02

该应用成长,并且在其他工作空间中,该应用已迁移为可以与多模块

一起使用

为简单起见,假设采用以下结构

master-project (<packaging>pom</packaging>)
alpha (<packaging>jar</packaging>)
beta (<packaging>jar</packaging>)
numbers (<packaging>pom</packaging>)
   one (<packaging>jar</packaging>)
   two (<packaging>jar</packaging>)
countries (<packaging>pom</packaging>)
   Europe (<packaging>pom</packaging>)
      France (<packaging>jar</packaging>)
      Italy (<packaging>jar</packaging>)
   AmericaLatina (<packaging>pom</packaging>)
      Peru (<packaging>jar</packaging>)
      Argentina (<packaging>jar</packaging>)
uber-jar (<packaging>jar</packaging>) <--- it has a special purpose

我能够编译所有这些模块。因此,构建成功

现在,uber-jar模块具有唯一的用途,即根据<packaging>jar</packaging>类型定义所有依赖项,以通过maven shade plugin生成uber jar。配置如下:

  <modelVersion>4.0.0</modelVersion>
  <packaging>jar</packaging>

  <artifactId>uber-jar</artifactId>
  <name>uber-jar</name>

  <parent>
    <groupId>com.manuel.jordan</groupId>
    <artifactId>master-project</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>

  <dependencies>
    <dependency>
        <groupId>com.manuel.jordan</groupId>
        <artifactId>alpha</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>com.manuel.jordan</groupId>
        <artifactId>beta</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
    ....
    <dependency>
        <groupId>com.manuel.jordan</groupId>
        <artifactId>etc</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>${maven.shade.plugin.version}</version>
            <executions>
                <execution>
                    <id>create-fat-jar</id>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <finalName>master-project-0.0.1-SNAPSHOT</finalName>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
  </build>

如果在mvn package的{​​{1}}目录中执行了uber-jar,则使用上面显示的当前配置,将显示targetmaster-project-0.0.1-SNAPSHOT.jar文件。到这里为止,关于前者,它的行为与一个模块的方法/环境相同。

如果执行了uber-jar-0.0.1-SNAPSHOT.jar,我可以在本地存储库中看到每个模块都是通过目录表示的,其中每个mvn install类型的模块都包含其各自的jar文件。甚至我在本地存储库中进入<packaging>jar</packaging>的目录,它也显示了自己的jar。

问题在于 script 现在失败了,因为本地存储库中不再存在uber-jar。当然,我可以解决master-project-0.0.1-SNAPSHOT.jar的{​​{1}}目录中生成的那个问题。另一种方法是在另一个项目的uber-jar模块中使用相同的依赖关系集,但这很冗长。

观察:该项目应该不知道依赖项来自单模块多模块项目。

机器二

以下内容必须在其他项目中保持和平

target

请求(如果可能),如何编辑上面显示的Maven Shade插件配置。目的是将目标的jar包含在本地存储库中

独特的解决方案是手动安装uber-jar的{​​{1}}目录中的<dependency> <groupId>com.manuel.jordan</groupId> <artifactId>master-project</artifactId> <version>0.0.1.SNAPSHOT</version> </dependency> 文件。但是好奇我的要求能否实现。

解决方法

您可能已经注意到自己了,<finalName>仅更改了target中工件的名称。要更改本地存储库中的名称,您需要更改POM中的Maven坐标。

更重要的是,不建议从一个本地存储库复制到另一个本地存储库。相反,标准方法是使用Nexus或Artifactory服务器。