web-dev-qa-db-ja.com

コンパイル時にJavaクラスでmavenプロパティを使用する方法はありますか

重複を減らすため、コンパイル時にJavaクラスでmavenプレースホルダーを使用したいだけです。

そんな感じ:

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

src/main/resourcesにapp.propertiesファイルをこのようなコンテンツで作成するだけです

application.version=${project.version}

次に、このようなMavenフィルタリングを有効にします

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

それだけです-アプリのコードではプロパティファイルを読むだけです

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 );
}

そして、このような方法を提供します

public static String projectVersion() {
    return p.getProperty( "application.version" );
}
57
Andrey Borisov

非常に素晴らしいソリューションではありませんが、デフォルトのMavenリソースプラグインで可能です。

まず、リソースプラグインを指定する必要があります。

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

その後、コンパイラプラグインの「デフォルト」設定を変更する必要があります。

<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

私が知っている最も簡単な方法は、 Templating Maven Plugin を使用することです。

プラグイン宣言を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>

メインソースをフィルタリングする場合:

  • フォルダーsrc/main/Java-templatesを作成します
  • フィルター処理するソースファイルをそのフォルダーに移動します。 src/mainにいるかのように、パッケージツリー構造を再現します。

テストソースもフィルタリングする場合:

  • フォルダーsrc/test/Java-templatesを作成します
  • フィルター処理するソースファイルをそのフォルダーに移動します。 src/testにいるかのように、パッケージツリー構造を再現します。

ソースに次のような有効なプレースホルダーが含まれていると仮定します。

package some.company;

public class SomeVersion {

    public static String getVersion() {
        return "${project.version}"
    }

}

これで、プロジェクトをcompileまたはtestすると、それらのプレースホルダーはすでに評価されているはずです。

それが役に立てば幸い。

3
aymens

Springで作業している場合は、プロパティを注入できます。手順は次のとおりです。

  1. POMファイル内で、必要なすべてのプロファイルを定義します。各プロファイルには、カスタムプロパティが必要です。
<profile>
        <id>dev</id>
        <properties>
                <some.version>Dev Value</some.version>
        </properties>
</profile>
  1. プロファイルのセクションビルドで、フィルタリングインジェクションを定義します。
  2. プロジェクトリソースディレクトリの下に、プロパティファイル(任意のニーモニッククリスチャン名)を作成し、propを挿入します。

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

  1. Spring-contextファイルで、プロパティプレースホルダーを定義し、beanまたは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. クラスを作成します。
package com.brand;

public class CustomConfig {
  private String someVersion;

  public getSomeVersion() {
  return this.someVersion;
  }

  public setSomeVersion(String someVersion) {
  this.someVersion = someVersion;
  }
}
  1. 使用したい場所に注入します。この例は自動配線されたBeanを使用していますが、自動配線されたプロパティも使用できます。
package com.brand.sub

public class YourLogicClass {
  @Autowired
  private CustomConfig customConfig;

  // ... your code
}

最終コンパイルで、正しい値が得られます。

1
ELD