Построение одного и того же проекта в Maven с использованием различных артефактов (на основе используемого JDK) - PullRequest
21 голосов
/ 22 июня 2010

У меня есть сценарий, в котором мой проект должен быть скомпилирован в разных JDK, и получающееся имя артефакта должно отличаться в зависимости от используемого JDK.Например, если имя проекта MyProject и я вызываю mvn install, его нужно скомпилировать в JDK 1.4, а также в JDK 1.5, и, наконец, я получаю два фляги одного проекта (MyProjectJDK14-1.0 и MyProjectJDK15-1.0).Возможно ли этого добиться?

Ответы [ 5 ]

35 голосов
/ 22 июня 2010

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 может это сделать).

7 голосов
/ 22 июня 2010

Что вы можете сделать, это определить два профиля , по одному на каждый используемый 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.

2 голосов
/ 22 июня 2010

Использовать профили 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>

См. это , чтобы узнать больше о профилях.

1 голос
/ 04 июня 2014

Аналогичная проблема заключается в разных вариантах API JDBC, используемых в разных версиях JDK.

Я решил, что для этого нужны разные идентификаторы, а не классификаторы.

Этого можно добиться, установив свойство в настройках, а затем сославшись на него в теге 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>
0 голосов
/ 29 декабря 2010

На самом деле существует способ создать более одной WAR с одной сборкой (думаю, это работает и для JAR): вы можете использовать плагин сборки с несколькими выполнениями для разных дескрипторов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...