我正在开发一个Maven项目,该项目建立在不使用Maven的第三方提供的库之上。他们每两周提供一次新版本。
我正在努力尽可能地自动化使代码在我们的项目中可用的工作。其中一项任务是从目录中获取一组jar并将它们作为工件上传到我们的存储库。
是否可以将此步骤作为构建的一部分?理想情况下,我希望最终得到一个类似的转换项目。
<?xml version="1.0" encoding="UTF-8"?>
<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>com.convertor</groupId>
<artifactId>thirdpartyconvertor</artifactId>
<version>THIRD_PARTY_VERSION</version>
<packaging>jar</packaging>
<properties>
<jarLocation>${someKnownLocation}\${version}</caplinSdkVersion>
</properties>
<build>
<plugins>
<plugin>
<!--
Mystery plugin that goes through the third party jar directory and deploys each jar file as
<groupId>com.thirdparty</groupId>
<artifactId>THE_JAR_NAME</artifactId>
<version>${version}</version>
-->
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.thirdparty</groupId>
<artifactId>all-jars</artifactId>
<version>${version}</version>
</dependency>
</dependencies>
</project>
有什么想法吗?
答案 0 :(得分:1)
它闻起来有点味道,但我最终使用maven ant插件运行maven ant任务来完成工作。
最终结果是特定目录中的所有jar文件都被部署为artifactory,并且创建了另一个项目,该项目依赖于所有添加的jar项目。
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<id>install</id>
<phase>install</phase>
<configuration>
<target>
<taskdef resource="net/sf/antcontrib/antlib.xml">
<classpath>
<pathelement
location="${releaseDirectory}\thirdparty\common\antcontrib\1.0b3\ant-contrib-1.0b3.jar"/>
</classpath>
</taskdef>
<taskdef resource="org/apache/maven/artifact/ant/antlib.xml">
<classpath>
<pathelement
location="${releaseDirectory}\thirdparty\common\maven-ant-tasks\2.1.1\maven-ant-tasks-2.1.1.jar"/>
</classpath>
</taskdef>
<!-- write a pom that depends on all the jars we find. -->
<var name="temp.pom.file" value="${build.directory}/maven/combined/pom.xml"/>
<echo message='<?xml version="1.0" encoding="UTF-8"?>${line.separator}'
file='${temp.pom.file}'/>
<echo message='<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">${line.separator}'
file='${temp.pom.file}' append='true'/>
<echo message=' <modelVersion>4.0.0</modelVersion>${line.separator}'
file='${temp.pom.file}' append='true'/>
<echo message=' <groupId>com.mavenised</groupId>${line.separator}'
file='${temp.pom.file}' append='true'/>
<echo message=' <artifactId>combined-java</artifactId>${line.separator}'
file='${temp.pom.file}' append='true'/>
<echo message=' <version>${version}</version>${line.separator}'
file='${temp.pom.file}' append='true'/>
<echo message=' <packaging>pom</packaging>${line.separator}'
file='${temp.pom.file}' append='true'/>
<echo message=' <dependencies>${line.separator}' file='${temp.pom.file}'
append='true'/>
<for param="file">
<path>
<fileset dir="${sdkDirectory}\lib\servlet">
<include name="**/*.jar"/>
</fileset>
</path>
<sequential>
<propertyregex override="yes"
property="jarName"
input="@{file}"
regexp="([^/\\]+)\.jar"
select="\1"/>
<pom id="jarPom" groupId="com.mavenised" artifactId="${jarName}"
version="${version}" name="${jarName}"/>
<!-- the pom must be written to disk because of a bug in the ant plugin -->
<writepom pomRefId="jarPom" file="${build.directory}/maven/pom.xml"/>
<pom id="writtenPom" file="${build.directory}/maven/pom.xml"/>
<install file="@{file}">
<pom refid="writtenPom"/>
</install>
<echo message=' <dependency>${line.separator}' file='${temp.pom.file}' append='true'/>
<echo message=' <groupId>com</groupId>${line.separator}' file='${temp.pom.file}' append='true'/>
<echo message=' <artifactId>${jarName}</artifactId>${line.separator}' file='${temp.pom.file}' append='true'/>
<echo message=' <version>${version}</version>${line.separator}' file='${temp.pom.file}' append='true'/>
<echo message=' </dependency>${line.separator}' file='${temp.pom.file}' append='true'/>
</sequential>
</for>
<echo message=' </dependencies>${line.separator}' file='${temp.pom.file}'
append='true'/>
<echo message='</project>${line.separator}' file='${temp.pom.file}'
append='true'/>
<pom id="combinedPom" file="${temp.pom.file}"/>
<install file="${temp.pom.file}">
<pom refid="combinedPom"/>
</install>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
答案 1 :(得分:0)
编辑:我知道问题是关于如何“自动”执行此操作,但是我不知道有任何自动方法来实现所需的结果,所以我给出了一个稍微不那么理想的手动替代方案实现相同的结果。
有几种方法可以做到这一点。以下两种可能的解决方案都围绕在存储库中手动安装jar。我不知道任何插件可以做你所要求的(但它不存在 - 但是!) - 你总是可以自己编写这样一个插件,如果没有人可以提出一个! ; - )
1)第一种方法是每次手动在本地存储库中手动安装给定的jar,每次插入时都会增加每个jar的版本号。
mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>
然后你可以将jar称为另一个依赖项。但是,我认为你需要在每个版本中不断更改pom中的版本。 (我记得看到一种总是引用最新版本的方法,但我认为是Maven v1,我没有在Maven 2中工作 - 我相信有人会添加评论指示如何引用最新版本(如果可能)
2)如果你有一个不仅仅是少数人的本地开发团队,第二种方式会很有用 - 那就是拥有一个存储库管理器(Apache Archiva只是我个人使用过的一个例子 - 那里有很多!),并使用Repo Manager UI在存储库中安装每个jar。这种方法的好处是团队只需要安装一次Jar的每个版本,而不是之前的方法,这需要团队的每个成员在其本地存储库中安装每个版本的jar。
我不知道那是否有任何帮助!
答案 2 :(得分:0)
你在问题中提到“自动”,我会假设你有一些像詹金斯这样的CI工具。如果您使用的是Jenkins,则可以使用XShell插件添加命令行作业。
https://wiki.jenkins-ci.org/display/JENKINS/XShell+Plugin
您可以编写一个批处理/脚本,从发布者下载库,然后将工件上传到存储库。
您的批处理/脚本可以自动管理版本号等,Jenkins可以自动处理定期更新。完成此操作后,您的项目也可以由Jenkins以您的新XShell作业作为父项构建。
或者,您可以使用Maven Deploy插件,而不是编写批处理/脚本文件:
http://maven.apache.org/plugins/maven-deploy-plugin/
要使用maven-deploy插件部署第三方库,您仍然需要执行命令行,因此使用Jenkins或某种预定的命令行工具将使您“自动”。