У меня есть клиентская банка, которую нужно скомпилировать с помощью jdk 1.5 и jdk 1.6. Я хочу сохранить те же artifactId и версию. Я планирую использовать maven classifier для загрузки артефакта из нексуса. Хотя я использую профиль jdk5
для создания jar (mvn clean install -Pjdk5
), просматривая файл манифеста, я нахожу это - Build-Jdk: 1.6.0_51
Как получить оба артефакта с помощью одной команды сборки maven?
<profiles>
<profile>
<id>jdk5</id>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.5</source>
<target>1.5</target>
<fork>true</fork>
<executable>${JAVA_HOME}/bin/javac</executable>
</configuration>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<classifier>jdk5</classifier>
</configuration>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>jdk6</id>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<fork>true</fork>
</configuration>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<classifier>jdk6</classifier>
</configuration>
</plugin>
</plugins>
</build>
</profile>
Запись манифеста (Build-Jdk) не сообщает jdk, который использовался для компиляции, но $ {java.version}. Чтобы иметь различный манифест в 2 баночках, проще всего написать свои собственные (2 *) манифесты.
Вы можете сделать это в одной команде mvn без профиля (обратите внимание: плохой практикой является наличие двух артефактов, созданных из одного pom)
Вам нужно удвоить компилятор, jar (или другую упаковку) и плагины ресурсов. В этом примере создайте jdk1.8 jar (с классификатором) в дополнение к jar.
Будьте осторожны, я использую абсолютный путь, чтобы указать на путь 2 jdk bin, это не будет работать в проекте непрерывной интеграции.
maven doc: Компиляция источников с использованием другого JDK
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.erbre.test</groupId>
<artifactId>multi-compilation</artifactId>
<version>0.0.1-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<executions>
<execution>
<id>default-compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
<configuration>
<source>1.7</source>
<target>1.7</target>
<fork>true</fork>
<executable>C:\Program Files\Java\jdk1.7.0_79\bin\javac</executable>
</configuration>
</execution>
<execution>
<id>default-testCompile</id>
<phase>test-compile</phase>
<goals>
<goal>testCompile</goal>
</goals>
<configuration>
<source>1.7</source>
<target>1.7</target>
<fork>true</fork>
<executable>C:\Program Files\Java\jdk1.7.0_79\bin\javac</executable>
</configuration>
</execution>
<execution>
<id>default-compile-jdk1.8</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
<configuration>
<fork>true</fork>
<outputDirectory>${project.build.outputDirectory}_jdk1.8</outputDirectory>
<executable>C:\Program Files\Java\jdk1.8.0_45\bin\javac</executable>
<source>1.7</source>
<target>1.8</target>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>default-package</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
<execution>
<id>default-package-jdk1.8</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<classesDirectory>${project.build.outputDirectory}_jdk1.8</classesDirectory>
<classifier>jdk1.8</classifier>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>default-testResources</id>
<phase>process-test-resources</phase>
<goals>
<goal>testResources</goal>
</goals>
</execution>
<execution>
<id>default-resources</id>
<phase>process-resources</phase>
<goals>
<goal>resources</goal>
</goals>
</execution>
<execution>
<id>default-resources-jdk1.8</id>
<phase>process-resources</phase>
<goals>
<goal>resources</goal>
</goals>
<configuration>
<outputDirectory>${project.build.outputDirectory}_jdk1.8</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Вы учли, что двоичные файлы, скомпилированные с помощью jdk 5, будут совместимы с jre 6 или выше? В новой версии jre всегда выполняются двоичные файлы, скомпилированные со старой версией jdk.
source
и target
настройки на maven-compiler-plugin просто устанавливают проверку исходного кода и минимальную целевую среду выполнения, для которой он предназначен. Поэтому в вашем случае я рекомендую вам установить источник и цель на 1,5
Если вам действительно нужно скомпилировать как с jdk5, так и с 6, вы можете установить JAVA_HOME env var в соответствующую установку jdk и запустить команду maven для каждой версии.
Если вы хотите проверить это, в командной строке перед компиляцией сделайте mvn -version
. Он расскажет вам, какая версия jdk используется
${myvar}
) как часть версии и предоставить его, используя-Dmyvar=jdk5
для различения артефакта.