问题描述
具有以下情况:
- STS
- Java
- 行家
机器一号
workspace-01
带有Maven的Java应用基于单个模块。
通过应用的mvn package
或mvn 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
,则使用上面显示的当前配置,将显示target
和master-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服务器。