2011-01-08 1 views
6

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

Мы сделали pom.xml файлы для каждого файла банку, который Объявите GroupID, артефакта, зависимости и т.д. Эти pom.xml все файлы имеют общий родительский POM, объявляющий часть общей информации (например <repositories> и <distributionManagement>).

Я хотел бы иметь возможность установить или развернуть эти зависимости с чем-то же просто, как и mvn installmvn deploy (или, возможно, mvn install:install-file и mvn deploy:deploy-file) и имеют все необходимые свойства для этих команд (artifactId, repositoryId и т.д.) будет читайте из файлов pom.xml.

Чтобы получить эту работу, по крайней мере, для развертывания, я попытался положить следующий в моем родительском ПОМ:

<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 для развертывания всех артефактов детского пом. Предположительно, я мог бы сделать что-то подобное, чтобы получить работу mvn install:install-file.

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

Cannot override read-only parameter: pomFile 

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

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

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

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

ответ

2

Хорошо, я нашел решение, которое позволяет мне запускать только mvn install или mvn deploy и иметь файл jar, установленный в локальный или удаленный репозиторий. Вдохновленный a post to the maven-users list и используя build-helper plugin, в родительском ПОМ, у меня есть:

<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>.
  • Дети должны быть объявлены как имеющие <packaging>pom</packaging>, потому что вы не можете добавить баню к артефакту, если она имеет то же имя, что и артефакт.

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

2

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

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

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

+0

Извините, что такое GAV? И я не думаю, что командная строка, которую Maven дает как ошибка, решит мою проблему здесь - как Maven может знать, какие зависимости, которые jar-файл имеет без меня, также пишут pom для этого? – Steve

+0

Это аббревиатура от "Group, Artifact, Version". Когда вы определяете GAV для зависимости, которая еще не находится в удаленном репо (центральном или одном, определенном в '', он генерирует эту командную строку как часть отчета об ошибке. Попробуйте! –

+0

Да, я вижу, что он генерирует командную строку типа 'mvn deploy: deploy-file -DgroupId = ... -DartifactId = ... -Dversion = ... -Dpackaging = jar -Dfile =/path/to/file -Durl = [url] -DrepositoryId = [id] '. Но он не знает, что такое зависимости, которые имеет jar. И поскольку url и repositoryId являются общими для всех зависимостей третьей стороны, которые у меня есть, я хочу просто объявить их один раз в родительском помпе и не нужно помнить их каждый раз. – Steve

0

я встречаю эту проблему в своей работе:

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

  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, возможно, вам стоит отказаться.