Java 运行可执行jar时的Spring循环占位符引用

Java 运行可执行jar时的Spring循环占位符引用,java,spring,maven,maven-shade-plugin,Java,Spring,Maven,Maven Shade Plugin,我在尝试运行可执行jar文件时遇到“循环占位符引用”异常。下面是详细的例外情况 org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'postProcessProperties' defined in class path resource [applicationContext.xml]: Circular placeholder reference

我在尝试运行可执行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>

类路径:/postprocess.properties
${processor.core.poolsize}
${processor.max.poolsize}
${processor.core.poolsize}
${processor.max.poolsize}
${processor.polling.delay}
${processor.polling.period}
我正在使用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>

org.apache.maven.plugins
maven阴影插件
1.7.1
包裹
阴凉处
com.test.postprocess.engine.postprocesseengine
META-INF/spring.handlers
META-INF/spring.schemas
:
META-INF/.SF
META-INF/.DSA
META-INF/*.RSA

我不确定是什么导致了这个问题,因为我以前在其他可执行jar文件中使用过类似的模式

任何指示都将不胜感激


谢谢

它可能无法找到资源-
后处理.properties
。你能把这条线移走吗

<property name="ignoreResourceNotFound" value="true" />


然后,如果找不到资源,则应显示相应的消息。

回答此问题可能为时已晚,但添加此消息是为了帮助面临类似问题的人

我可以通过更改密钥名称来修复它。e、 g

 <prop key="processor.core.poolsize">${processor.core.poolsize}</prop>
 <prop key="processor.max.poolsize">${processor.max.poolsize}</prop>
${processor.core.poolsize}
${processor.max.poolsize}
被改成了

<prop key="processor.core.poolsize">${core.poolsize}</prop>
<prop key="processor.max.poolsize">${max.poolsize}</prop>
${core.poolsize}
${max.poolsize}

属性占位符键和要筛选的属性值的键不能相同。

我在尝试使用SpringJUnit4ClassRunner运行spring集成测试时遇到了相同的问题。我不确定如何加载属性文件,在几个错误步骤之后,我找到了@TestPropertySource注释,该注释允许我定义所需的属性文件

在此之前,我尝试过@PropertySource,当您运行这样的spring集成测试时,它不起作用

希望这能帮助其他人

Circular placeholder reference XXXX in property definitions
当您的属性键名称和值变量名称完全相同时,
spring框架将引发上述类型的异常

确保你的财产不应该看起来像
key={$key}
。为键和值保留不同的名称将解决此问题。

在java代码中,如果您使用的是在一些.propertiesyaml文件中声明的键,而不是
application.properties
application.yaml
,当您尝试运行Spring应用程序而不指定要使用的配置文件时,将出现此异常

解决方案: 在我的例子中,我使用的是Spring Boot 2.4,这里有一种方法可以告诉你的应用程序将使用哪些配置文件:

命令行:

java -jar -Dspring.profiles.active=DEV myapp.jar
如果您通过IDE(如IntelliJ)运行应用程序:

运行->编辑配置

在Spring配置中,指定要激活的配置文件(用逗号分隔):


我也遇到了同样的问题,希望大家更多地关注这个问题。你解决这个错误了吗?谢谢,我也面临同样的问题。你知道为什么会有这种限制吗?