компилирование jar с другой версией jdk с использованием maven

1

У меня есть клиентская банка, которую нужно скомпилировать с помощью jdk 1.5 и jdk 1.6. Я хочу сохранить те же artifactId и версию. Я планирую использовать maven classifier для загрузки артефакта из нексуса. Хотя я использую профиль jdk5 для создания jar (mvn clean install -Pjdk5), просматривая файл манифеста, я нахожу это - Build-Jdk: 1.6.0_51

  • Является ли файл манифеста jar, который скажет версию jdk, с которой был скомпилирован артефакт?
  • Как получить оба артефакта с помощью одной команды сборки 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>
    

Теги:
maven

2 ответа

1

Запись манифеста (Build-Jdk) не сообщает jdk, который использовался для компиляции, но $ {java.version}. Чтобы иметь различный манифест в 2 баночках, проще всего написать свои собственные (2 *) манифесты.

maven doc: манифест

Вы можете сделать это в одной команде 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>

0

Вы учли, что двоичные файлы, скомпилированные с помощью jdk 5, будут совместимы с jre 6 или выше? В новой версии jre всегда выполняются двоичные файлы, скомпилированные со старой версией jdk.

source и target настройки на maven-compiler-plugin просто устанавливают проверку исходного кода и минимальную целевую среду выполнения, для которой он предназначен. Поэтому в вашем случае я рекомендую вам установить источник и цель на 1,5

Если вам действительно нужно скомпилировать как с jdk5, так и с 6, вы можете установить JAVA_HOME env var в соответствующую установку jdk и запустить команду maven для каждой версии.

Если вы хотите проверить это, в командной строке перед компиляцией сделайте mvn -version. Он расскажет вам, какая версия jdk используется

  • 0
    Вы ответили на одну часть правильно. mvn -version и manifest оба показывают jdk, который установлен как JAVA_HOME. В этом случае я не вижу использования исполняемой конфигурации. Как мне собрать оба артефакта вместе?
  • 0
    Я не думаю, что это возможно, используя одну команду Maven. Лучше всего использовать скрипт, который запускает 2 команды maven с каждым jdk соответственно. Вы можете использовать maven variablue ( ${myvar} ) как часть версии и предоставить его, используя -Dmyvar=jdk5 для различения артефакта.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню