如何使用maven为项目创建不同的二进制版本?

时间:2015-12-07 03:34:46

标签: maven

我有一个具有依赖关系的项目。这个依赖项有不同的版本,我想用不同版本的这个依赖项作为整个tar吧发布我的项目。我是否需要单独执行不同的版本发布(目前我在一个版本中使用maven-assembly-plugin)。或者我可以使用任何maven插件?

1 个答案:

答案 0 :(得分:0)

在我看来,有几种解决方案是可能的,如下所述(最后一条建议):

使用属性

您可以使用属性作为依赖项版本的占位符,并通过命令行作为构建的一部分进行dinamically更改,因此每次将版本应用于新工件时都会更改。 因此,在您的pom中,您可以将属性定义如下:

<properties>
   ...
   <dependencyname.version>1.2</dependencyname.version>
</properties>

其中dependencyname是相关依赖关系的名称 然后,在依赖项部分中,您可以应用占位符,如下所示:

<dependencies>
   ...
   <dependency>
      <groupId>the-group-id</groupId>
      <artifactId>the-artifact-id</artifactId>
      <version>${dependencyname.version}</version>
   </dependency>
</dependencies>

然后,从命令行可以随时通过artifactId -D选项(name = value)传递它来覆盖此值

即。 mvn clean install -Ddependencyname.version=1.2

优势:您有一个集中点可以在运行时更改版本,或者作为构建的一部分进行硬编码。
Disavantage :您需要为每个版本构建一个版本,每次都需要手动更改版本。

使用个人资料

您可以使用配置文件,每个依赖项版本的配置文件。然后在运行时激活配置文件(使用您当前使用或您喜欢的版本的默认配置文件)并使用关联的版本生成相关工件。
因此,在您的代码中,您可以将配置文件定义如下:

<profiles>
...
   <profile>
        <id>dependency-name-v1.2</id>
        <dependencies>
           ...
           <dependency>
              <groupId>the-group-id</groupId>
              <artifactId>the-artifact-id</artifactId>
              <version>1.2</version>
           </dependency>
        </dependencies>
   </profile>
   <profile>
        <id>dependency-name-v1.3</id>
        <dependencies>
           ...
           <dependency>
              <groupId>the-group-id</groupId>
              <artifactId>the-artifact-id</artifactId>
              <version>1.3</version>
           </dependency>
        </dependencies>
   </profile>
</profiles>

激活配置文件后,它将在运行时覆盖相关依赖项的版本。任何时候您都可以通过命令行打开/关闭它,如下所示:

即。 mvn clean install -Pdependency-name-v1.2

优势:在个人资料中明确定义了所需的版本 Disavantage :您需要为每个版本构建一个版本,您需要在运行时根据要使用的版本手动更改配置文件名称。

使用模块

作为Maven的最佳实践,一个项目应该只有一个人工制品。因此,您可以拥有multimodule项目和每个不同版本的模块,并且一次生成所有版本/人工制品作为父/聚合器构建的一部分。因此,您也不需要上述情况的任何手动干预(在运行时更改属性值或激活某个配置文件)。
父/聚合器项目可以如下所示:

...
<packaging>pom</packaging>
...
<modules>
   <module>project-name-v1.2</module>
   <module>project-name-v1.3</module>
</modules>
...

每个模块都是提供另一个Maven项目的子文件夹。在每个模块中,您可以清楚地定义依赖关系和所需的版本。在构建父级时,您将级联构建所有模块并立即获取所有必需的人工制品。

即。 mvn clean installmvn clean install -pl module-1.2version只需构建一个模块/版本

优势:无需人工干预,关注点分离,可维护性 Disavantage :更复杂的构建(取决于习惯),审查项目的现有设计/结构。