java - 如何将 Maven Artifact 放入 Jenkins Maven 存储库?

标签 java maven jenkins

我对 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/

相关文章:

java - 禁用特定 URL 上的 header

java - ANT 中的#{}-扩展是什么意思?

maven - 并且在多个文件条件下不适用于 Maven 配置文件

java - 目标: package in maven .是什么意思

Jenkins 管道 : Try/catch inside a retry block

Java 集和包含

maven - 如何制作maven版本:use-latest-versions step up import scoped entry in dependencyManagement?

声明性 Jenkins 管道中的 Powershell 脚本

groovy - 如何通过 Jenkins 工作流的 "build"步骤使用 NodeLabelParameter 插件中的参数

java - 捕获 URL 中的所有图像并移动到幻灯片