42

我只想在编译时在我的 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}"
    }

}
4

4 回答 4

65

只需在 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" );
}
于 2012-07-31T13:03:40.393 回答
10

即使这不是一个很好的解决方案,也可以使用默认的 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> 
于 2012-07-31T13:03:42.390 回答
5

我知道的最简单的方法是使用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}"
    }

}

现在,当您compiletest您的项目时,这些占位符应该已经被重视。

希望能帮助到你。

于 2017-08-21T09:34:49.773 回答
2

如果您正在使用 Spring,则可以注入一个属性。步骤是:

  1. 在 POM 文件中,您定义所需的所有配置文件,并且每个配置文件都必须具有您的自定义属性,在您的情况下

<profile>
	<id>dev</id>
	<properties>
		<some.version>Dev Value</some.version>
	</properties>
</profile>

  1. 在配置文件的部分构建中,您定义过滤注入。
  2. 在您的项目资源目录下,您创建一个属性文件(任何助记基督教名称)并将您的道具注入:

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
}

在最终编译中,您拥有正确的值。

于 2015-11-04T20:05:12.867 回答