Как я могу автоматически развернуть внешние jar-файлы в свой репозиторий как часть процесса сборки?

#maven #jar #build

#maven #банка #строить #сборка

Вопрос:

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

Есть идеи?

Ответ №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}thirdpartycommonantcontrib1.0b3ant-contrib-1.0b3.jar"/>
                                    </classpath>
                                </taskdef>

                                <taskdef resource="org/apache/maven/artifact/ant/antlib.xml">
                                    <classpath>
                                        <pathelement
                                                location="${releaseDirectory}thirdpartycommonmaven-ant-tasks2.1.1maven-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='amp;<?xml version="1.0" encoding="UTF-8"?amp;>${line.separator}'
                                      file='${temp.pom.file}'/>
                                <echo message='amp;<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"amp;>${line.separator}'
                                      file='${temp.pom.file}' append='true'/>
                                <echo message=' amp;<modelVersionamp;>4.0.0amp;</modelVersionamp;>${line.separator}'
                                      file='${temp.pom.file}' append='true'/>
                                <echo message=' amp;<groupIdamp;>com.mavenisedamp;</groupIdamp;>${line.separator}'
                                      file='${temp.pom.file}' append='true'/>
                                <echo message=' amp;<artifactIdamp;>combined-javaamp;</artifactIdamp;>${line.separator}'
                                      file='${temp.pom.file}' append='true'/>
                                <echo message=' amp;<versionamp;>${version}amp;</versionamp;>${line.separator}'
                                      file='${temp.pom.file}' append='true'/>
                                <echo message=' amp;<packagingamp;>pomamp;</packagingamp;>${line.separator}'
                                      file='${temp.pom.file}' append='true'/>
                                <echo message=' amp;<dependenciesamp;>${line.separator}' file='${temp.pom.file}'
                                      append='true'/>

                                <for param="file">
                                    <path>
                                        <fileset dir="${sdkDirectory}libservlet">
                                            <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='  amp;<dependencyamp;>${line.separator}' file='${temp.pom.file}' append='true'/>
                                        <echo message='   amp;<groupIdamp;>comamp;</groupIdamp;>${line.separator}' file='${temp.pom.file}' append='true'/>
                                        <echo message='   amp;<artifactIdamp;>${jarName}amp;</artifactIdamp;>${line.separator}' file='${temp.pom.file}' append='true'/>
                                        <echo message='   amp;<versionamp;>${version}amp;</versionamp;>${line.separator}' file='${temp.pom.file}' append='true'/>
                                        <echo message='  amp;</dependencyamp;>${line.separator}' file='${temp.pom.file}' append='true'/>

                                    </sequential>
                                </for>

                                <echo message=' amp;</dependenciesamp;>${line.separator}' file='${temp.pom.file}'
                                      append='true'/>
                                <echo message='amp;</projectamp;>${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>
  

Ответ №2:

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

Есть несколько способов сделать это. Следующие 2 возможных решения все вращаются вокруг ручной установки 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 для установки каждого jar в репозиторий. Преимущество этого метода заключается в том, что команде нужно будет устанавливать каждую версию Jar только один раз, в отличие от предыдущего метода, который потребовал бы, чтобы каждый член команды устанавливал каждую версию jar в свой локальный репозиторий.

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

Комментарии:

1. Да, что-то гораздо более автоматическое — это то, что я ищу.

Ответ №3:

Вы упоминаете «автоматически» в своем вопросе, и я бы предположил, что у вас есть какой-то инструмент 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 или какого-либо запланированного инструмента командной строки приведет вас к «автоматическому».

Комментарии:

1. У нас работает команда «Сити». Пакетный файл, вероятно, справился бы с задачей по загрузке jar-файлов в репозиторий. Есть куча других задач maveny, которые нужно выполнять одновременно. (Создание плагинов на основе классов в jar-файлах, извлечение связки javascript и превращение его в javascript-проекты maven). В итоге у меня получился вложенный проект maven, один модуль которого выполняет преобразование jar-файла в проект maven.