У меня есть сценарий, где мой проект должен быть скомпилирован в другом JDKs, и получающееся имя артефакта должно отличаться на основе используемого JDK. Например, если названием проекта является MyProject, и я называю установку mvn затем, это должно быть скомпилировано в JDK 1.4, а также JDK 1.5, и наконец я получаю две банки того же проекта (MyProjectJDK14-1.0 и MyProjectJDK15-1.0). Возможно достигнуть этого?
В Maven для этого не нужно менять finalName
артефакта, а нужно использовать классификатор. Например:
<project>
...
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<classifier>${envClassifier}</classifier>
</configuration>
</plugin>
</plugins>
</build>
...
<profiles>
<profile>
<id>jdk16</id>
<activation>
<jdk>1.6</jdk>
</activation>
<properties>
<envClassifier>jdk16</envClassifier>
</properties>
</profile>
<profile>
<id>jdk15</id>
<activation>
<jdk>1.5</jdk>
</activation>
<properties>
<envClassifier>jdk15</envClassifier>
</properties>
</profile>
</profiles>
</project>
Артефакт JAR будет назван ${finalName}-${envClassifier}.jar
и включен в качестве зависимости с использованием следующего синтаксиса:
<dependency>
<groupId>com.mycompany</groupId>
<artifactId>my-project</artifactId>
<version>1.0</version>
<classifier>jdk16</classifier>
</dependency>
Вам придется вызвать сборку Maven дважды, чтобы получить оба банка (приличный механизм CI может это сделать).
Что вы можете сделать, так это определить два профиля, по одному на каждый используемый JDK. Каждый профиль будет активирован в зависимости от того, какой JDK используется:
<profiles>
<profile>
<id>profile-for-jdk1.4</id>
<activation>
<activeByDefault>false</activeByDefault>
<jdk>1.4</jdk>
</activation>
<build>
<finalName>myBuild-jdk1.4</finalName>
</build>
</profile>
<profile>
<id>profile-for-jdk1.5</id>
<activation>
<activeByDefault>false</activeByDefault>
<jdk>1.5</jdk>
</activation>
<build>
<finalName>myBuild-jdk1.5</finalName>
</build>
</profile>
</profiles>
Затем в каждом профиле вы определяете определенное
, которое будет использоваться для названия сгенерированного JAR-файла.
Таким образом, если вы собираете свое приложение, используя JDK 1.4, сгенерированный JAR будет называться myBuild-jdk1.4.jar
.
Если ваш конечный пакет собирается с использованием сборки, вы можете просто изменить блок
внутри профилей для настройки плагина сборки (например, на
).
По поводу вашего комментария: Действительно, эта процедура потребует двух отдельных сборок на Maven, так как вам придется перекомпилировать весь проект при смене версии JDK. Одна из конвенций Maven2 заключается в том, что один проект = один артефакт. Вы же хотите иметь один проект с двумя артефактами.
В конечном итоге, одним из решений является использование Hudson для сборки приложения, и особенно матричной функции этого инструмента, которая позволяет запускать несколько сборок с различными параметрами, в вашем случае JDK.
Использовать профили Maven. Добавьте этот раздел в тег project
вашего pom.xml
:
<profiles>
<profile>
<activation>
<jdk>1.4</jdk>
</activation>
<build>
<finalName>${project.artifactId}-${project.version}-JDK1.4</finalName>
</build>
</profile>
<profile>
<activation>
<jdk>1.5</jdk>
</activation>
<build>
<finalName>${project.artifactId}-${project.version}-JDK1.5</finalName>
</build>
</profile>
</profiles>
Смотрите this, чтобы узнать больше о профилях.