Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有属性的Maven版本_Java_Maven_Version - Fatal编程技术网

Java 具有属性的Maven版本

Java 具有属性的Maven版本,java,maven,version,Java,Maven,Version,我有大约400个插件的大型Maven(Tycho)项目 我们在每个POM文件中指定了应用程序的版本 有没有办法只在一个地方为所有POM:s指定版本 我希望有人会这样想: <properties> <buildVersion>1.1.2-SNAPSHOT</buildVersion> </properties> .... <version>${buildVersion}</version> 然后在每个POM中引用父POM

我有大约400个插件的大型Maven(Tycho)项目

我们在每个POM文件中指定了应用程序的版本

有没有办法只在一个地方为所有POM:s指定版本

我希望有人会这样想:

<properties>
<buildVersion>1.1.2-SNAPSHOT</buildVersion>
</properties>

....

<version>${buildVersion}</version>
然后在每个POM中引用父POM:

<parent>
  <artifactId>build.parent</artifactId>
  <groupId>company</groupId>
  <relativePath>../build.parent/pom.xml</relativePath>
  <version>1.1.2-SNAPSHOT</version>
</parent>

<modelVersion>4.0.0</modelVersion>
<groupId>company</groupId>
<artifactId>artifact</artifactId>
<version>1.1.2-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>

build.parent
公司
../build.parent/pom.xml
1.1.2-快照
4.0.0
公司
人工制品
1.1.2-快照
eclipse插件

如果您有一个父项目,您可以在父pom中设置版本,在子项目中,您可以使用${project.version}或${version}属性引用同级库

如果要避免在每个子项中重复父项的版本:可以执行以下操作:

<modelVersion>4.0.0</modelVersion>
<groupId>company</groupId>
<artifactId>build.parent</artifactId>
<version>${my.version}</version>
<packaging>pom</packaging>

<properties>
<my.version>1.1.2-SNAPSHOT</my.version>
</properties>
4.0.0
公司
build.parent
${my.version}
聚甲醛
1.1.2-快照
然后在你的孩子pom中,你必须做到:

    <parent>
      <artifactId>build.parent</artifactId>
      <groupId>company</groupId>
      <relativePath>../build.parent/pom.xml</relativePath>
      <version>${my.version}</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>
    <groupId>company</groupId>
    <artifactId>artifact</artifactId>
    <packaging>eclipse-plugin</packaging>

    <dependencies>
        <dependency> 
           <groupId>company</groupId>
           <artifactId>otherartifact</artifactId>   
           <version>${my.version}</version>
or
           <version>${project.version}</version>
        </dependency>
    </dependencies>

build.parent
公司
../build.parent/pom.xml
${my.version}
4.0.0
公司
人工制品
eclipse插件
公司
其他人工制品
${my.version}
或
${project.version}

hth

对版本使用属性会生成以下警告:

[WARNING]
[WARNING] Some problems were encountered while building the effective model for xxx.yyy.sandbox:Sandbox:war:0.1.0-SNAPSHOT
[WARNING] 'version' contains an expression but should be a constant. @ xxx.yyy.sandbox:Sandbox:${my.version}, C:\Users\xxx\development\gwtsandbox\pom.xml, line 8, column 14
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]

如果您的问题是因为切换版本而必须在多个位置更改版本,那么正确的做法是使用Maven Release插件,该插件将自动为您执行此操作。

如果您使用Maven 3,解决此问题的一个选项是使用versions插件

特别是命令

mvn versions:set -DnewVersion=2.0-RELEASE
mvn versions:commit
这将把父级和子级POM更新为2.0版本。您可以在之前将此作为生成步骤运行


与发行版插件不同,它不会尝试与源代码管理对话

