【发布时间】:2021-01-07 19:52:18
【问题描述】:
有以下情况:
- STS
- Java
- 马文
一号机
工作区-01
带有 Maven 的 Java 应用基于一个单个模块。
通过应用程序的mvn package 或mvn install 生成相应的jar。当然两者是相同的,但我们坚信最有效或最稳定的是通过本地存储库提供的。
现在通过mvn install 将jar 安装在本地存储库中,并使用脚本 并引用本地存储库可以在其他机器中找到并复制master-project.jar 文件,然后手动安装.为简单起见。
重点是:对于其他项目,那个依赖怎么可以放心使用
<dependency>
<groupId>com.manuel.jordan</groupId>
<artifactId>master-project</artifactId>
<version>0.0.1.SNAPSHOT</version>
</dependency>
到这里一切正常
工作区-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生成超级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>
使用上面显示的当前配置,如果在uber-jar 的target 目录中执行mvn package,则会出现master-project-0.0.1-SNAPSHOT.jar 和uber-jar-0.0.1-SNAPSHOT.jar 文件。直到这里,关于前者,它的行为与单一模块方法/环境相同。
如果执行mvn install,我可以在本地存储库中看到每个模块都通过一个目录表示,其中每个<packaging>jar</packaging> 类型都包含其各自的jar 文件。即使我去本地存储库中的uber-jar's 目录,它也会出现它自己的jar,就是这样。
关键是 script 现在失败了,因为本地存储库中不再存在 master-project-0.0.1-SNAPSHOT.jar。当然,我可以解决在uber-jar 的target 目录中生成的那个。另一种方法是在另一个项目的uber-jar 模块中使用相同的一组依赖项,但它很冗长。
观察:该项目应该不知道依赖来自 single-module 或 multi-module 项目。
机器二
以下必须在其他项目中保持平静
<dependency>
<groupId>com.manuel.jordan</groupId>
<artifactId>master-project</artifactId>
<version>0.0.1.SNAPSHOT</version>
</dependency>
请求:如果可能,如何编辑上面显示的 Maven Shade 插件配置。它的目的是将目标的 jar 包含到本地存储库中
唯一的解决方案是手动安装uber-jar 的target 目录中的master-project-0.0.1-SNAPSHOT.jar 文件。但是很好奇我的请求能不能实现。
【问题讨论】:
标签: java maven maven-3 maven-shade-plugin