Maven Установите и разверните 3-я сторонние зависимости с простой командной строкой
Вопрос
У нас есть ряд сторонних зависимостей, которые никуда не размещаются. Для каждого из них у нас есть файл JAR, который мы хотели бы установить и / или развернуть в нашем репозитории. Некоторые из файлов JAR имеют свои собственные зависимости, и нам также нужно объявить их.
Мы сделали файлы Pom.xml для каждого файла JAR, который объявляет GrouveId, Artifactid, зависимости и т. Д. Эти файлы POM.xml имеют общий родительский POM, который объявляет некоторые из общих информации (например, <repositories>
а также <distributionManagement>
).
Я хотел бы иметь возможность установить или развернуть эти зависимости с чем-то таким простым, как mvn install
а также mvn deploy
(или, может быть mvn install:install-file
а также mvn deploy:deploy-file
) и иметь все необходимые свойства для этих команд (artifactId
, repositoryId
, и т. Д.) Быть прочитанным из файлов POM.xml.
Чтобы сделать это на работу, по крайней мере, для развертывания, я пытался поставить следующее в своем родительском POM:
<build>
<plugins>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.4</version>
<configuration>
<file>${jarfile}</file>
<pomFile>pom.xml</pomFile>
<repositoryId>our-id</repositoryId>
<url>our-url</url>
</configuration>
</plugin>
</plugins>
</build>
а затем каждая из детских помпонов определяет jarfile
имущество. Это позволяет мне бежать mvn deploy:deploy-file
Развернуть все детские артефакты POM. Предположительно я мог сделать что-то подобное, чтобы получить mvn install:install-file
работать.
Но с таким подходом я не могу отпустить родительский POM (который я должен сделать, так как дочерние порцы зависят от него), и если я попытаюсь mvn release:perform
На родительском POM я получаю ошибки, как:
Cannot override read-only parameter: pomFile
Я чувствую, что я, вероятно, иду по этому неправильному пути. Все, что я действительно хочу сделать:
- Поместите общий код для всех сторонних банок в одном общий родительский POM
- Напишите дополнительный минимальный POM для каждой третьей стороны
- Быть в состоянии запустить что-то вроде
mvn install
илиmvn deploy
без необходимости указывать все эти сложные свойства командной строки
Как я могу лучше сделать?
Редактировать: Сделал это более понятнее выше, что в идеале я хотел бы иметь возможность запускать что-то простое, как mvn install
или mvn deploy
И не нужно указывать свойства в командной строке.
Решение 2
Хорошо, я нашел решение, которое позволяет мне запустить mvn install
или mvn deploy
И иметь файл JAR, установленный на локальный или удаленный репозиторий. Вдохновлен сообщение в список пользователей Maven и используя плагин, В родительском POM у меня есть:
<pluginManagement>
<plugins>
<!-- Attach the jar file to the artifact -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.5</version>
<executions>
<execution>
<id>attach-artifacts</id>
<phase>package</phase>
<goals>
<goal>attach-artifact</goal>
</goals>
<configuration>
<artifacts>
<artifact>
<file>${artifactId}-${version}.jar</file>
<type>jar</type>
</artifact>
</artifacts>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
А потом в детских поммах у меня есть:
<packaging>pom</packaging>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
...
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
Некоторые из этого из этого изначально сорвалось:
- То
attach-artifact
исполнение должно быть под<pluginManagement>
так что это не выполняется, если выmvn install
илиmvn deploy
родительский пом. - Дети должны указать
build-helper-maven-plugin
под плагинами сборки, чтобы код от родителя<pluginManagement>
бегится - Дети должны быть объявлены как имеющие
<packaging>pom</packaging>
Поскольку вы не можете добавить банку в артефакт, если он имеет то же имя, что и артефакт.
Единственный недостаток я вижу к такому подходу состоит в том, что артефакт развернут как тип pom
вместо типа jar
. Отказ Но я не видел никаких настоящих последствий этого.
Другие советы
Когда Maven отсутствует зависимость, она даст вам ошибку в ее выходе, которая содержит командную строку для выпуска, чтобы добавить банку на удаленный репозиторий. Эта командная строка автоматически создаст POM для вас и загружать два вместе. Это недостаточно для ваших нужд?
Используя этот объект, если я знаю, что у меня есть зависимость без удаленного представления о репозитории, я обычно просто иду вперед и определим его в мою строгу с GAV, который я хочу, запустите постройку один раз, затем посмотрите на ошибки сборки. Скопируйте команду для развертывания, затем запустите эту команду. Вы захотите убедиться, что у вас есть <repository>
Элементы, настроенные правильно в родительском POM POL, также настроены соответствующие <server>
элементы в вашем settings.xml
С помощью репозитория загружать пароль. Кроме того, вы должны быть хороши, чтобы пойти.
Я бы добавил, что вы должны проверить Nexus, прежде чем добраться до далеко. Стоит трудности, чтобы настроить сейчас! :-)
Я встречаю эту проблему в моей работе:
Теперь у меня есть target.jar (у него есть список зависимостей: a.jar, b.jar, c.jar ...), я хочу использовать
mvn install:install-file
положить его в мое местное репо, но когда я бегу в ударе команды
mvn install:install-file -Dfile=/Users/username/.../target.jar -DgroupId=com.cnetwork.relevance -DartifactId=target -Dversion=1.0.0
Но когда я использую его, я нашел, что есть много ошибок, банка, которую использует Target.jar не может найти a.jar
, b.jar
, c.jar
, Такие как:
com.cnetwork.a does not exist
com.cnetwork.b does not exist
com.cnetwork.c does not exist
Тогда я пошел в ~/.m2/repository/.../target/1.0.0/target.pom
Чтобы найти POM-файл цели, но в этом нет ничего!
...
<groupId>com.cnetwork.relevance</groupId>
<artifactId>target</artifactId>
<version>1.0.0</version>
....
# no dependencies about a/b/c.jar !!!
Это то, что идет не так, install:file -Dfile -DgroupId -D..
не добавляет зависимости в POM, я исправляю ответ этим методом
Если вы уже
have this maven project source
, просто установите его в местное репоmvn clean install
если вы
have the jar and the pom of it
, Установите банку с POMmvn install:install-file -Dfile=/.../.../target.jar -DpomFile=/.../../target.pom
если вы
don't have a pom with target jar
, Напишите One и используйте верхнюю команду.Если вы не можете восстановить его файл POM, возможно, вы должны сдаться.