У меня есть сценарий, в котором мой проект должен быть скомпилирован в разных JDK, и результирующее имя артефакта должно отличаться в зависимости от используемого JDK. Например, если именем проекта является MyProject, и я вызываю mvn install, его необходимо скомпилировать в JDK 1.4, а также JDK 1.5, и, наконец, я получаю две банки одного и того же проекта (MyProjectJDK14-1.0 и MyProjectJDK15-1.0). Можно ли это достичь?
Построение такого же проекта в Maven с различными артефактами (на основе JDK)
Ответ 1
Способ 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).
Ответ 2
Что вы можете сделать, так это определить два profiles, по одному на используемый 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>
Затем в каждом профиле вы определяете конкретный <finalName>
, который будет использоваться для обозначения сгенерированного файла JAR.
Таким образом, если вы создаете приложение с использованием JDK 1.4, сгенерированный JAR будет называться myBuild-jdk1.4.jar
.
Если ваш окончательный пакет построен с использованием сборки, вы можете просто изменить внутренний блок <build>
внутри профилей, чтобы настроить плагин сборки (например, <finalName>
).
Относительно вашего комментария: действительно, для этой процедуры потребуются две отдельные сборки на Maven, так как вам нужно перекомпилировать весь проект при смене версии JDK. Одним из условий Maven2 является то, что один проект = один артефакт. Вы хотите иметь один проект с двумя артефактами.
В конечном итоге одним из решений является использование Hudson для создания вашего приложения, и особенно матрица этого инструмента, которая позволяет запускать несколько сборок с различными параметрами, в вашем случае JDK.
Ответ 3
Использовать профили 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>
Смотрите этот, чтобы узнать больше о профилях.
Ответ 4
Аналогичной проблемой являются различные варианты JDBC api, используемые в разных версиях JDK.
Я решил, что для этого нужны разные arifactIds, а не классификаторы.
Вы можете добиться этого, установив свойство в настройках, а затем ссылаясь на это в теге artifactId:
<project>
<modelVersion>4.0.0</modelVersion>
<artifactId>throwing-jdbc-${jdbc.version}</artifactId>
<name>Throwing JDBC</name>
<profiles>
<profile>
<id>jdbc3</id>
<activation>
<activeByDefault>false</activeByDefault>
<jdk>[1.3,1.4,1.5]</jdk>
</activation>
<properties>
<jdbc.version>3.0</jdbc.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.7</version>
<configuration>
<sources>
<source>src/jdbc3-variants/java</source>
</sources>
</configuration>
<executions>
<execution>
<goals>
<goal>add-source</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>jdbc4</id>
<activation>
<activeByDefault>false</activeByDefault>
<jdk>1.6</jdk>
</activation>
<properties>
<jdbc.version>4.0</jdbc.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<configuration>
<sources>
<source>src/jdbc4/java</source>
<source>src/jdbc4-variants/java</source>
</sources>
</configuration>
<executions>
<execution>
<goals>
<goal>add-source</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>jdbc41</id>
<activation>
<activeByDefault>false</activeByDefault>
<jdk>1.7</jdk>
</activation>
<properties>
<jdbc.version>4.1</jdbc.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<configuration>
<sources>
<source>src/jdbc4/java</source>
<source>src/jdbc4.1/java</source>
<source>src/jdbc4.1-variants/java</source>
</sources>
</configuration>
<executions>
<execution>
<goals>
<goal>add-source</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<sourceDirectory>src/main/java</sourceDirectory>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<phase>verify</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Ответ 5
На самом деле существует способ создания более одной WAR с одной сборкой (я думаю, это работает и для JAR): вы можете использовать плагин сборки с несколькими исполнениями для разных дескрипторов.