2011-10-04 18 views
5

Mam projekt z modułem częściowym a:jar, który potrzebuje innego zestawu zależności, w zależności od platformy, dla której jest kompilowany. Kod jest taki sam dla wszystkich platform. Na przykład. w systemie Android biblioteka httpcomponents jest już dołączona do systemu operacyjnego, podczas gdy ja muszę dołączyć ją do kompilacji dla środowisk J2SE. Mam również inny submoduł, który składa kilka submodułów i ich zależności w archiwum. Jak mogę niezawodnie skonfigurować submoduł złożeniowy, aby pobrać wszystkie submoduły skompilowane dla danej platformy i ich zależności odpowiednie dla tej platformy?Kompilacje dla różnych platform w stylu Maven

Próbowałem używać profili do tworzenia a:jar:android i a:jar:j2se. Jednak deklarowanie zależności od jednego z nich powodowałoby dziwne zależności w złożeniu. Oznacza to, że dependency:tree projektu montażu czasami zawierałoby zależności od a:jar:j2se (nie ma znaczenia, czy zadeklarowałem użycie w zespole a:jar:android lub a:jar:j2se), a czasem drugie. Zmieniło się (często) po aktualizacji słoików a w lokalnym repozytorium. Przełączanie w projekcie złożenia wykorzystuje również profile.

Mogłabym rozwiązać ten by applying the same dependencies to the assembly project's profiles w zależności od profilu poszczególnych submodul. Ale ponieważ muszę powtarzać się w POMachach, istnieje prawdopodobnie bardziej celowy sposób, aby to osiągnąć. Jako że jestem całkiem nowy dla maven, zastanawiam się, co to jest? Nie chcę duplikować kodu (który byłby nawet bardziej powtarzalny, ponieważ kod pozostaje taki sam) i nie lubię duplikować części POM, ponieważ ich zmiana z powodu aktualizacji wersji może się skomplikować.

Jakiś konkretny materiał: zależne od a:jar „s POM:

<dependencies> 
    ..... 
    <dependency> 
     <groupId>org.apache.httpcomponents</groupId> 
     <artifactId>httpmime</artifactId> 
     <version>4.0.1</version> 
     <scope>compile</scope> 
     <!-- Exclusion in the common part, they are provided in the profiles from different sources --> 
     <exclusions> 
     <exclusion> 
      <groupId>org.apache.httpcomponents</groupId> 
      <artifactId>httpclient</artifactId> 
     </exclusion> 
     .... 
     </exclusions> 
    </dependency> 
    </dependencies> 
    <profiles> 
    <profile> 
     <id>android</id> 
     <dependencies> 
     <dependency> 
      <groupId>com.google.android</groupId> 
      <artifactId>android</artifactId> 
      <version>1.6_r2</version> 
      <scope>provided</scope> 
     </dependency> 
     </dependencies> 
    </profile> 
    <profile> 
     <id>java</id> 
     <dependencies> 
     <dependency> 
      <groupId>org.apache.httpcomponents</groupId> 
      <artifactId>httpclient</artifactId> 
      <version>4.0.1</version> 
      <scope>compile</scope> 
     </dependency> 
     <dependency> 
      <groupId>commons-codec</groupId> 
      <artifactId>commons-codec</artifactId> 
      <version>1.3</version> 
      <scope>compile</scope> 
     </dependency> 
     </dependencies> 
    </profile> 
    </profiles> 

Projekt montażu (który używa Assembly Plugin Maven) Profile:

<profiles> 
    <profile> 
     <id>android</id>  
     <dependencies> 
     <dependency> 
      <groupId>a</groupId> 
      <artifactId>a</artifactId> 
      <version>${project.version}</version> 
      <classifier>android</classifier> 
      <type>jar</type> 
     </dependency> 
     <!-- Duplicate --> 
     <dependency> 
      <groupId>com.google.android</groupId> 
      <artifactId>android</artifactId> 
      <version>1.6_r2</version> 
      <scope>provided</scope> 
     </dependency> 
     <!-- Duplicate --> 
     </dependencies> 
    </profile> 
    <profile> 
     <id>java</id> 
     <dependencies> 
     <!-- Duplicate --> 
     <dependency> 
      <groupId>org.apache.httpcomponents</groupId> 
      <artifactId>httpclient</artifactId> 
      <version>4.0.1</version> 
      <scope>compile</scope> 
     </dependency> 
     <dependency> 
      <groupId>commons-codec</groupId> 
      <artifactId>commons-codec</artifactId> 
      <version>1.3</version> 
      <scope>compile</scope> 
     </dependency> 
     <!-- /Duplicate --> 
     <dependency> 
      <groupId>a</groupId> 
      <artifactId>a</artifactId> 
      <version>${project.version}</version> 
      <classifier>java</classifier> 
     <type>jar</type> 
     </dependency> 
     </dependencies> 
    </profile> 
    </profiles> 

