使用不同的artifactid在Maven中构建相同的项目(基于使用的JDK)

问题描述 投票:0回答:5

我有一个场景,我的项目需要在不同的 JDK 中编译,并且生成的工件名称应该根据所使用的 JDK 不同。例如,如果项目名称是

MyProject
,我调用
mvn install
,那么它需要在
JDK 1.4
JDK 1.5
中编译,最后我得到同一个项目的两个jar:
MyProjectJDK14-1.0
 MyProjectJDK15-1.0

有可能实现这个目标吗?

maven-2 java
5个回答
39
投票

执行此操作的 Maven 方法不是更改工件的

finalName
,而是使用 classifier。例如:

<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 构建两次才能生成两个 jar(一个不错的 CI 引擎可以做到这一点)。


8
投票

您可以做的是定义两个配置文件,每个使用的 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 来构建您的应用程序,尤其是该工具的 matrix 功能,它允许您使用各种参数(在您的情况下为 JDK)运行多个构建。


2
投票

使用 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 了解有关配置文件的更多信息。


1
投票

类似的问题是不同版本的 JDK 中使用的 JDBC api 的不同变体。

我认为这些需要不同的 arifactId,而不是分类器。

您可以通过在设置中设置一个属性,然后在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
投票

实际上有一种方法可以通过一个构建生成多个 WAR(我猜这也适用于 JAR):您可以使用程序集插件,对不同的描述符进行多次执行。

© www.soinside.com 2019 - 2024. All rights reserved.