如何在Maven原型中嵌入原型项目版本?

2022-09-02 19:21:06

我正在创建一个 Maven 原型,它生成一个项目框架,其中包含对原型起源的项目的依赖关系。

例如,源项目如下所示:

origin/archetype/... archetype for generating project 
      /core/... core services 
      /extra/... extra services 

原型将生成一个具有POM的项目,其中包含如下依赖项:

<dependencies> 
  <dependency> 
    <groupId>com.foo</groupId> 
    <artifactId>origin-core</artifactId> 
    <version>SOMEVERSION</code> 
  </dependency> 
</dependencies> 

我希望SOMEVERSION在构建原型并将其安装到存储库中时成为原始项目的版本。

因此,如果原始项目的版本为1.0-SNAPSHOT并且是ed的,那么我希望原型生成对的依赖关系。当原始项目发布并自动升级到1.0版本时,我希望原型生成对.mvn installorigin-core 1.0-SNAPSHOTorigin-core 1.0

基本上,我想在原型POM中用作速度变量,但这似乎是不可能的。${archetypeVersion}

有没有其他方法可以完成我在这里想要做的事情?


答案 1

几天前,我在Maven邮件列表中问了上述问题,并得到了风滚草。幸运的是,我最终自己想通了。以下是至少一种合理的方法来实现这一目标:

在构建原型时,对文件使用 Maven 筛选以替换当前项目版本。src/main/resources/archetype-resources/pom.xml

这是如何完成的:

修改您的文件以启用对文件的过滤,而不是对其他任何内容的过滤(因为您的原型文件自然会到处都是,并且您不希望在构建时替换它们,您希望在创建原型时替换它们)。archetype/pom.xmlarchetype-resources/pom.xml${variable}

<resources>
  <resource>
    <directory>src/main/resources</directory>
    <filtering>true</filtering>
    <includes>
      <include>archetype-resources/pom.xml</include>
    </includes>
  </resource>
  <resource>
    <directory>src/main/resources</directory>
    <filtering>false</filtering>
    <excludes>
      <exclude>archetype-resources/pom.xml</exclude>
    </excludes>
  </resource>
</resources>

启用转义字符以便在过滤时使用,以便您可以转义原型 pom 中需要保持原样的变量,以便在原型生成时替换它们:

<pluginManagement>
  <plugins>
    ...
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-resources-plugin</artifactId>
      <version>2.5</version>
      <configuration>
        <escapeString>\</escapeString>
      </configuration>
    </plugin>
  </plugins>
</pluginManagement>

(请注意,上面显示的 和 元素应放置在 POM 的元素内。<resources><pluginManagement><build>

在原型 pom 中使用,您希望在其中插入原型项目的版本,并转义所有其他变量,这些变量在原型生成之前应保持未替换状态:${project.version}

<?xml version="1.0" encoding="UTF-8"?>
<project ...>
  <modelVersion>4.0.0</modelVersion>

  <groupId>\${groupId}</groupId>
  <artifactId>\${artifactId}</artifactId>
  <version>\${version}</version>
  <packaging>jar</packaging>

  <dependencies>
    <dependency>
      <groupId>com.foo</groupId>
      <artifactId>origin-core</artifactId>
      <version>${project.version}</version>
    </dependency>
  </dependencies>

</project>

答案 2

已接受答案的替代解决方案是筛选原型的描述符/元数据文件中的默认属性

这是这样完成的:

maven 过滤仅过滤此文件:

<resources>
<resource>
    <directory>src/main/resources</directory>
    <filtering>true</filtering>
    <includes>
        <include>META-INF/maven/archetype-metadata.xml</include>
    </includes>
</resource>
<resource>
    <directory>src/main/resources</directory>
    <filtering>false</filtering>
    <excludes>
        <exclude>META-INF/maven/archetype-metadata.xml</exclude>
    </excludes>
</resource>
</resources>

原型元数据文件:

<archetype-descriptor ...>
    <requiredProperties>
        <requiredProperty key="projectVersion">
            <defaultValue>${project.version}</defaultValue>
         </requiredProperty>
    </requiredProperties>

    ...
</archetype-descriptor>

并且原型的 POM 将与之前类似,只是它将使用所需的属性值作为项目版本:projectVersion

<?xml version="1.0" encoding="UTF-8"?>
<project ...>
  <modelVersion>4.0.0</modelVersion>

  <groupId>${groupId}</groupId>
  <artifactId>${artifactId}</artifactId>
  <version>${version}</version>
  <packaging>jar</packaging>

  <dependencies>
    <dependency>
      <groupId>com.foo</groupId>
      <artifactId>origin-core</artifactId>
      <version>${projectVersion}</version>
    </dependency>
  </dependencies>

</project>

这种方法的优点是,它避免了必须转义原型POM和随之而来的资源插件配置中的所有属性值。就个人而言,我发现所有这些都非常丑陋且容易出错。

这确实意味着在生成原型时要求用户确认或更改项目版本。根据情况,我想这可能被认为是一件好事或坏事。


推荐