Chciałbym pozbyć zaznaczone deklaracje zależności.

Odpowiedz

3

Istnieje kilka rozwiązań:

  1. zależności Te modułem mogłoby zostać uznane za „pod warunkiem”, w tym przypadku w projekcie dołączyć zależność do modułem wraz z wyraźnymi zależnościami, które platforma nie ma .

  2. Użyj <exclusions> dla niepotrzebnych zależności.

  3. Używając (1) lub (2) powyżej stwórz kolejne "strukturalne" submoduły a-android: pom a-j2se: pom, które po prostu opisują zależności i użyj tych modułów z twoich projektów.

+0

Więc dla (3), "a-JSE: pom" odziedziczy od "A". W "POM" nie deklaruję żadnych (lub tylko wspólnych) zależności. W projekcie montażu zależałbym od "a-jse: pom" - czy to prawda? To brzmi jak dobry sposób ... – Stephan

+0

Tak, prawda.Myślę, że musisz zadeklarować niektóre zależności w "a", ponieważ mogą one być konieczne do kompilacji. Dlatego musisz zrobić (1) lub (2). Nie należy też mylić słowa "montaż", nie ma to nic wspólnego z "Maven Assembly Plugin". – kan

+0

Zaktualizowałem oryginalny wpis, aby zawierał bardziej konkretny kod. W tej chwili staram się dowiedzieć, w jaki sposób "a" i "a-j2se" muszą poprawnie dziedziczyć. – Stephan

2

Możesz dodać profil maven, aby pom i aktywować każdy profil w oparciu o system operacyjny. Aktywacja profilu obsługuje takie opcje. Następnie w każdym profilu specyficznym dla systemu operacyjnego można wyświetlić opcjonalne zależności. Oto artykuł na profilach ->http://maven.apache.org/guides/introduction/introduction-to-profiles.html

W twoim przypadku będzie to coś takiego:

<profiles> 
    <profile> 
    <activation> 
     <os> 
     <family>Windows</family> 
     </os> 
    </activation> 
    <dependencies> 
     ... specific dependencies for Windows 
    </dependencies> 
    <plugins> 
     ... specific build plugins for Windows 
    </plugins> 
    </profile> 
    <profile> 
    <activation> 
     <os> 
     <family>unix</family> 
     </os> 
    </activation> 
    <dependencies> 
     ... specific dependencies for unix 
    </dependencies> 
    <plugins> 
     ... specific build plugins for unix 
    </plugins> 
    </profile> 
    <dependencies> 
    ... Common dependencies 
    <dependencies> 
    <plugins> 
    ... Common build plugins 
    </plugins> 
</profiles> 
+2

Profil specyficzny dla systemu operacyjnego nie jest tutaj odpowiedni. To zależy od systemu operacyjnego, ale nie od docelowego systemu operacyjnego. Co więcej, bardzo możliwe, że konieczne będzie jednoczesne zbudowanie kilku projektów dla kilku platform docelowych. – kan

+0

@kan. Zawsze możesz wygenerować artefakty specyficzne dla systemu operacyjnego (w rzeczywistości MUSISZ zrobić to, jeśli udostępniasz różne komponenty dla różnych systemów operacyjnych). Ponadto, podczas budowania wersji, możesz aktywować profile według nazwy, dzięki czemu możesz zbudować wszystkie profile wymagane na serwerze CI i tylko te odpowiednie dla twojego środowiska deweloperskiego na twoim komputerze. –

+0

Jeśli używałbyś różnych modułów dla różnych OS-ów, możesz utworzyć plik pom.xml root, który będzie zawierał je wszystkie jako '' i zbudować wszystko na raz. W przypadku profili musisz kilkakrotnie wywoływać maven z włączonymi różnymi profilami. – kan

Powiązane problemy