在Unix中执行Maven命令时修改文件内容

5
我将使用Unix终端来构建Java项目。我已经创建了一些Shell脚本(.sh)文件来执行Jar文件。因此,这些sh文件包含Jar文件的版本名称。
现在我遇到了一个新要求,就是当我通过执行Maven命令升级我的POM版本时,同时我希望根据这个版本改变sh文件的内容。
例如:
A.sh的内容为:
#!/bin/bash
"-jar X.3.16.0.jar"

当我执行这样的命令时:

mvn versions:set -DnewVersion= X.3.17.0-SNAPSHOT

我希望将A.sh的内容更改为以下形式:
 #!/bin/bash
"-jar X.3.17.0-SNAPSHOT.jar"

我曾手动进行此更改。但从长远来看,这不是一个好主意。因此,我考虑用两种方法解决这个问题。 方法一
实现一个机制来监听上述的Maven命令,并在sh文件中查找指定的文本并替换它。 方法二
使用包含Maven命令的新Shell脚本来查找和替换A.sh文件中的文本。这个新实现的sh文件将有一个参数来接收新的版本号。 问题:
哪种方法是解决这个问题的最佳方法?如果以上方法都不行,请帮忙提供其他方法。
谢谢!

1
方法2应该很容易实现。 - anubhava
@anubhava 我也是这么认为的。但是Bash中有没有可用的功能来实现方法1的方法呢? - Rahal Kanishka
1
不,Bash不是一种完整的语言。你不能监听Maven中的某些更改。 - anubhava
1个回答

4
你可以使用Maven资源插件的过滤功能。通常,资源插件只是将文件从资源目录(默认为src/main/resources)复制到输出目录(默认为target/classes),并将这些文件包含在jar(或任何您使用的打包方式)中。过滤增强了此过程,通过在将文件写入目标目录时解析其中的变量来实现。变量可以是所有标准的Maven属性或在pom中设置的任何自定义值。项目的当前版本引用为${project.version}
声明要过滤的资源目录即可启用过滤。最简单的情况是过滤所有资源:
<build>
  <resources>
    <resource>
      <directory>src/main/resources</directory>
      <filtering>true</filtering>
    </resource>
  </resources>          
</build>

另一种选择是为需要过滤的资源单独创建一个目录:
<resources>
  <resource>
    <directory>src/main/resources</directory>
    <filtering>false</filtering>
  </resource>
  <resource>
    <directory>src/main/filtered_resources</directory>
    <filtering>true</filtering>
  </resource>
</resources>    

如果`src/main/filtered_resources`包含一个包含文本的文件
echo Version: ${project.version}

构建完成后的结果

echo Version: 0.0.1-SNAPSHOT

如果筛选后的脚本不应该被复制到目标目录,而是应该被复制到一个单独的目录中,那么 资源插件的复制资源目标 就会很有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接