Je veux juste utiliser l'espace réservé maven dans ma classe Java au moment de la compilation afin de réduire la duplication.
Quelque chose comme ca:
pom.xml
<properties>
<some.version>1.0</some.version>
</properties>
SomeVersion.Java
package some.company;
public class SomeVersion {
public static String getVersion() {
return "${some.version}"
}
}
créez simplement le fichier app.properties dans src/main/resources avec un contenu comme celui-ci
application.version=${project.version}
puis activez le filtrage maven comme celui-ci
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
C'est tout - dans le code de l'application, il suffit de lire le fichier de propriétés
ClassPathResource resource = new ClassPathResource( "app.properties" );
p = new Properties();
InputStream inputStream = null;
try {
inputStream = resource.getInputStream();
p.load( inputStream );
} catch ( IOException e ) {
LOGGER.error( e.getMessage(), e );
} finally {
Closeables.closeQuietly( inputStream );
}
et fournir une méthode comme celle-ci
public static String projectVersion() {
return p.getProperty( "application.version" );
}
Même si ce n'est pas une solution très agréable, c'est possible avec le plugin de ressources par défaut maven.
Vous devez d'abord spécifier le plugin de ressources.
<project>
<build>
<!-- Configure the source files as resources to be filtered
into a custom target directory -->
<resources>
<resource>
<directory>src/main/Java</directory>
<filtering>true</filtering>
<targetPath>../filtered-sources/Java</targetPath>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
Ensuite, vous devrez changer la configuration "par défaut" du plugin du compilateur.
<project>
<build>
<!-- Overrule the default pom source directory to match
our generated sources so the compiler will pick them up -->
<sourceDirectory>target/filtered-sources/Java</sourceDirectory>
</build>
</project>
La manière la plus simple que je connaisse est d'utiliser Templating Maven Plugin .
Ajoutez une déclaration de plugin à votre pom:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>templating-maven-plugin</artifactId>
<version>1.0.0</version>
<executions>
<execution>
<id>filter-src</id>
<goals>
<goal>filter-sources</goal><!-- add this if you filter main sources -->
<goal>filter-test-sources</goal><!-- add this if you filter test sources -->
</goals>
</execution>
</executions>
</plugin>
Si vous filtrez les sources principales:
src/main/Java-templates
src/main
.Si vous filtrez également les sources de tests:
src/test/Java-templates
src/test
.En supposant que vos sources contiennent des espaces réservés valides comme:
package some.company;
public class SomeVersion {
public static String getVersion() {
return "${project.version}"
}
}
Désormais, lorsque vous compile
ou test
votre projet, ces espaces réservés doivent déjà être valorisés.
J'espère que cela aide.
Si vous travaillez avec Spring, vous pouvez injecter une propriété. Les étapes sont les suivantes:
<profile>
<id>dev</id>
<properties>
<some.version>Dev Value</some.version>
</properties>
</profile>
custom.some.version = $ {some.version}
<context:property-placeholder location="classpath*:/META-INF/*.properties"/>
...
<bean id="customConfig" class="com.brand.CustomConfig">
<property name="someVersion" value="${custom.some.version}" />
</bean>
...
package com.brand; public class CustomConfig { private String someVersion; public getSomeVersion() { return this.someVersion; } public setSomeVersion(String someVersion) { this.someVersion = someVersion; } }
package com.brand.sub public class YourLogicClass { @Autowired private CustomConfig customConfig; // ... your code }
Sur la compilation finale, vous avez les bonnes valeurs.