我对 Maven 和 Jenkins 一起工作有点陌生。
我有一个构建 JAR 的项目,并且 JAR 及其附带文件(pom、sha1、md5 等)可通过 Jenkins 可以托管的 Maven 存储库提供。当我导航到我的构建机器时,我可以看到这些文件,例如:
http://myhostname:8080/plugin/repository/everything/com/example/projectname/0.7/
我团队的一名成员有一个其他项目需要的着色 JAR 的构建目标。我也想将这个阴影 JAR 放入 Maven 存储库中。在 pom.xml 中,这一行控制阴影 JAR 的名称:
<finalName>${project.artifactId}-${project.version}-with-dependencies</finalName>
在我的项目中,我可以执行以下操作:
"com.example" % "projectname-with-dependencies" % "0.7" (I suspect - yes?)
这对我来说似乎没问题 - 关于我如何告诉 Jenkins 将该 JAR 从目标文件夹中取出(在构建完成后正确放置的位置)并使其在 Maven 存储库中可用以供其他人包含的任何线索项目?
我希望这是有道理的,我可以得到一点成人的监督;)
编辑 - 根据要求,pom.xml 部分中的相关部分:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<finalName>${project.artifactId}-${project.version}-with-dependencies</finalName>
<createDependencyReducedPom>false</createDependencyReducedPom>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.example.projectname.Projectname</mainClass>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.tooling</resource>
</transformer>
</transformers>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
最佳答案
这是一个我认为应该适用于您的情况的解决方法(尽管我将其用于略有不同的目的)。
我们有一个项目 ProjectAbcd,其中包含源代码、资源等,用于构建常规(非阴影)jar。该项目的 pom 不包含 maven-shade-plugin,因为我们不在这里进行着色。
然后我们创建第二个项目,其名称和artifactID略有不同,ProjectAbcdWithDependency,除了一个相当简单的pom文件之外,它是空的。该 pom 文件仅列出一个依赖项 (ProjectAbcd),并包含 maven-shade-plugin。对于shade-plugin,它不会像上面那样设置最终名称,因为artifactId已经包含“WithDependencies”后缀。
当 maven 打包第二个项目时,它将拉取原始项目,获取原始项目的所有依赖项,并将它们全部放在一个 jar 中,该 jar 的名称将源自 pom 的artifactId。随后的任何安装或发布步骤都应该开箱即用。
这是第一个项目的 pom:
<?xml version="1.0"?>
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>...</groupId>
<artifactId>ProjectAbcd</artifactId>
<packaging>jar</packaging>
<version>8.1-SNAPSHOT</version>
<name>ProjectAbcd</name>
...
</project>
更重要的是,这是第二个项目的:
<?xml version="1.0"?>
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>...</groupId>
<artifactId>ProjectAbcdWithDependencies</artifactId>
<packaging>jar</packaging>
<version>8.1-SNAPSHOT</version>
<name>ProjectAbcdWithDependencies</name>
...
<dependencies>
<dependency>
<groupId>...</groupId>
<artifactId>ProjectAbcd</artifactId>
<version>8.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
关于java - 如何将 Maven Artifact 放入 Jenkins Maven 存储库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24084745/