J'ai utilisé le plugin de propriétés pour résoudre ce problème.
Les propriétés sont définies dans le pom et écrites dans un fichier my.properties, où elles sont ensuite accessibles à partir de votre code Java.
Dans mon cas, c'est le code de test qui doit accéder à ce fichier de propriétés, donc dans le pom, le fichier de propriétés est écrit dans testOutputDirectory de maven:
<configuration>
<outputFile>${project.build.testOutputDirectory}/my.properties</outputFile>
</configuration>
Utilisez outputDirectory si vous souhaitez que les propriétés soient accessibles par le code de votre application:
<configuration>
<outputFile>${project.build.outputDirectory}/my.properties</outputFile>
</configuration>
Pour ceux qui recherchent un exemple plus complet (il m'a fallu un peu de bidouillage pour que cela fonctionne car je ne comprenais pas comment la dénomination des balises de propriétés affecte la capacité de les récupérer ailleurs dans le fichier pom), mon pom ressemble à ceci:
<dependencies>
<dependency>
...
</dependency>
</dependencies>
<properties>
<app.env>${app.env}</app.env>
<app.port>${app.port}</app.port>
<app.domain>${app.domain}</app.domain>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20</version>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
<version>1.0.0</version>
<executions>
<execution>
<phase>generate-resources</phase>
<goals>
<goal>write-project-properties</goal>
</goals>
<configuration>
<outputFile>${project.build.testOutputDirectory}/my.properties</outputFile>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Et sur la ligne de commande:
mvn clean test -Dapp.env=LOCAL -Dapp.domain=localhost -Dapp.port=9901
Ainsi, ces propriétés sont accessibles à partir du code Java:
java.io.InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("my.properties");
java.util.Properties properties = new Properties();
properties.load(inputStream);
appPort = properties.getProperty("app.port");
appDomain = properties.getProperty("app.domain");