如何将maven工件放入Jenkins maven存储库?

时间:2014-06-06 14:50:35

标签: 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>

2 个答案:

答案 0 :(得分:1)

这是一个我觉得应该适用于你的情况的解决方法(虽然我已经将它用于略有不同的目的)。

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

然后我们创建了第二个项目,名称和artifactID略有不同,ProjectAbcdWithDependencies,除了一个相当简单的pom文件外,它是空的。该pom文件只列出了一个依赖项(ProjectAbcd),并包含了maven-shade-plugin。对于shade-plugin,它不像上面那样设置最终名称,因为artifactId已经包含&#34; WithDependencies&#34;后缀。

当maven打包第二个项目时,它将拉下原始项目,抓住所有原始依赖项,并将它们全部加在一个罐子里,其名称将来自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>

答案 1 :(得分:0)

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

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

e.g。

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

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