You can simply implement your own maven-plugin , which will take care of this for you.
Here is an example with the following structure:
. |-- pom.xml |-- plugin | `-- pom.xml | `-- src | `-- main | `-- java `-- app `-- pom.xml `-- src `-- main `-- java
You will need to create a Mojo that takes the properties file as input and then distributes the properties to pom.xml in the app . pom.xml will not actually be updated, but only the project data in it.
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.stackoverflow</groupId> <artifactId>Q12082277</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <name>${project.artifactId}-${project.version}</name> <modules> <module>plugin</module> <module>app</module> </modules> </project>
plugin/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.stackoverflow</groupId> <artifactId>Q12082277</artifactId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>Q12082277-plugin</artifactId> <packaging>maven-plugin</packaging> <name>${project.artifactId}-${project.version}</name> <dependencies> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-plugin-api</artifactId> <version>3.0.4</version> </dependency> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-project</artifactId> <version>2.2.1</version> </dependency> </dependencies> </project>
plugin/src/main/java/com/stackoverflow/Q12082277/plugin/PropertiesMojo.java
package com.stackoverflow.Q12082277.plugin; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugin.logging.Log; import org.apache.maven.project.MavenProject; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Properties; public class PropertiesMojo extends AbstractMojo { private Log log; private MavenProject project; private File propertiesFile; @Override public void execute() throws MojoExecutionException, MojoFailureException { log.info("Executing PropertiesMojo on " + propertiesFile.getAbsolutePath()); try { Properties fileProperties = new Properties(); fileProperties.load(new FileInputStream(propertiesFile)); Properties projectProperties = project.getProperties(); for (Object key : fileProperties.keySet()) { projectProperties.setProperty((String)key, (String) fileProperties.get(key)); } project.getProperties().list(System.out); } catch (FileNotFoundException e) { throw new MojoFailureException("The file " + propertiesFile.getAbsolutePath() + " was not found!", e); } catch (IOException e) { log.error(""); } } @Override public void setLog(Log log) { this.log = log; } }
You will use this plugin from the following app/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.stackoverflow</groupId> <artifactId>Q12082277</artifactId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>Q12082277-app</artifactId> <name>${project.artifactId}-${project.version}</name> <build> <plugins> <plugin> <groupId>com.stackoverflow</groupId> <artifactId>Q12082277-plugin</artifactId> <version>1.0-SNAPSHOT</version> <executions> <execution> <phase>initialize</phase> <goals> <goal>extract</goal> </goals> <configuration> <propertiesFile>${user.home}/my.properties</propertiesFile> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.2.1</version> <executions> <execution> <goals> <goal>java</goal> </goals> </execution> </executions> <configuration> <mainClass>com.stackoverflow.Q12082277.App</mainClass> </configuration> </plugin> </plugins> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build> </project>
And then you will need to add the following app.properties , which will work as a template and take the values ββthat we just read from the file, and set them and create a specific app.properties file that will be accessible from inside the jar.
app/src/main/resources/app.properties
res.dir=${res.dir} resource.dir=${resource.dir} bin.dir=${bin.dir} cfg.dir=${cfg.dir}
And finally, this is a test application that simply loads app.properties from the class path and prints the result.
app/src/main/java/com/stackoverflow/Q12082277/App.java
package com.stackoverflow.Q12082277; import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class App { public static void main(String[] args) throws IOException { ClassLoader loader = App.class.getClassLoader(); InputStream in = loader.getResourceAsStream("app.properties"); Properties properties = new Properties(); properties.load(in); properties.list(System.out); } }
Now you can stand in the top directory and execute
mvn install
Then go to the app folder and execute
mvn exec:java
And he will print
-- listing properties -- resource.dir=C://my/stuff/here cfg.dir=C://my/stuff/here/config bin.dir=C://my/stuff/here/bin res.dir=/my/stuff/here
This is exactly what you wanted.