2009-05-11 6 views
21

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

Я хотел бы использовать Maven для вычисления зависимостей и поместить все банки, общие для нескольких войн, в корень EAR.

Я попытался организовать свой проект с использованием архетипа j2ee (maven-archetype-j2ee-simple), но все войны все еще упакованы с зависимостями внутри WEB-INF/lib. Есть ли способ заставить Maven рассчитать общие зависимости и поместить их в EAR, так же, как он может вычислить все переходные зависимости при построении войны или банки?

ответ

8

Создать новый артефакт под названием Викисклад банки и упаковать его в качестве П. Это должно зависеть от всех обычных банок, которые вы используете: Spring, Hibernate, Log4j и т. Д.

Затем в каждом из ваших войн добавьте его как зависимость с областью «при условии» (и не забудьте установить тип как pom). Вы сможете увидеть это в своем классе, но они не будут упакованы в войну. Таким образом, вы можете также иметь специфические для войны специфические зависимости, которые решение от skinny wars не предоставляет.

+0

Итак, после создания commons-jars.jar, следует ли добавить это к 1) server/default/lib или 2) root уха? – Rips

+2

НЕ лучший способ пойти, см. Следующий ответ! – Christophe

+1

@toefel, пожалуйста, определите «следующий» ответ. Ответ WHOM или ссылки был бы полезен, потому что они могли бы переключать места на основе голосов. – Ben

4

Вы можете установить dependancies scope в "условии". Это означает, что они будут предоставлены другим модулем и не будут включены в финальную банку или войну.

Возможно, assembly plugin может помочь вам при упаковке окончательного EAR и разместить там общие банки.

4
+4

из предложенного URL: «Теперь болезненная часть. В pom.xml вашего проекта EAR необходимо указать каждую зависимость, которую имеет WAR. потому что Maven принимает живые WAR и не включает транзитивные зависимости WARs в EAR ». Я спросил: я хотел бы использовать Maven для вычисления зависимостей ... без использования Maven для вычисления зависимостей, это не-go ... – Dan

+1

@Dan, читайте Turbokiwi ответ, чтобы знать, как избежать болезненной части превосходным образом :) –

59

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

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

Единственный правильный путь, чтобы получить тощие войны от примеров: http://maven.apache.org/plugins/maven-war-plugin/examples/skinny-wars.html

Но и теперь приходит интересная часть, есть один большой! ярлык (который полностью устраняет указанную боль), чтобы сообщить maven, какие зависимости от вашей WAR.

Зайдите в свой EAR-модуль, чтобы заявить о второй зависимости от WAR с типом pom для каждой зависимости от WAR.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
<modelVersion>4.0.0</modelVersion> 
<parent> 
    <groupId>com.foo</groupId> 
    <artifactId>skinny</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
</parent> 
<artifactId>ear</artifactId> 
<packaging>ear</packaging> 
<dependencies> 
    <dependency> 
     <groupId>com.foo</groupId> 
     <artifactId>war</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
     <type>war</type> 
    </dependency> 
    <dependency> 
     <groupId>com.foo</groupId> 
     <artifactId>war</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
     <type>pom</type> 
    </dependency> 
</dependencies> 
<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-ear-plugin</artifactId> 
      <version>2.8</version> 
      <configuration> 
       <skinnyWars>true</skinnyWars> 
       <defaultLibBundleDir>lib</defaultLibBundleDir> 
       <modules> 
        <webModule> 
         <groupId>com.foo</groupId> 
         <artifactId>war</artifactId> 
        </webModule> 
       </modules> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

Теперь каждый WAR будет упакован независимо друг от друга с его собственными зависимостями и EAR будет упакован с тощими войнами и каждую зависимостью внутри Lib папки

Update:

Имейте в виду, что папка ear/lib не может использоваться для каждой банки зависимости в строгом контейнере, таком как JBoss EAP 6. Библиотеки компонентов JSF, такие как tomahawk, primefaces и т. Д., Должны иметь e в папке WEB-INF/lib.

Удобный способ для достижения этой цели с описанным выше раствором, чтобы сделать исключение для библиотеки компонентов в pom.xml Ушей, как это:

... 
<dependencies> 
    <dependency> 
     <groupId>com.foo</groupId> 
     <artifactId>war</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
     <type>war</type> 
    </dependency> 
    <dependency> 
     <groupId>com.foo</groupId> 
     <artifactId>war</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
     <type>pom</type> 
     <exclusions> 
      <exclusion> 
       <groupId>org.primefaces</groupId> 
       <artifactId>primefaces</artifactId> 
      <exclusion> 
     </exclusions> 
    </dependency> 
</dependencies> 
... 

Теперь каждая зависимость от WAR будет помещена в ухо/lib, за исключением библиотеки компонентов, которая будет помещена в WEB-INF/lib внутри WAR

+5

Это поистине удивительная битва обмана. – Snekse

+4

Этот *** действительно *** нужен ** TONS ** больше upvotes !! Потрясающие ! : D –

+1

NICE! :) Это действительно помогло мне! – Christophe

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