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

时间:2010-06-22 10:07:03

标签: maven-2 java

我有一个场景,其中我的项目需要在不同的JDK中编译,并且根据所使用的JDK,生成的工件名称应该是不同的。例如,如果项目名称是MyProject并且我调用mvn install,那么它需要在JDK 1.4以及JDK 1.5中编译,最后我得到两个相同项目的jar(MyProjectJDK14-1.0和MyProjectJDK15-1.0)。有可能实现这个目标吗?

5 个答案:

答案 0 :(得分:35)

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引擎可以做到这一点)。

答案 1 :(得分:7)

您可以做的是定义两个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来构建您的应用程序,尤其是此工具的matrix feature,它允许您使用各种参数运行多个构建,在您的情况下是JDK。< / p>

答案 2 :(得分:2)

使用Maven配置文件。在project的{​​{1}}标记中添加此部分:

pom.xml

请参阅this了解有关个人资料的详情。

答案 3 :(得分:1)

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

我认为这些需要不同的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>

答案 4 :(得分:0)

实际上有一种方法可以用一个构建产生多个WAR(我猜这也适用于JAR):你可以使用具有多个执行的程序集插件来构建不同的描述符。