2013-05-31 4 views
1

Я пытаюсь создать единую исполняемую банку из многопроектного проекта maven. Вот моя структура проекта, за которой следует то, что я пытался сделать с плагином сборки maven. Пойми, многие из нас могут намекнуть мне о решении (которое мне показалось бы наиболее распространенным, но я не мог найти в других цепочках обсуждений). Благодаря!Одиночная исполняемая банка для проекта с несколькими проектами maven

Структура меня есть (упрощенно):

MYAPP

… 
    <groupId>myApp</groupId> <artifactId>myApp</artifactId> 
    <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> 
    <name>myApp</name> <url>http://maven.apache.org</url> 
… 
    <build> 
    <plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-compiler-plugin</artifactId> 
     <configuration> 
     <source>1.6</source> <target>1.6</target> 
     </configuration> 
    </plugin> 
     </plugins> 
    </build> 

    <modules> 
    <module>../m1</module> <!-- jar--> 
    <module>../m2</module> <!-- war --> 
    <module>../subAppPomAggregationProject</module> 
    </modules> 

    <dependencies> 
… 
    </dependencies> 
</project> 

Я пытался добавить ниже плагин к файлу MYAPP пом:

<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.4</version> 
<configuration> 
    <appendAssemblyId>false</appendAssemblyId> 
     <archive> 
     <manifest> 
      <mainClass>com.mypath.Main</mainClass> 
     </manifest> 
     </archive> 
     <descriptorRefs> 
    <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 
</configuration> 
<executions> 
    <execution> 
     <id>make-assembly</id> 
     <phase>package</phase> 
     <goals> 
      <goal>single</goal> 
     </goals> 
    </execution> 
</executions> 
</plugin> 

Конечно, это не создайте банку для MyApp, но она создала то, что казалось объединенным банком в каждом модуле (!), хотя на самом деле не со всей зависимостью.

Я также попытался создать еще один uber-проект (jar) с любым модулем или зависимостью MyApp - тоже не работал. Должен ли я перечислять в uber-jar все модули, импортированные в MyApp (вместе с модулями, импортированными в subAppPomAggregationProject)? Не пытались это сделать, но если да, то в чем заключается цель агрегатора pom и зачем использовать двухэтапный подход к компиляции/агрегации?

Я не мог попробовать плагин maven-shade (не уверен, что это поможет), потому что для него требуется maven 3, и я в настоящее время использую 2.2.1 (не хотел бы обновлять и встряхивать вещи прямо перед моей почти вехой ...).

ответ

0

Вы можете использовать более старую версию, если плагин оттенка. Версия 1.7.1 является последней версией тени, которая работает на Maven 2.x, и она будет работать для создания исполняемого файла jar ... Синтаксис должен быть почти таким же, переключатель основного номера версии должен был указывать переключитесь на Maven 3 как требование.

+0

Добавить этот плагин в MyApp pom.xml (pom packaging), или создать другой проект (скажем, myappjar), в который я размещаю плагин? Если последнее, я просто добавляю зависимость MyApp в myappjar pom.xml? – Gera

+0

Один артефакт на модуль. Так что не увлекайте агрегатор (также родитель должен быть создан до того, как ребенок так не может быть таким, даже если вы этого захотите) –

+0

Когда я добавил плагин тени в MyApp pom.xml, я получил следующую ошибку: [INFO ] Замена оригинального артефакта с затененным артефактом. [INFO] Замена нуля на /home/.../MyApp/target/myapp-0.0.1-SNAPSHOT-shaded.pom [ERROR] BUILD ERROR [INFO] Ошибка при создании заштрихованной банки: null. Поэтому очевидно, что решение не работает. Попробуем второй вариант. – Gera

0

Решение, которое работает в таких средах, представляет собой иерархическую агрегацию. Таким образом, первое создание единой баночки для subAppPomAggregationProject от создания сказать subAppPomAggregationProject.aggregate Maven проект, и в П указать все модули subAppPomAggregationProject в качестве зависимостей, и добавить плагин Maven-сборку:

<build> 
    <plugins> 
     <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.4</version> 
     <configuration> 
      <appendAssemblyId>false</appendAssemblyId> 
      <descriptors> 
       <descriptor>src/assembly/bin.xml</descriptor> 
      </descriptors> 
      <descriptorRefs> 
       <descriptorRef>jar-with-dependencies</descriptorRef> 
      </descriptorRefs> 
     </configuration> 
     <executions> 
      <execution> 
       <id>make-assembly</id> 
       <phase>package</phase> 
       <goals> 
       <goal>single</goal> 
       </goals> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
</build>] 

Затем сделать то же самое на уровне приложения, где созданный банкод агрегации subAppPagAggregationProject является одним из модулей!

Поскольку на каждом уровне конфликты между зависимостями разрешены, ни одна из зависимостей не создает конфликтов на следующем уровне до агрегации (поскольку они уже кажутся относительными в их одной банке ... или что-то в этом ряду :-)).

Смежные вопросы