Как я могу автоматически развернуть внешние jar-файлы в своем хранилище в процессе сборки? - PullRequest
1 голос
/ 14 июня 2011

Я работаю над проектом 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 ]

1 голос
/ 16 июня 2011

Пахнет немного, но я закончил тем, что использовал плагин maven ant для запуска задачи maven ant, чтобы выполнить работу.

Конечный результат - все jar-файлы в определенном каталогеразвернуты на артефакте, и создается еще один проект, который зависит от всех добавленных 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>
0 голосов
/ 14 июня 2011

Вы упоминаете "автоматически" в своем вопросе, и я предполагаю, что у вас есть какой-то инструмент CI, такой как Jenkins.Если вы используете Jenkins, вы можете добавлять задания командной строки с помощью плагина XShell.

https://wiki.jenkins -ci.org / display / JENKINS / XShell + Plugin

Вы можете написать пакет / скрипт, который загружает библиотеки от издателя, а затем загружать артефакт в хранилище.

Ваш пакет / скрипт может автоматически управлять номером версии и т. Д., И Дженкинс может обрабатывать периодическое обновление автоматически,Как только вы это сделаете, Jenkins может также построить ваш проект с вашим новым заданием XShell в качестве родителя.

Или вместо написания пакетного файла / файла сценария вы можете использовать плагин Maven Deploy:

http://maven.apache.org/plugins/maven-deploy-plugin/

Чтобы развернуть сторонние библиотеки с помощью плагина maven-deploy, вам все равно необходимо выполнить командную строку, поэтому при использовании Jenkins или какого-либо запланированного инструмента командной строки будет полученВы к "автоматическому".

0 голосов
/ 14 июня 2011

РЕДАКТИРОВАТЬ: я знаю, что вопрос касался способов сделать это "автоматически", однако я не знаю каких-либо автоматических способов достижения желаемых результатов, поэтому я даю чуть менее оптимальный вариант ручного достижение того же результата.

Есть несколько способов сделать это. Следующие 2 возможных решения вращаются вокруг ручной установки банки в хранилище. Я не знаю ни одного плагина, который может сделать то, что вы просите (но этого не существует - пока!) - вы всегда можете написать такой плагин самостоятельно, если никто не может предложить его! ; -)

1) Первым было бы вручную установить данный jar-файл в локальный репозиторий каждый раз, увеличивая номер версии каждого jar-файла каждый раз, когда вы его вставляете.

mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>

Затем вы можете ссылаться на банку как на еще одну зависимость. Тем не менее, я думаю, вам нужно будет постоянно менять версию в вашем pom с каждым выпуском. (Я помню, как видел способ всегда ссылаться на последнюю версию, но я думаю это было для Maven v1, и я не работал в Maven 2 - я уверен, что кто-то добавит комментарий, указывающий как ссылаться на последнюю версию, если это возможно)

2) Второй способ будет полезен, если у вас есть местная команда разработчиков, состоящая из нескольких человек, - это менеджер хранилища ( Apache Archiva - это только один пример того, что я ' я лично использовал - их там много!) и использую интерфейс Repo Manager для установки каждого jar-файла в хранилище. Преимущество этого метода состоит в том, что команде нужно будет установить каждую версию Jar только один раз, а не предыдущий метод, что потребует от каждого члена команды установки каждой версии JAR в своем локальном хранилище.

Я не знаю, помогла ли это!

...