【问题标题】:How to set different version for all child in a multi module maven project setup如何在多模块 Maven 项目设置中为所有子项设置不同的版本
【发布时间】:2016-06-22 14:58:49
【问题描述】:

我们有多个模块项目设置,对不同的模块版本有很多依赖。

ParentModule_16.3.0.1.0-
   ----ChildModule1_16.3.0.1.0
   ----ChildModule2_16.3.0.1.0
   ----ChildModule3_16.3.0.1.0

之前所有版本的每个模块都在 pom.xml 中硬编码。后来我们决定从属性文件中获取这些版本。所以我按照下面的链接,它工作得很好-

Maven: set property in pom.xml from properties file

现在我们有一个需要更新版本的场景 childmodule2_16.3.0.1.0 到 childModule2_16.6.0.0.0 和 parentModule_16.3.0.1.0 到 parentModule_16.6.0.0.0 其余部分保持不变

现在我们面临的问题是,当我们使用父级的 pom 进行完整构建时,由于旧版本(16.3.0.1.0),它不会选择某些模块的 jar。

我读过一些博客,上面说 maven 总是选择最新版本。因此旧的 jars 没有被选中。有些人说你总是必须指定父版本。幸运的是,在大多数情况下,它作为模块的版本被继承。此外,Maven Release Plugin 会自动更改此父级的版本声明。

请帮助我理解这一点。有没有办法解决这个问题?提前致谢。

下面是我的父 pom.xml


<modelVersion>4.0.0</modelVersion>
<groupId>com.myproject</groupId>
<artifactId>parent</artifactId>
<version>${parent-version}</version>
<packaging>pom</packaging>

<modules>
    <module>chiled1</module>
    <module>child2</module>
</modules>
<dependencies>
    <dependency>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>properties-maven-plugin</artifactId>
        <version>1.0-alpha-2</version>
    </dependency>
</dependencies>
<build>
    <plugins>

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>properties-maven-plugin</artifactId>
            <version>1.0-alpha-2</version>
            <executions>
                <execution>
                    <phase>initialize</phase>
                    <goals>
                        <goal>read-project-properties</goal>
                    </goals>
                    <configuration>
                        <files>
                            <file>version.properties</file>
                        </files>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.18.1</version>
            <configuration>
                <parallel>methods</parallel>
                <threadCount>10</threadCount>
            </configuration>
        </plugin>
        <!-- Make assembly -->
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.5.3</version>
            <configuration>
                <descriptor>${project.basedir}/assembly.xml</descriptor>
                <outputDirectory>${project.basedir}/dist</outputDirectory>
            </configuration>
            <executions>
                <execution>
                    <id>create-archive</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>


child2 pom.xml


<groupId>com.myproject.child1</groupId>
<artifactId>child2</artifactId>
<version>${child2-version}</version>

<build>
    <finalName>${project.artifactId}-${version}</finalName>
    <plugins>
    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>properties-maven-plugin</artifactId>
        <version>1.0-alpha-2</version>
        <executions>
            <execution>
                <phase>initialize</phase>
                <goals>
                    <goal>read-project-properties</goal>
                </goals>
                <configuration>
                    <files>
                        <file>../version.properties</file>
                    </files>
                </configuration>
            </execution>
        </executions>

    </plugin>

    </plugins>
</build>


version.properties


之前 -

  • 父版本=16.3.0.1.0
  • child1-version=16.3.0.1.0
  • child2-version=16.3.0.1.0

    现在——

  • 父版本=16.5.0.0.0
  • child1-version=16.3.0.1.0
  • child2-version=16.5.0.0.0
  • 【问题讨论】:

    • 如果你有一个多模块构建,基本思想是在所有模块中为模块本身提供相同的版本。除此之外,如果您使用 maven 发布插件,也会更新所有子模块版本..否则会出现问题...
    • 但这里的想法是更新在当前版本中修改的那些模块的版本。我们不想更新未更改或未触及模块的版本。
    • 如果考虑这种方式,您需要在模块的不同版本之间进行测试,如果您获得更多不同版本,则需要更多测试......

    标签: java maven build-process versioning multi-module


    【解决方案1】:

    我认为你在做一些危险的事情。

    问题是,如果我没有误会您的意思,您会尝试仅使用新版本构建一些库,而使用旧版本构建一些库。在 Maven 中,如果某些东西有一个非 SNAPSHOT 版本,它会被视为“已发布”,因此它是稳定的,它不会再尝试更新它。因此,这可以描述您对正在使用的旧版本的观察。

    通常您会将项目放在 3.0.1-SNAPSHOT 中并使用它。在这种情况下,您将始终获得更新。

    现在这种方法还有其他问题。您可以发布一个新版本,每个模块都有自己的版本,没有任何问题。问题是如果你尝试用你已经使用过的版本发布一些东西,事情就会爆炸。现在你可以限制你的 Maven 反应器只发布你想要发布的模块,这样可以避免这个问题。不幸的是,您将遇到下一个问题,因为 Maven 只会更新属于当前构建的模块的版本。因此,在这种情况下,对未发布的模块的任何 SNAPSHOT 依赖项都将保持为 SNAPSHOT,并且发布插件会因此而失败。

    几年前,我的一位客户需要按照您描述的方式发布单个模块。我确实解决了这个问题,但这并不容易。简而言之:我必须通过更改一两行代码来修补发布插件,然后我必须创建一个 Jenkins 插件来帮助我配置构建,因为它现在需要在命令行上进行疯狂的输入。我写下了所有关于:

    【讨论】:

    • 感谢您的评论克里斯托弗,但我没有完全理解您。我对maven比较陌生。我附上了我正在使用的 pom.xmls,如果你能提出一些建议,请看看。想法是更新在当前版本中修改的那些模块的版本。我们不想更新未更改或未触及模块的版本
    • 好吧......所以我假设你知道 maven......如果你不知道,我同意理解我的答案可能是一个挑战。但问题是我可能不应该在这里给你一个完整的 Maven 培训。实际上,我目前正在完成几周前在温哥华的 ApacheCon 上提供的关于 Maven 的视频教程。我认为你应该看看 Maven 如何处理版本。我怀疑使用变量传递它们是一件好事。在开发过程中,您可能会将您的模块放在带有后缀“-SNAPSHOT”的版本中,并在发布新版本后立即将其删除。
    • 但我有 20 个子模块。如果我不将版本放入变量中,那么每次发布模块时我都必须更改所有 pom 文件。即使我这样做,如果我的父版本设置为 16.6.0.0.0 构建将不会选择低于此版本的 jar。
    • 我将一个有 20 个模块的 maven 项目称为中型模块。我有一些项目多达 100 个模块。例如,在 Maven 中,如果您使用发布插件,则不必手动更新版本。对于在整个项目中更改版本,版本插件是一个巨大的帮助。
    猜你喜欢
    • 2014-03-31
    • 2018-07-25
    • 2015-02-26
    • 2011-06-02
    • 2021-05-23
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    相关资源
    最近更新 更多