У меня есть проект с подмодулем a:jar
, для которого требуется различный набор зависимостей, в зависимости от того, для какой платформы он компилируется. Код одинаков для всех платформ. Например. в Android библиотека httpcomponents уже включена в состав ОС, в то время как я должен включить ее для сборок для сред J2SE. У меня также есть другой подмодуль, который собирает несколько подмодулей и их зависимости в архив. Как я могу надежно настроить подмодуль сборки, чтобы взять все подмодули, скомпилированные для соответствующей платформы, и их зависимости, подходящие для этой платформы?
Я пытался использовать профили для создания a:jar:android
и a:jar:j2se
. Однако объявление зависимости от одного из них может привести к странным зависимостям в сборке. То есть, dependency:tree
проекта сборки иногда включает в себя зависимости от a:jar:j2se
(не имеет значения, объявил ли я использовать a:jar:android
или a:jar:j2se
в сборке), а иногда и другие. Это изменилось (часто) после того, как я обновил jar a
в локальном хранилище. Переключение в сборочном проекте использует также профили.
Я мог бы решить это , применив те же зависимости к профилям проекта сборки , которые необходимы для профиля отдельных подмодулей. Но поскольку я должен повторить себя в POM, есть, вероятно, более мудрый способ достичь этого. Поскольку я новичок в Maven, мне интересно, что это? Я не хочу дублировать код (это было бы еще более повторяющимся, поскольку код остался прежним), и я не хотел бы дублировать части POM, так как их изменение из-за обновления версий может быть сложным.
Некоторый конкретный материал: Зависимости от a:jar
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>
Профили сборки (в которой используется подключаемый модуль Maven Assembly):
<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>
Я бы хотел избавиться от помеченных объявлений зависимостей.