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_Properties - Fatal编程技术网

Java 在Maven中,如何在运行时动态构建属性值?

Java 在Maven中,如何在运行时动态构建属性值?,java,maven,properties,Java,Maven,Properties,在maven中,使用以下语法在pom中设置属性非常容易: ... <properties> <myValue>4.06.17.6</myValue> </properties> ... 它应该是动态的,因为它在我们的存储库中用作标记名,并且必须始终与工件的版本同步 有没有关于如何创建“动态”属性的想法?您可以使用maven build helper插件,尤其是它的插件。查看(滚动至通过对值应用正则表达式替换来设置属性) 基本上,您希望pom

在maven中,使用以下语法在pom中设置属性非常容易:

...
<properties>
  <myValue>4.06.17.6</myValue>
 </properties>
...
它应该是动态的,因为它在我们的存储库中用作标记名,并且必须始终与工件的版本同步


有没有关于如何创建“动态”属性的想法?

您可以使用maven build helper插件,尤其是它的插件。查看(滚动至通过对值应用正则表达式替换来设置属性)

基本上,您希望pom中的类似内容能够从
myValue
中推断出
myVersionTag
属性:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <version>1.7</version>
        <executions>
          <execution>
            <id>regex-property</id>
            <goals>
              <goal>regex-property</goal>
            </goals>
            <configuration>
              <name>myVersionTag</name>
              <value>$\{myValue}</value>
              <regex>(\d+)\.(\d+)\.(\d+)\.(\d+)</regex>
              <replacement>V_$1_$2_$3_P$4</replacement>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...
</project>

...
org.codehaus.mojo
构建助手maven插件
1.7
正则表达式属性
正则表达式属性
myVersionTag
$\{myValue}
(\d+)\(\d+)\(\d+)\(\d+)
V_$1_$2_$3_$4
...

Mojo的Build Helper Maven插件可以在这里帮助您

有许多目标可用于帮助转换属性

可能是您想要的版本号,但是如果您的版本号符合“标准”,那么其他两个版本可能会为您节省时间

要实现这个目标,你可以做如下事情

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <version>1.7</version>
        <executions>
          <execution>
            <id>regex-property</id>
            <goals>
              <goal>regex-property</goal>
            </goals>
            <configuration>
              <name>tag.version</name>
              <value>${project.version}</value>
              <regex>^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)\.(-SNAPSHOT)?$</regex>
              <replacement>V$1_$2_$3_P$4</replacement>
              <failIfNoMatch>true</failIfNoMatch>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...
</project>

...
org.codehaus.mojo
构建助手maven插件
1.7
正则表达式属性
正则表达式属性
tag.version
${project.version}
^([0-9]+)\([0-9]+)\([0-9]+)\([0-9]+)\(-SNAPSHOT)$
V$1_$2_$3_$4
真的
...
注意:我的正则表达式可能有点不正确,所以您应该测试上面的内容


注意:属性值仅可用于此执行绑定到的阶段之后的执行。它绑定到的默认阶段是验证,但如果您处于不同的生命周期(例如站点生命周期),则该值将不可用。

Ihor Kaharlichenko的回答基本正确,只是它从。“$”和“{”之间不应该有“\”。魔咒没有它也不能工作。真的,对正则表达式和Maven有了基本的了解,我看不出反斜杠应该做什么,它确实是错的

斯蒂芬·康诺利的回答正确地省略了反斜杠。小心。

这个错误在SO中不断蔓延,随着Codehaus的停业,它可能永远也不会得到修复。

如果我没有将插件绑定到一个阶段,我使用maven release插件并调用目标版本:prepare。如何在这里使它可用?如果你没有指定一个阶段,默认情况下它绑定到
验证
阶段,因此上面的ode代码片段将在验证阶段处于活动状态时执行目标。当您直接调用目标时,例如,
release:prepare
,发生的情况是maven直接跳过任何生命周期阶段运行目标,因此,
release:prepare
目标本身将不会看到属性,而是由
release:prepare>派生的生命周期
将看到它。因此
发布:prepare
将无法使用该属性标记SCM,但该属性将出现在发布插件运行的分叉版本中,如果您希望SCM标记基于该属性(您应该更新您的问题以反映这是您的目标,或者开始第二个问题)然后,您可能需要使用类似于“虽然”的内容,这样做既不会给您提供所需的
\uuu
替换,也不会给您提供
\P
注入。我建议更改标记名要求,而不是尝试弯曲Maven;-)好的。我创建了一个新问题。可能会更幸运。我无法更改标记名定义,因为很多人都这么做了部门将不得不改变这些标记行为。:-(哇…24行XML替换2行Java。是否有一个选项稍微少一点…详细?我也会将这个答案标记为接受,因为它与上面的答案相同。谢谢。不完全一样。Ihor的示例在“$”和“\”之间放置了一个“\”{在元素中。这是Codehaus文档所说的操作方式,但它是错误的。正则表达式属性目标在没有反斜杠的情况下不起作用,没有反斜杠也能起作用。Codehaus已经停业。@SteveCohen如果文档是错误的,请打开一个问题
<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <version>1.7</version>
        <executions>
          <execution>
            <id>regex-property</id>
            <goals>
              <goal>regex-property</goal>
            </goals>
            <configuration>
              <name>tag.version</name>
              <value>${project.version}</value>
              <regex>^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)\.(-SNAPSHOT)?$</regex>
              <replacement>V$1_$2_$3_P$4</replacement>
              <failIfNoMatch>true</failIfNoMatch>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...
</project>