【问题标题】:Access maven project version in Spring config files在 Spring 配置文件中访问 maven 项目版本
【发布时间】:2011-04-22 15:40:48
【问题描述】:

我想在页面中显示我的 Web 应用程序的当前运行版本。该项目基于 Maven、Spring 和 Wicket。

我想以某种方式获取 maven 的 ${project.version} 的值并在我的 spring XML 文件中使用它,类似于我使用 Spring PropertyPlaceholderConfigurer 读取我在应用程序中使用的设置的属性文件的方式。

如果我的 Spring 配置中有 maven project.version 作为变量,我可以这样做:

<bean id="applicationBean" class="com.mysite.web.WicketApplication">
<property name="version"><value>${project.version}</value></property>
</bean>

我该怎么做?

【问题讨论】:

    标签: java spring maven-2 maven wicket


    【解决方案1】:

    您可以按照已经建议的方式使用 Maven filtering

    或者你可以直接用 Spring 读取 Maven 在 META-INF 目录下创建的 pom.properties 文件:

    <util:properties id="pom" 
         location="classpath:META-INF/groupId/artifactId/pom.properties" />
    

    并使用 bean。

    后一种方法的唯一缺点是pom.properties 是在package 阶段时间创建的(在test 期间不会出现)。

    【讨论】:

    • 是的,这是更好的解决方案 (+1)
    • 很棒的链接,包括我所需要的。与 @Derek 链接的入门指南不同,展示了如何包含和排除不同资源的过滤。还要感谢您提供的替代方案,但过滤效果很好。
    • 那条线应该去哪里?
    【解决方案2】:

    一种技术是使用 Maven 过滤。您可以在资源文件中插入占位符,然后在资源阶段将其替换为构建中的值。

    查找“如何过滤资源文件?”在Maven getting started guide

    【讨论】:

      【解决方案3】:

      使用@PropertySource注解将Maven创建的pom.properties文件添加到META-INF目录下。请注意,该文件在 package 阶段之前不存在。为避免测试期间出错,请设置 ignoreResourceNotFound=true 并在正在读取的属性上添加默认值(例如,none 下面)。

      @Service
      @PropertySource(value = "classpath:META-INF/maven/io.pivotal.poc.tzolov/hawq-rest-server/pom.properties", ignoreResourceNotFound=true)
      public class MyClass {
          private String applicationPomVersion;
      
          @Autowired
          public MyClass(@Value("${version:none}") String applicationVersion ) {
              this.applicationPomVersion = applicationVersion;
          }
      
          public String getApplicationPomVersion() {
              return this.applicationPomVersion;
          }
      }
      

      【讨论】:

        【解决方案4】:

        我们在 Web 应用程序之外部署属性文件。然后可以在部署时过滤文件。

        如果使用 Jetty,可以将文件放在 $JETTY_HOME/resources 下或使用 extraClassPath 功能在运行时加载属性文件。

        【讨论】:

          【解决方案5】:

          我认为收集应用程序版本的正确方法是该线程中解释的方法:https://stackoverflow.com/a/2713013/840635getClass().getPackage().getImplementationVersion()

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-01-05
            • 2012-08-06
            • 2016-05-31
            • 1970-01-01
            • 2016-01-05
            • 2015-05-23
            相关资源
            最近更新 更多