首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Maven原型中嵌入原型项目版本?

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

Stack Overflow用户
提问于 2011-08-29 02:32:54
回答 3查看 5.7K关注 0票数 18

我正在创建一个Maven原型,它将生成一个项目框架,该项目框架将包含对原型所源自的项目的依赖。

例如,原始项目如下所示:

代码语言:javascript
复制
origin/archetype/... archetype for generating project 
      /core/... core services 
      /extra/... extra services 

原型将生成一个带有POM的项目,该项目包含如下依赖关系:

代码语言:javascript
复制
<dependencies> 
  <dependency> 
    <groupId>com.foo</groupId> 
    <artifactId>origin-core</artifactId> 
    <version>SOMEVERSION</code> 
  </dependency> 
</dependencies> 

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

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

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

有没有其他方法来完成我在这里尝试做的事情?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-29 02:42:32

几天前,我在Maven邮件列表上问了上面的问题,得到了答案。幸运的是,我最终自己找到了答案。至少有一种明智的方法可以做到这一点:

在构建原型时,在您的src/main/resources/archetype-resources/pom.xml文件上使用Maven来替换当前项目版本。

这是如何做到的:

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

代码语言:javascript
复制
<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中需要保持原样的所有变量,以便它们可以在原型生成时被替换:

代码语言:javascript
复制
<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>

(注意,上面显示的<resources><pluginManagement>元素应该放在POM的<build>元素中。)

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

代码语言:javascript
复制
<?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>
票数 38
EN

Stack Overflow用户

发布于 2014-03-10 20:28:52

可接受答案的另一种解决方案是过滤archetype's descriptor/metadata文件中的默认属性

如下所示:

maven过滤只过滤这个文件:

代码语言:javascript
复制
<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>

原型元数据文件:

代码语言:javascript
复制
<archetype-descriptor ...>
    <requiredProperties>
        <requiredProperty key="projectVersion">
            <defaultValue>${project.version}</defaultValue>
         </requiredProperty>
    </requiredProperties>

    ...
</archetype-descriptor>

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

代码语言:javascript
复制
<?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中的所有属性值以及随之而来的资源插件配置。就我个人而言,我发现所有这些都很难看,很容易出错。

这确实意味着用户在生成原型时需要确认或更改项目版本。根据场景的不同,我猜这可能被认为是一件好事,也可能是件坏事。

票数 15
EN

Stack Overflow用户

发布于 2014-06-19 07:08:16

我尝试了一些相当愚蠢的东西,它似乎起作用了。我在META-INF/maven/archetype-metadata.xml文件中添加了以下内容:

代码语言:javascript
复制
<requiredProperties>
    <requiredProperty key="archetypeVersion"> </requiredProperty>
</requiredProperties>

你可能认为它会在默认情况下知道它,但它不是,所以这似乎提醒它使用它。也许是由于maven中的一个bug。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7223031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档