我正在我的 Web 应用程序中显示一些版本元数据,我使用 Maven 资源过滤器来执行此操作,该过滤器将更新我的一个属性文件。
<resources>
<resource>
<directory>${basedir}/src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>build-info.properties</include>
</includes>
</resource>
<resource>
<directory>${basedir}/src/main/resources</directory>
<filtering>false</filtering>
<excludes>
<exclude>build-info.properties</exclude>
</excludes>
</resource>
</resources>
我的属性文件
build.version = ${project.version}
build.number = ${BUILD_NUMBER}
build.commit = ${git.commit.id.abbrev}
这一切都很好,当我打包应用程序时,适当的信息会添加到资源中。
我的问题是我尝试使用 Spring PropertyPlaceholderConfigurer 将包含版本信息的 bean 连接在一起,但这不喜欢${}
语法。如果没有丑陋的解决方法,我将无法再在本地运行应用程序。我收到以下异常:
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'com.mycompany.abc.dm.system.BuildInfo
...
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'project.version' in string value "${project.version}"
无论如何使用 PropertyPlaceholderConfigurer 解决这个问题?
这是来自 Spring XML 上下文的片段
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:build-info.properties</value>
</list>
</property>
<property name="ignoreUnresolvablePlaceholders" value="true" />
<property name="order" value="1000" />
</bean>
<bean class="com.mycompany.abc.dm.system.BuildInfo">
<constructor-arg index="0" value="${build.version}"/>
<constructor-arg index="1" value="${build.number}"/>
<constructor-arg index="2" value="${build.commit}"/>
</bean>
“解决方案”
我从未找到使用 PropertyPlaceholderConfigurer 解决此问题的方法。我的解决方案是不使用 PropertyPlaceholderConfigurer。我仍在阅读属性文件,只是没有使用 Spring 魔法。