【发布时间】:2017-06-18 14:13:41
【问题描述】:
目标:使用 maven shade 插件创建一个可执行的 uber jar,可以在另一个 pom 的 mvn 编译期间执行。
复制步骤:
- 使用下面的 pom 为“发布者”组件创建一个 pom.xml。
- 使用 Jenkins 构建来 mvn 部署它(mvn install 也可以)
- 为“consumer”添加对 pom.xml 的依赖(pom 下面)
- mvn 编译消费者
预期行为: 发布者的 Uber jar 下载到消费者/目标目录中的某处
实际: Uber jar 没有出现在消费者目录中
组件 1:发布者
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mec.experiment</groupId>
<artifactId>publisher</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.6.Final</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifestFile>src/main/resources/META-INF/MANIFEST.mf</manifestFile>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
组件 2:消费者
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mec.experiment</groupId>
<artifactId>consumer</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.mec.experiment</groupId>
<artifactId>publisher</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
【问题讨论】:
-
您在哪里指定发布商有分类器?您在消费者的依赖中使用
<classifier>publisher</classifier>。 -
啊,之前实验的残留物。我尝试了上面的 pom 和发布者:
consumer:true publisher publisher 在这两种情况下的行为相同。更新了消费者 pom 以删除分类器以实现内部一致性。 -
好的。这里的“目标目录”是什么意思?我不确定我是否理解为什么应该在“消费者/目标目录的某个位置”下载发布者。
-
也许我正在处理我的一个基本误解。我希望包含对消费者的依赖会自动将 jar 下载到某处。我脑海中的类比是有一个依赖项自动包含在 javac 命令的类路径中,并在进程资源阶段将其持久化到文件系统的某个位置。
-
包含在类路径中,是的。它将被下载到您的本地存储库
~/.m2/repository下。但是进程资源阶段或目标文件夹在这里不起作用。 Maven 将在构建开始时下载依赖项。
标签: java maven maven-3 executable-jar maven-shade-plugin