当前位置: 首页 > 知识库问答 >
问题:

使用功能分支时避免maven存储库版本冲突

戚学文
2023-03-14

问:如何处理maven多项目构建的功能分支?

Jenkins构建和部署这些分支以将开发人员的构建开销保持在最低限度,但开发和功能分支无法构建相同的maven版本,否则我们将面临工件和源代码不匹配的风险。

我们有一个脚本来更改子pom中的父版本和根pom中的版本。虽然这会隔离maven空间中的分支,但在合并时会导致额外的工作。

我认为nexus pro暂存功能可能会帮助我们避免这一要求,并使每个功能分支使用特定的回购,我们可以在分支删除/合并后轻松放弃该回购。

再次强调:如何处理多个分支和maven的问题?

共有3个答案

南门正祥
2023-03-14
匿名用户

我们使用与Peter Kahn类似的技术,在构建之前修改分支的版本。我们的“前步骤”有三个步骤:

  1. 执行shell:<代码>echo版本=$(echo${GIT\u BRANCH}| sed's\u ^.*\/\ uuuu')

我非常确信,这可以用两个甚至一个步骤来完成,而且也只有一个步骤,但其背后的原则将是相同的。

我们没有在pom中更改版本的原因。分支中的xml文件确实正在合并。对于SVN,这是可能的(与--接受我的冲突合并)。对于GIT,这不再存在,因此我们停止更改版本,并创建了此预构建步骤。

桑璞
2023-03-14

这不起作用会导致在整个生成过程中出现警告,并在从顶级父级运行时出现GC错误。

理想情况下,我们希望使用版本来区分特征分支和主线,因为这是正常的maven方式,分类器操作会导致各种问题。

由于maven可以将环境变量用于属性,并且我们已经使用脚本初始化了构建环境(我们还有git钩子脚本可以从分支名称设置环境变量),因此我们可以使用env来控制版本。

<groupID>my.project</groupId>
<artifactID>database</artifactId>
<version>1.2.0${env.BRANCHMODIFIER}-SNAPSHOT</version>

如果在开发我们的脚本时将BRANCHMODIFIER设置为“”
如果在功能/JIRA-30495上,我们的脚本将BRANCHMODIFIER设置为“.30495”

这在eclipse或Intellij中是如何工作的?目前还没有线索。

刘和正
2023-03-14

以下方法如何:

  • 使用buildnumber maven插件从git获取信息并填充特定的maven属性(我们对scmBranch属性(即当前git分支)特别感兴趣

下面是一个简单的示例:

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>buildnumber-maven-plugin</artifactId>
            <version>1.4</version>
            <executions>
                <execution>
                    <phase>validate</phase>
                    <goals>
                        <goal>create</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <version>1.10</version>
            <executions>
                <execution>
                    <id>regex-property</id>
                    <goals>
                        <goal>regex-property</goal>
                    </goals>
                    <configuration>
                        <name>branch.classifier</name>
                        <value>${scmBranch}</value>
                        <regex>(^develop)|(^master)|(^release.*)</regex>
                        <replacement></replacement>
                        <failIfNoMatch>false</failIfNoMatch>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.0.2</version>
            <configuration>
                <classifier>${branch.classifier}</classifier>
            </configuration>
        </plugin>
    </plugins>
</build>

下面的代码段基本上是动态填充scm分支属性,然后将branch.classifier设置为其值,仅当与开发master发布*不同时,然后将其设置为分类器。

这种方法的主要优点:

>

示例因此,您将生成以下工件:

  • 在进行开发时:例如,project-1.0.0-SNAPSHOT。jar(空分类器,因此不应用,由regex处理)
  • 处理featureA时:例如,project-1.0.0-SNAPSHOT-featureA。jar
  • 使用hotfix-JIRA123时:例如,project-1.0.0-hotfix-JIRA123。jar
  • 在处理release-sprint42时:这取决于您,我添加了这个案例来不应用分支名称,只是因为在这些情况下,我更喜欢设置一个特殊的分类器,RC

此方法的警告:

  • 正如下面通过注释进行的讨论所解释的,如果相关Maven项目已经通过模块间依赖关系(例如,依赖于另一个模块的测试范围类)使用了分类器,甚至更多,那么应该仔细测试这种方法,因为它可能有一些缺点

 类似资料:
  • 问题内容: 我意识到我的一个项目使用slf4j 1.5.8,而Hibernate使用slf4j 1.6。在使用Maven进行构建时,它会下载两个jar,但是我猜想使用了1.5.8的类文件。因此,当我运行程序时,出现以下错误: 在我把 1.5.8是依赖项的一部分,因此可以单独下载。 问题答案: 您发现自己时,有两个库(Hibernate和其他一些库)以两个不同的版本可传递地导入SLF4J。不幸的是,

  • 问题内容: 我的Maven配置有一个小问题。此处的所有其他问题和答案都不能解决我的问题,因此,我开始了一个新问题。 我的问题是,我的Maven没有使用本地存储库。它总是从远程存储库中获取工件。 当下载工件或构建项目时,它将安装在本地存储库中,因此路径正确。 问题是:当我构建一个SNAPSHOT项目时,它仅安装在本地存储库中(应该是这样,不想每次都将其发布在我的关系上)。当我在pom.xml中构建另

  • 我的Maven配置有一个小问题。这里所有其他的问题和答案都没有解决我的问题,所以我要开始一个新的问题。 我的问题是,我的Maven没有使用本地存储库。它总是从远程存储库中获取工件。 当下载工件或构建项目时,它被安装在本地存储库中,因此路径是正确的。 问题是:当我构建一个快照项目时,它只安装在本地存储库中(应该是这样的,不要每次都在我的nexus上发布)。当我构建另一个项目时,在pom.xml中有前

  • 我正在尝试使用Spring启动应用程序将图像上传到azure blob。我得到了下面的错误 2022-02-02 23:28:39【qtp1371397528-21】信息16824 c.a.c.i.jackson。JacksonVersion-信息:包版本:jackson annotations=2.12.4,jackson core=2.12.4,jackson databind=2.12.4,

  • 这很可能通过Nexus配置得到解决。 我们使用maven进行hadoop开发。Nexus被配置为所有存储库的镜像,存储库被添加到Nexus公共组中。(参见Nexus中有没有更好的配置存储库的方法?) 我发现hadoop-core工件版本1.0.4显示来自spring-roo-repositoryhttp://spring-roo-repository.springsource.org/releas

  • 问题内容: 在构建具有许多依赖项的Maven项目时,其中一些依赖项依赖于同一库,但使用的版本不同,这会在运行应用程序时导致错误。 例如,如果我添加两个不同的项目依赖项,A和B都依赖于apachecommonshttp客户端,但每个依赖于不同版本,则一旦类加载器加载了A的apachecommons http客户端类,B就会尝试使用它们,因为它们已经由类加载器加载。 但是B的字节码取决于所加载类的不同