Maven Установите и разверните 3-я сторонние зависимости с простой командной строкой

StackOverflow https://stackoverflow.com/questions/4632648

  •  08-10-2019
  •  | 
  •  

Вопрос

У нас есть ряд сторонних зависимостей, которые никуда не размещаются. Для каждого из них у нас есть файл 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, я исправляю ответ этим методом

  1. Если вы уже have this maven project source, просто установите его в местное репо

    mvn clean install

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

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

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

  4. Если вы не можете восстановить его файл POM, возможно, вы должны сдаться.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top