web-dev-qa-db-fra.com

Existe-t-il un moyen d'utiliser la propriété maven dans la classe Java lors de la compilation

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}"
    }

}
35
Dmytro Chyzhykov

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" );
}
57
Andrey Borisov

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> 
10
Jeroen

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:

  • Créer le dossier src/main/Java-templates
  • Déplacez les fichiers source que vous souhaitez filtrer vers ce dossier. Reproduisez la structure de l'arborescence des packages, comme si vous étiez dans src/main.

Si vous filtrez également les sources de tests:

  • Créer le dossier src/test/Java-templates
  • Déplacez les fichiers source que vous souhaitez filtrer vers ce dossier. Reproduisez la structure de l'arborescence des packages, comme si vous étiez dans 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.

3
aymens

Si vous travaillez avec Spring, vous pouvez injecter une propriété. Les étapes sont les suivantes:

  1. Dans le fichier POM, vous définissez tous les profils nécessaires et chaque profil doit avoir votre propriété personnalisée, dans votre cas
<profile>
        <id>dev</id>
        <properties>
                <some.version>Dev Value</some.version>
        </properties>
</profile>
  1. Dans la section construction de votre profil, vous définissez l'injection de filtrage.
  2. Sous le répertoire des ressources de votre projet, vous créez un fichier de propriétés (n'importe quel nom chrétien mnémonique) et placez votre accessoire à injecter:

custom.some.version = $ {some.version}

  1. Dans le fichier Spring-context, vous définissez l'espace réservé des propriétés et définissez votre bean ou beanProperty:
<context:property-placeholder location="classpath*:/META-INF/*.properties"/>
...
<bean id="customConfig" class="com.brand.CustomConfig">
        <property name="someVersion" value="${custom.some.version}" />
</bean>
...
  1. Créez votre classe.
package com.brand;

public class CustomConfig {
  private String someVersion;

  public getSomeVersion() {
  return this.someVersion;
  }

  public setSomeVersion(String someVersion) {
  this.someVersion = someVersion;
  }
}
  1. Injectez où vous voulez utiliser. Cet exemple concerne le bean câblé automatiquement, mais vous pouvez également utiliser une propriété câblée automatiquement.
package com.brand.sub

public class YourLogicClass {
  @Autowired
  private CustomConfig customConfig;

  // ... your code
}

Sur la compilation finale, vous avez les bonnes valeurs.

1
ELD