作为构建过程的一部分,如何将外部jar自动部署到我的存储库?

时间:2011-06-14 05:08:41

标签: maven jar build

我正在开发一个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>

有什么想法吗?

3 个答案:

答案 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='&lt;?xml version="1.0" encoding="UTF-8"?&gt;${line.separator}'
                                      file='${temp.pom.file}'/>
                                <echo message='&lt;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"&gt;${line.separator}'
                                      file='${temp.pom.file}' append='true'/>
                                <echo message=' &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;${line.separator}'
                                      file='${temp.pom.file}' append='true'/>
                                <echo message=' &lt;groupId&gt;com.mavenised&lt;/groupId&gt;${line.separator}'
                                      file='${temp.pom.file}' append='true'/>
                                <echo message=' &lt;artifactId&gt;combined-java&lt;/artifactId&gt;${line.separator}'
                                      file='${temp.pom.file}' append='true'/>
                                <echo message=' &lt;version&gt;${version}&lt;/version&gt;${line.separator}'
                                      file='${temp.pom.file}' append='true'/>
                                <echo message=' &lt;packaging&gt;pom&lt;/packaging&gt;${line.separator}'
                                      file='${temp.pom.file}' append='true'/>
                                <echo message=' &lt;dependencies&gt;${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='  &lt;dependency&gt;${line.separator}' file='${temp.pom.file}' append='true'/>
                                        <echo message='   &lt;groupId&gt;com&lt;/groupId&gt;${line.separator}' file='${temp.pom.file}' append='true'/>
                                        <echo message='   &lt;artifactId&gt;${jarName}&lt;/artifactId&gt;${line.separator}' file='${temp.pom.file}' append='true'/>
                                        <echo message='   &lt;version&gt;${version}&lt;/version&gt;${line.separator}' file='${temp.pom.file}' append='true'/>
                                        <echo message='  &lt;/dependency&gt;${line.separator}' file='${temp.pom.file}' append='true'/>

                                    </sequential>
                                </for>

                                <echo message=' &lt;/dependencies&gt;${line.separator}' file='${temp.pom.file}'
                                      append='true'/>
                                <echo message='&lt;/project&gt;${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或某种预定的命令行工具将使您“自动”。