我在尝试运行可执行 jar 文件时遇到“循环占位符引用”异常。这是详细的例外情况。
org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'postProcessProperties' defined in class path resource [applicationContext.xml]: Circular placeholder reference 'processor.core.poolsize' in property definitions
[echo] at org.springframework.beans.factory.config.PropertyPlaceholderConfigurer.processProperties(PropertyPlaceholderConfigurer.java:287)
[echo] at org.springframework.beans.factory.config.PropertyResourceConfigurer.postProcessBeanFactory(PropertyResourceConfigurer.java:75)
[echo] at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:663)
[echo] at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:638)
[echo] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:407)
[echo] at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:139)
[echo] at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:83)
[echo] at com.autodesk.postprocess.engine.PostProcessEngine.start(PostProcessEngine.java:39)
[echo] at com.autodesk.postprocess.engine.PostProcessEngine.main(PostProcessEngine.java:29)
这是一个 Spring 应用程序,它使用外部属性文件在启动时读取值。这是弹簧的定义。到目前为止,这一直很有效。
<bean id="propertyConfig"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_NEVER" />
<property name="ignoreResourceNotFound" value="true" />
<property name="locations">
<list>
<value>classpath:/postprocess.properties</value>
</list>
</property>
<property name="properties">
<props>
<prop key="processor.core.poolsize">${processor.core.poolsize}</prop>
<prop key="processor.max.poolsize">${processor.max.poolsize}</prop>
</props>
</property>
</bean>
<bean id="postProcessProperties"
class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="properties">
<props>
<prop key="processor.core.poolsize">${processor.core.poolsize}</prop>
<prop key="processor.max.poolsize">${processor.max.poolsize}</prop>
<prop key="processor.polling.delay">${processor.polling.delay}</prop>
<prop key="processor.polling.period">${processor.polling.period}</prop>
</property>
</bean>
我正在使用shade插件来生成jar文件。这是一个片段
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.7.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.test.postprocess.engine.PostProcessEngine</mainClass>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
</transformers>
<filters>
<filter>
<artifact>:</artifact>
<excludes>
<exclude>META-INF/.SF</exclude>
<exclude>META-INF/.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
我不确定是什么导致了这个问题,因为我之前在其他可执行 jar 文件中使用过类似的模式。
任何指针将不胜感激。
谢谢
回答这个问题可能已经晚了,但添加它是为了帮助面临类似问题的人。
我可以通过更改键名称来修复它。例如
<prop key="processor.core.poolsize">${processor.core.poolsize}</prop>
<prop key="processor.max.poolsize">${processor.max.poolsize}</prop>
更改为类似的内容
<prop key="processor.core.poolsize">${core.poolsize}</prop>
<prop key="processor.max.poolsize">${max.poolsize}</prop>
property-placeholder key 和要过滤的属性值的 key 不能相同。
Circular placeholder reference XXXX in property definitions
当你的属性键名和值变量名完全相同时,
spring-framework
将会抛出上述异常。
确保您的财产不应看起来像
key={$key}
。保留键和值的不同名称将解决此问题。
在尝试使用 SpringJUnit4ClassRunner 运行 spring 集成测试时,我遇到了同样的问题。我不确定如何加载我的属性文件,经过一些错误步骤后,我找到了 @TestPropertySource 注释,它允许我定义所需的属性文件。
我之前尝试过@PropertySource,当你运行这样的Spring集成测试时它不起作用。
希望这对其他人有帮助。
可能无法找到资源 -
postprocess.properties
。你能删除这行吗 -
<property name="ignoreResourceNotFound" value="true" />
如果没有找到资源,应该显示适当的消息。
在您的java代码中,如果您使用在某些.properties或yaml文件中声明的键,而不是
application.properties
或application.yaml
,则当您尝试运行Spring应用程序而不指定配置文件时,您将收到此异常来使用。
解决方案: 就我而言,我使用的是 Spring Boot 2.4,这是告诉您的应用程序将使用哪个配置文件的一种方法:
命令行:
java -jar -Dspring.profiles.active=DEV myapp.jar
如果您通过 IntelliJ 等 IDE 运行应用程序:
运行->编辑配置
在 Spring 配置中,指定您想要激活的配置文件(用逗号分隔):
有同样的问题。重命名属性,启动应用程序,然后将属性重命名回来并再次重新启动应用程序解决了问题。也许这可以帮助某人。