2009-05-11 8 views
21

Mamy rozwiązanie z wieloma wojnami. Wojny są podobne w tym sensie, że wszyscy używają hibernacji i wiosny. Oznacza to, że w każdej wojnie mamy wiele takich samych słoików. Staje się to problemem, ponieważ rozmiar ucha zaczyna rosnąć nieproporcjonalnie.Jak zmusić mave'a do umieszczenia wszystkich słoików wspólnych dla wojen w tym samym pliku EAR do katalogu głównego EAR?

Chciałbym użyć Mavena do obliczenia zależności i umieszczenia wszystkich słoików wspólnych dla wielu wojen w katalogu głównym EAR.

Próbowałem zorganizować mój projekt za pomocą archetypu j2ee (maven-archetype-j2ee-simple), ale wszystkie wojny są nadal pakowane z zależnościami wewnątrz WEB-INF/lib. Czy istnieje sposób zmusić Mavena do obliczania wspólnych zależności i umieszczania ich w EAR, tak jak jest on w stanie obliczyć wszystkie przejściowe zależności podczas konstruowania wojny lub słoika?

Odpowiedz

8

Utwórz nowy artefakt o nazwie Commons słoiki i pakować go jako pom. Powinno to zależeć od wszystkich popularnych jarów, z których korzystasz - Spring, Hibernate, Log4j, itd.

Następnie, w każdej wojnie dodaj ją jako zależność z zakresem "pod warunkiem" (i nie zapomnij ustawić typu jako pom). Będziesz mógł zobaczyć to w swojej klasie, ale nie zostaną zapakowani w wojnę. W ten sposób można również umieścić zależne od wojny zależności, które nie zapewnia rozwiązanie z skinny wars.

+0

Po utworzeniu commons-jars.jar, powinniśmy dodać to do 1) server/default/lib lub 2) ear root? – Rips

+2

NIE najlepszy sposób, aby przejść, patrz następna odpowiedź! – Christophe

+1

@toefel, określ "następną" odpowiedź. Odpowiedź WHOM lub link będzie pomocna, ponieważ mogą zmieniać miejsca na podstawie głosów. – Ben

4

Możesz ustawić dependancies scope na "dostarczone". Oznacza to, że zostaną dostarczone przez jakiś inny moduł i nie zostaną włączone do ostatecznego słoja lub wojny.

Być może assembly plugin może pomóc w pakowaniu ostatecznego EAR i umieszczeniu tam wspólnych słoików.

4
+4

z sugerowanego adresu URL: "Teraz część bolesna Pom.xml twojego projektu EAR musi wyświetlić listę wszystkich zależności, które ma WAR. to dlatego, że Maven przyjmuje fatalne WAR i nie uwzględnia przejściowych zależności WAR od EAR. " Zapytałem: Chciałbym użyć Mavena do obliczenia zależności ... bez użycia Mavena do obliczenia zależności, to jest nie-idź ... – Dan

+1

@Dan, przeczytaj odpowiedź Turbokiwi aby wiedzieć, jak uniknąć bolesnej części w doskonały sposób :) –

59

Jak już wspomniałeś w komentarzu, zadaniem maven jest obliczyć każdą zależność. Kiedy tworzysz artefakt, przy każdej wspólnej zależności, musisz także zgadywać, które zależności należą do niego.

Może być również możliwe, że musisz wdrożyć jedną wojnę, z jej zależnościami na innej maszynie bez ucha, a kiedy ustawisz każdą zależność wojenną pod warunkiem, to utkniesz ponownie.

Jedynym właściwym sposobem, aby dostać chude Wars to z przykładów: http://maven.apache.org/plugins/maven-war-plugin/examples/skinny-wars.html

Ale i teraz jest interesujący, jest jeden duży! skrót (który całkowicie usuwa wspomniany ból), aby powiedzieć mavenowi, jakie zależności mają twoje WAR.

Wejdź do swojego modułu EAR i zadeklaruj drugą zależność od WAR z typem pom dla każdej zależności 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> 

Teraz każda wojna będzie pakowany niezależnie z jego własnych uzależnień i EAR zostaną zapakowane z chudych wojen i każdego uzależnienia w folderze lib

Aktualizacja:

Należy pamiętać, że folder ear/lib nie może być używany dla każdego zasobu zależności w ścisłym kontenerze, takim jak JBoss EAP 6. Biblioteki komponentów JSF, takie jak tomahawk, prymitywów itp. Muszą e w folderze WEB-INF/lib.

wygodnym sposobem do osiągnięcia tego celu z wyżej opisanego rozwiązania jest to, aby wykluczenie dla biblioteki komponentów w pom.xml uszach jak ten:

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

Teraz każdy zależność wojny zostaną umieszczone w ear/lib z wyjątkiem biblioteki komponentów, która zostanie umieszczona w WEB-INF/lib wewnątrz WAR

+5

To naprawdę niesamowita sztuczka. – Snekse

+4

To *** naprawdę potrzebuje ** TONY ** więcej upvotes !! Niesamowite ! : D –

+1

ŁADNE! :) to naprawdę mi pomogło! – Christophe

Powiązane problemy