【问题标题】:How do I get maven artifacts into the Jenkins maven repository?如何将 Maven 工件放入 Jenkins Maven 存储库?
【发布时间】:2014-06-06 14:50:35
【问题描述】:

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

【问题讨论】:

  • 阴影 JAR 是如何构建的?它也是一个maven项目吗?
  • 这是 pom.xml 文件中的一个目标。 JAR 与项目的 JAR 一起放在目标目录中。也就是说,目标目录有 project-0.7.jar 和 project-0.7-with-dependencies.jar,我希望这两个都可以通过 Jenkins 的 Maven 存储库获得。
  • 所以我假设 maven 安装实际上只安装项目 jar,而不是阴影 jar?
  • 正确。阴影 JAR 已构建,但看起来就是这样。
  • 你能发布用于阴影 jar 项目的 pom.xml 文件吗?我想知道您是否只是没有将 maven-shade-plugin 作为 Jenkins 正在运行的正确阶段的一部分运行。

标签: java maven jenkins


【解决方案1】:

这是我认为应该适用于您的情况的解决方法(尽管我将它用于稍微不同的目的)。

我们有一个项目,ProjectAbcd,它包含用于构建常规(非阴影)jar 的源代码、资源等。这个项目的 pom 不包含 maven-shade-plugin,因为我们没有在这里做阴影。

然后我们创建第二个项目,名称和工件ID 略有不同,ProjectAbcdWithDependencies,除了一个相当简单的 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>

【讨论】:

  • 这成功了!附带的好处是,我们现在可以为全着色和非着色使用不同的分支,以允许不同的消费者处于不同的开发路径(是的,听起来很奇怪,但是让全着色的 JAR 让我们流血-边缘不稳定分支对这个项目很有帮助。很好的副作用)
【解决方案2】:

我希望您需要做的是在主要构建步骤之后向 Jenkins 添加另一个 Maven 构建步骤,该步骤使用 install:install-file 目标手动安装阴影 jar。

此时,您可以将阴影 jar 视为另一个需要使用 maven-install-plugin 手动安装的第三方 jar。

例如

mvn install:install-file -Dfile=<project-path>/target/<shaded-jar>

由于阴影 jar 文件是由 maven 构建的,它的 pom.xml 会嵌入到 jar 文件中,因此 maven 会自动将其拾取并安装到本地存储库中的正确位置。

【讨论】:

  • 这几乎可以工作。 [信息] 安装 /var/lib/jenkins/jobs/Tokenizer/workspace/target/projectname-0.7-with-dependencies.jar 到 /home/cambler/.m2/repository/com/example/projectname/0.7/projectname-0.7 .jar 所以这是把它放在我的本地存储库中。我希望它在 Jenkins 服务的 Maven 存储库中。例如网址myhostname:8080/plugin/repository
  • tl;dr 以上:它安装在我的本地存储库中,而不是 Jenkins 提供的存储库服务器中
  • 您可以使用-DlocalRepositoryPath=&lt;some-path&gt; 选项指定repo。有关安装插件的完整文档,请参阅 here
  • 另外,仅供其他人参考,install:install-file 可能不会使用适合从我找到的 POM 中获取数据的最新版本。为确保这样做,请使用 org.apache.maven.plugins:maven-install-plugin:2.5.1:install-file
  • 还是不行。现在它使用路径作为实际路径,而不是服务器。所以我得到了这个: [INFO] 将 /var/lib/jenkins/jobs/Project/workspace/target/projectname-0.7-with-dependencies.jar 安装到 /var/lib/jenkins/jobs/Project/workspace/http://主机名:8080/plugin/repository/com/example/projectname/0.7/projectname-0.7.jar
猜你喜欢
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 2017-12-19
  • 2012-09-16
  • 2011-11-26
  • 2014-11-02
  • 2013-09-07
  • 2013-04-10
相关资源
最近更新 更多