如何在多模块maven项目设置中为所有子项设置不同的版本

时间:2016-06-21 13:43:35

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

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

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总是选择最新版本。因此,旧的罐子没有被挑选。有些人说你总是需要指定父版本。幸运的是,它被继承为模块的版本,在大多数情况下是可取的。而且,这个父母的版本声明会被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版本= 16.3.0.1.0
  • 的child2版本= 16.3.0.1.0

    NOW-

  • 父版本= 16.5.0.0.0
  • child1版本= 16.3.0.1.0
  • 的child2版本= 16.5.0.0.0

  • 1 个答案:

    答案 0 :(得分:1)

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

    问题是,如果我没有弄错你,你试图只用新版本构建一些libs,而用旧版本构建一些libs。在Maven中,通常如果某个东西有非SNAPSHOT版本,它会被视为“已发布”并因此保持稳定,并且它不会再次尝试更新。因此,这可以描述您对正在使用的旧版本的观察。

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

    现在这种方法存在其他问题。你可以发布一个新版本,每个模块都有自己的版本,没有任何问题。问题是如果你试图用你已经使用过的版本发布一些东西,事情会爆发。现在,您可以限制Maven reactor仅释放要释放的模块,并避免此问题。不幸的是,您将遇到下一个问题,因为Maven只会更新当前版本的模块版本。因此,在这种情况下,对未被释放的模块的任何SNAPSHOT依赖都将保持SNAPSHOT,并且发布插件将因此失败。

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