実行可能なjarファイルを実行しようとすると、「CircularPlaceholderreference」例外が発生します。詳細な例外は次のとおりです。
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>
シェードプラグインを使用して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キーとフィルタリングされるプロパティ値のキーを同じにすることはできません。
SpringJUnit4ClassRunnerを使用してSpring統合テストを実行しようとしたときに、同じ問題が発生していました。プロパティファイルをロードする方法がわからず、いくつかのミスステップの後、必要なプロパティファイルを定義できる@TestPropertySourceアノテーションを見つけました。
その前に@PropertySourceを試しましたが、このような春の統合テストを実行していると機能しません。
うまくいけば、これは他の誰かを助けるでしょう。
おそらくリソースを見つけることができません-postprocess.properties
。この行を削除していただけませんか-
<property name="ignoreResourceNotFound" value="true" />
次に、リソースが見つからない場合は、適切なメッセージが表示されます。