版本号可变的Maven模块

时间:2018-12-07 15:49:37

标签: java maven

我有一个具有以下结构的Maven项目:

模块A(父级),子模块B和子模块C

在父pom.xml中,我使用一个变量来设置所有项目的版本:

...
    <version>${revision}</version>
...
    <properties>
        <revision>1.1</revision>
    </properties>
...
    <modules>
        <module>moduleB</module>
        <module>moduleC</module>
    </modules>
</project>

模块C是我的分发软件包,它使用shade插件将所有内容包装到一个罐中。

在子模块中,我将父级设置如下:

<parent>
    <groupId>group</groupId>
    <artifactId>moduleA</artifactId>
    <version>${revision}</version>
</parent>

现在我想在另一个项目中使用模块C,但是这样做时只会出现以下错误:

无法对项目newProject执行目标:无法解析项目组的依赖项:newProject:jar:0.0.1-SNAPSHOT:无法在组:moduleC:jar:1.1上收集依赖项:无法读取组的工件描述符: moduleC:jar:1.1:在联系(NEXUS_URL)中找不到工件组:父项:pom:$ {revision}

我认为问题是,当将模块C引用为依赖项时,变量值未填写。我该如何解决这个问题?在构建并强制更新所有工件之前,我已经尝试清理项目,但是没有成功。

2 个答案:

答案 0 :(得分:1)

Maven希望所有模块都具有硬版本。

为避免编辑大量的pom,请使用版本插件,例如:

mvn versions:set -DnewVersion=1.0.1

如果在父项上运行上述命令,它将修复所有子项。

有关文档,请参见here

答案 1 :(得分:0)

感谢hadu.mansouri的评论,我可以解决它。我使用flatten-maven-plugin来平整pom.xml文件。但是,shade插件似乎有问题,因为阴影模块是唯一无法使用的模块。因此,在发布的阴影模块pom中说:

const createdStock = require('../../modified');

router.get('/new/:stockName', async (req,res) => {
   var stock = await createdStock(req.params.stockName);
   setTimeout(() => {
       console.log(stock);  
   }, 2000);

用于引用父级。我使用了评论中链接的文章的方法。在那里,使用了此扩展名:https://github.com/jcgay/unique-revision-maven-filtering

使用Maven而不是flatten-maven-plugin,Maven可以使用single version属性正确地构建多模块项目,并且我也可以在其他项目中正确使用阴影模块。