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