【问题标题】:Spring Circular placeholder reference while running an executable jar运行可执行 jar 时的 Spring Circular 占位符引用
【发布时间】:2012-07-18 01:28:51
【问题描述】:

我在尝试运行可执行 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 文件。这是一个sn-p


<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 文件中使用过类似的模式。

任何指针将不胜感激。

谢谢

【问题讨论】:

  • 我也有同样的问题,希望看到更多关注这个问题。你解决了这个错误吗?

标签: java spring maven maven-shade-plugin


【解决方案1】:

它可能无法找到资源 - postprocess.properties。可以请您删除这一行 -

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

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

【讨论】:

    【解决方案2】:

    回答这个问题可能为时已晚,但添加它是为了让面临类似问题的人受益。

    我可以通过更改键名来修复它。例如

     <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不能相同。

    【讨论】:

    • 谢谢,我遇到了同样的问题。你知道为什么会存在这个限制吗?
    【解决方案3】:

    我在尝试使用 SpringJUnit4ClassRunner 运行 Spring 集成测试时遇到了同样的问题。我不确定如何加载我的属性文件,经过一些错误步骤后,我找到了 @TestPropertySource 注释,它允许我定义所需的属性文件。

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

    希望这对其他人有所帮助。

    【讨论】:

      【解决方案4】:
      Circular placeholder reference XXXX in property definitions
      

      当您的属性键名和值变量名完全相同时,spring-framework 将引发上述异常。

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

      【讨论】:

        【解决方案5】:

        在您的 java 代码中,如果您使用在 application.propertiesapplication.yaml 以外的某些 .propertiesyaml 文件中声明的键,您将收到此异常当您尝试在未指定要使用的配置文件的情况下运行 Spring 应用程序时。

        解决方案: 就我而言,我使用的是 Spring Boot 2.4,这是告诉您的应用将使用哪些配置文件的一种方法:

        命令行:

        java -jar -Dspring.profiles.active=DEV myapp.jar
        

        如果您通过 IntelliJ 等 IDE 运行应用:

        运行 -> 编辑配置

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

        【讨论】:

          猜你喜欢
          • 2016-12-25
          • 2017-06-10
          • 2019-02-10
          • 2015-06-26
          • 2020-10-15
          • 1970-01-01
          • 2023-03-20
          • 1970-01-01
          • 2018-05-26
          相关资源
          最近更新 更多