#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.