Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Modify the content of a file when executing the Maven command in Unix

I'm using the Unix terminal to build Java Projects. And I have created few Shell Script(.sh) files to execute the Jar files. So those sh files contain the version name of the jar file.
So I come across on a new requirement that when I upgrade my version Of the POM by executing a maven command and simultaneously I want to change the sh file's content according to that.
As an example

content of A.sh

#!/bin/bash
"-jar X.3.16.0.jar"

When I execute the command like

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

I want to change the content of A.sh to be like

 #!/bin/bash
"-jar X.3.17.0-SNAPSHOT.jar"

I used to do this change manually. But in the long run it won't be a good idea. So I thought to solve this by two approaches.

Method 1
Implement a mechanism to listen to above mentioned maven command and find the specified text in the sh file and replace it.

Method 2
Implement a new Shell Script with the maven command included and find and replace the text in A.sh file. This newly implemented sh file will have an argument to take the new version.

Question:
What will be the best approach to solve this problem? If none of the above will do it please help me out.

Thank you!

like image 677
Rahal Kanishka Avatar asked Oct 16 '22 21:10

Rahal Kanishka


1 Answers

You could use the filter feature of the Maven resources plugin. Usually the resources plugin simply copies files from the resources directory (default src/main/resources) to the output directory (default target/classes) and includes the files into the jar (or whatever packaging you are using). Filtering enhances this process by resolving variables within the copied files while writing them to the target directory. Variables could be all standard Maven properties or any self-defined value that is set in the pom. The current version of the project is referenced with ${project.version}.

Filtering is enabled by declaring a resource directory to be filtered. The easiest case would be to filter all resources:

<build>
  <resources>
    <resource>
      <directory>src/main/resources</directory>
      <filtering>true</filtering>
    </resource>
  </resources>          
</build>

Another option is to have a separate directory for resources that should be filtered:

<resources>
  <resource>
    <directory>src/main/resources</directory>
    <filtering>false</filtering>
  </resource>
  <resource>
    <directory>src/main/filtered_resources</directory>
    <filtering>true</filtering>
  </resource>
</resources>    

If src/main/filtered_resources contains a file with the text

echo Version: ${project.version}

the result would be after the build

echo Version: 0.0.1-SNAPSHOT

If the filtered scripts should not be copied to the target directory but to a separate directory, the copy-resources goal of the resources plugin is useful.

like image 187
werner Avatar answered Nov 15 '22 06:11

werner