正确答案如下(示例版本):

  • 在parent pom.xml中,您应该在
    属性中有(not):


    您的400个模块都将更新父版本。

    对于Maven版本3.5或更高版本,您应该能够在父部分中使用占位符(例如${revision}),在pom的其余部分中,您可以使用
    ${project.version}

    实际上,您还可以省略父级之外的项目属性,这些属性是相同的,因为它们将被继承。结果如下所示:

    <project>
        <parent>
        <artifactId>build.parent</artifactId>
        <groupId>company</groupId>
        <relativePath>../build.parent/pom.xml</relativePath>
        <version>${revision}</version>  <!-- use placeholder -->
        </parent>
    
        <modelVersion>4.0.0</modelVersion>
        <artifactId>artifact</artifactId>
        <!-- no 'version', no 'groupId'; inherited from parent -->
        <packaging>eclipse-plugin</packaging>
    
        ...
    </project>
    
    
    参见Maven-用户论坛:

    这就是为什么这是一个糟糕的计划

    部署的pom不会解析属性值,因此 任何依赖于该pom的人都会将依赖项看作是与${}无关的字符串,并且在您的应用程序中会出现很多欢闹 构建过程

    在maven 2.1.0和/或2.2.0中,尝试使用 已解析属性。。。这超出了预期,这就是为什么 不推荐使用两个版本,2.2.1是推荐的2.x版本


    我有两个建议给你

  • 用于所有工件。您可以在
    .mvn/maven.config
    文件中添加
    -Drevision=2.0.1
    。所以基本上你只在一个地方定义你的版本
  • 对于所有外部依赖项,在父文件中创建属性。你可以作为参考

  • pom.xml的版本应有效

    <groupId>com.amazonaws.lambda</groupId>
    <artifactId>lambda</artifactId>
    <version>2.2.4 SNAPSHOT</version>
    <packaging>jar</packaging>
    
    com.amazonaws.lambda
    兰姆达
    2.2.4快照
    罐子
    

    此版本不应与2.2.4类似。etc

    目前我有一个父pom,但我需要在其中包含版本,因此这意味着每个pom都指定了父pom的verison。如果我尝试删除两个版本元素,并仅在父pom中保留版本,我会遇到以下异常:[错误]生成无法读取1个项目->[帮助1]org.apache.maven.project.ProjectBuildingException:处理POM时遇到一些问题:[致命]“parent.version”丢失。@第6行第13列[警告]为公司构建有效模型时遇到一些问题:group1:pom:1.1.2-SNAPSHOT[警告]“version”包含表达式,但应为常量。@company:maven test:${my.version},[WARNING][WARNING]强烈建议修复这些问题,因为它们威胁到构建的稳定性。[警告][警告]出于这个原因,未来的Maven版本可能不再支持生成这种格式错误的项目。在新版本的Maven中,此功能将不再有效!maven 3.5.4对我来说很有效,注意3.5.2和3.6.0都不起作用。你能解释一下maven发布插件是如何解决这个问题的吗?实际上,它并没有解决报告的问题,因为这不是正确的方法,所以你不应该在属性中设置项目的版本。如果您的项目有多个模块,那么正确的做法是让发布插件为您更改所有pom.xml文件中的版本。在我们的例子中,我们使用update POM命令将所有模块的版本设置为parent,如下所示:
    mvn release:update versions-DautoVersionSubmodules=true
    这涉及到修改POM,这意味着源代码控制的文件现在被修改,我发现这是不合适的。目标是更改版本。这里的讨论是是否可以在一个地方完成。这会产生警告并要求使用常量版本,但仍然取决于this@DavutGürbüz这里没有(在Maven 3.6.0中,如果您按照链接页面上的说明操作),这修改了pom.xml文件,这意味着后续生成是从修改过的源代码生成的,我认为这是不可取的。@BobBell不修改pom文件就无法更新版本。@ACV这不是真的。您可以使用的替代版本进行构建,使用
    ${revision}
    并在命令行上传递
    -Drevision
    。@BobBell,我正在传递命令行
    <parent>
        <groupId>com.vvirlan</groupId>
        <artifactId>grafiti</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    
    mvn versions:set -DnewVersion=0.0.2-SNAPSHOT
    mvn versions:commit # Necessary to remove the backup file pom.xml
    
    <project>
        <parent>
        <artifactId>build.parent</artifactId>
        <groupId>company</groupId>
        <relativePath>../build.parent/pom.xml</relativePath>
        <version>${revision}</version>  <!-- use placeholder -->
        </parent>
    
        <modelVersion>4.0.0</modelVersion>
        <artifactId>artifact</artifactId>
        <!-- no 'version', no 'groupId'; inherited from parent -->
        <packaging>eclipse-plugin</packaging>
    
        ...
    </project>
    
    <groupId>com.amazonaws.lambda</groupId>
    <artifactId>lambda</artifactId>
    <version>2.2.4 SNAPSHOT</version>
    <packaging>jar</packaging>