使版本:update-child-modules在版本:prepare上执行

时间:2018-08-24 14:46:26

标签: maven

是否可以在Maven的release:prepare上触发DECLARE @clients TABLE (PATIENT_NAME nvarchar(max)); INSERT INTO @clients VALUES (' Doe John B ') ,(' Doe Jane C ') ,(' Doe Jill ') ;WITH Splitted AS ( SELECT PATIENT_NAME as ORIGINAL_PATIENT_NAME ,REPLACE(REPLACE(REPLACE(ltrim(rtrim(PATIENT_NAME)),' ','<>'),'><',''),'<>',' ') as PATIENT_NAME ,CAST('<x>' + REPLACE(REPLACE(REPLACE(REPLACE(ltrim(rtrim(PATIENT_NAME)),' ','<>'),'><',''),'<>',' '), ' ', '</x><x>') + '</x>' AS XML) AS Parts FROM @clients ) SELECT ORIGINAL_PATIENT_NAME ,PATIENT_NAME ,Parts.value(N'/x[1]', 'nvarchar(max)') AS LAST_NAME ,Parts.value(N'/x[2]', 'nvarchar(max)') AS FIRST_NAME ,Parts.value(N'/x[3]', 'nvarchar(max)') AS MIDDLE_NAME FROM Splitted

Documentation声明“仅通过直接调用执行”。但是我想用它来迫使反应堆中的模块具有正确的版本。某些模块仅包括某些配置文件,并且可以手动对其进行修复,但是将其作为发布过程的一部分会更好。

2 个答案:

答案 0 :(得分:0)

作为一种解决方法,我最终从子模块中删除了父模块,并强迫它设置版本:

PROJECT_VERSION=`mvn help:evaluate -Dexpression=project.version |grep -e -SNAPSHOT$`
mvn -B -DnewVersion=$PROJECT_VERSION -f foo_module/ versions:set
mvn -B -DnewVersion=$PROJECT_VERSION -f bar_module/ versions:set 

...然后将该更新提交给SCM,作为Jenkins构建的一部分。不过,我对此并不感到非常满意,因为现在该发行版只能保证在Jenkins的一项工作中就可以使用,并且不便于移植。

这也改变了项目层次结构,这是另一个副作用。

答案 1 :(得分:0)

  

使用配置文件来适应构建时上下文,而不是运行时上下文,并且   (极少数例外)不会产生您的替代版本   神器

-https://dzone.com/articles/maven-profile-best-practices

之所以不起作用,是因为它滥用了Maven。我真正想要并需要的是在Reactor构建中构建所有项目,因此它们都可以正确发布和版本化。就我而言,构建时上下文不会改变,因此配置文件不应排除模块。

从本质上讲,这意味着从配置文件中删除<modules>,让反应堆构建所有内容,并使用配置文件来控制目标平台API所包含的依赖项。

这就像@khmarbaise在上面的评论中建议的那样,“从我的角度来看,配置文件中的模块是一个问题”。明智的话。

关于为什么我无法在versions:update-child-modules上触发release:prepare的原因-无法更改已经处理的POM。要么忽略更改,要么导致Maven发生故障。我尝试将其添加为插件执行,并作为“ exec”任务将Maven作为单独的进程运行,但它拒绝工作。我尝试了多个阶段,包括cleanpre-clean,但并不高兴。

似乎唯一的更改方法是解决https://issues.apache.org/jira/browse/MRELEASE-843并启用发行插件来更新所有配置文件中的所有模块。