我对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>
答案 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会自动将其拾取并安装到本地存储库中的正确位置。