maven устанавливает и развертывает сторонние зависимости с помощью простой командной строки - PullRequest
6 голосов
/ 08 января 2011

У нас есть ряд сторонних зависимостей, которые нигде не размещены.Для каждого из них у нас есть JAR-файл, который мы хотели бы установить и / или развернуть в нашем хранилище.Некоторые из jar-файлов имеют свои собственные зависимости, и мы также должны объявить их.

Мы создали файлы pom.xml для каждого jar-файла, которые объявляют groupId, 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>

и затем, чтобы каждый из дочерних poms определил свойство jarfile.Это позволяет мне запускать mvn deploy:deploy-file для развертывания всех дочерних артефактов pom.Предположительно, я мог бы сделать что-то похожее, чтобы заставить mvn install:install-file работать.

Но при таком подходе я не могу освободить родительский пом (что я должен сделать, так как от него зависят дочерние помпы), и еслиЯ пытаюсь mvn release:perform на родительском поме, я получаю такие ошибки, как:

Cannot override read-only parameter: pomFile

Я чувствую, что, вероятно, поступаю неправильно.Все, что я действительно хочу сделать, это:

  • Поместите общий код для всех сторонних jar в один общий родительский pom
  • Напишите дополнительный минимальный pom для каждого стороннего jar
  • Уметь запускать что-то вроде mvn install или mvn deploy без указания всех этих сложных свойств командной строки

Как мне лучше всего этого добиться?

Редактировать: Выяснилось, что в идеале я хотел бы иметь возможность запускать что-то столь же простое, как mvn install или mvn deploy, и не указывать свойства в командной строке.

Ответы [ 3 ]

2 голосов
/ 09 января 2011

Хорошо, я нашел решение, которое позволяет мне запускать только mvn install или mvn deploy и устанавливать файл jar в локальный или удаленный репозиторий.Вдохновленный сообщением в список пользователей maven и использующий плагин build-helper , в родительском письме у меня есть:

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

И затем ву ребенка poms, у меня есть:

<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 родительский pom.
  • Дети должны указать build-helper-maven-plugin в подключаемых модулях сборки, чтобы выполнялся код из родительского <pluginManagement>.1024 *
  • Дети должны быть объявлены как имеющие <packaging>pom</packaging>, потому что вы не можете добавить баночку к артефакту, если он имеет то же имя, что и артефакт.

Единственный недостаток, который яПосмотрите на этот подход: артефакт развертывается как тип pom вместо типа jar.Но я не видел никаких реальных последствий этого.

2 голосов
/ 08 января 2011

Если в Maven отсутствует зависимость, в ее выводе выдается сообщение об ошибке, содержащее командную строку для добавления JAR-файла в удаленный репозиторий.Эта командная строка автоматически создаст POM для вас и загрузит их вместе.Разве этого недостаточно для ваших нужд?

Используя эту возможность, если я знаю, что у меня есть зависимость без представления удаленного репозитория, я обычно просто иду вперед и определяю ее в моей сборке с помощью GAV, который я хочу,запустите сборку один раз, затем посмотрите на ошибки сборки.Скопируйте команду для развертывания, затем выполните эту команду.Вы должны убедиться, что элементы <repository> правильно настроены в родительском POM, а также настроить соответствующие элементы <server> в вашем settings.xml с паролем загрузки репозитория.Кроме того, вам следует идти.

Я бы добавил, что вам следует проверить Nexus, прежде чем отправиться далеко.Это стоит создать сейчас!: -)

0 голосов
/ 08 ноября 2017

Я сталкиваюсь с этой проблемой в своей работе:

Теперь у меня есть 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, я исправляю ответ этим методом

  1. , если вы уже have this maven project source, просто установите его в локальный репозиторий

    mvn clean install

  2. если вы have the jar and the pom of it, установите банку с пом

    mvn install:install-file -Dfile=/.../.../target.jar -DpomFile=/.../../target.pom

  3. если вы don't have a pom with target jar, напишите один и используйте верхнюю команду.

  4. если вы не можете восстановить файл pom, возможно, вам следует отказаться.

...