問題:Springコンポーネントの注釈スキャンで、pom.xmlに含まれていない外部jarでアノテートされたクラスが取得されない。しかし、私は外部のジャーから特定の注釈を持つクラスをスキャンする必要があります。これらの外部ジャーはクラスパスに配置されますが、コンパイル時には私のアプリケーションには知られません。注釈スキャンでクラスパス内の外部ジャーをスキャンしない
1)我々はJARファイル(metric_processor.jar)を生成し、有しMavenのモジュール(たartifactId = "metric_processor")以下のクラス
package com.metric;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ProcessMetric {
String name();
}
package com.metric;
public interface MetricProcessor {
int computeMetric();
}
package com.metric;
@ProcessMetric(name="LATENCY")
@Component
public class LatencyMetricProcessor implements MetricProcessor {
.....
}
)我々は、(別のMavenのモジュールを持っているを持っている "たartifactId =ジャー(metric_processor_external.jar)を生成し、コンパイル時の範囲として "metric_processor" モジュールを含む) "metric_processor_external"。
package com.metric;
@ProcessMetric(name="TEST_METRIC_EXTERNAL")
@Component
public class TestMetricProcessor implements MetricProcessor {
....
}
3)我々は、第三の(主)Mavenのモジュール(たartifactId = "main_application" を有する)はスタンドアローンのアプリケーションです(春を使用します)。 esモジュール "metric_processor"をコンパイルスコープに追加します。 (しかし、 "metric_processor_external"は含まれません)。第3のモジュールのビルドプラグインは、このモジュールの
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.main.TriggerMetricProcessor</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
アプリケーションコンテキストXMLは、私はアプリケーションの出発点は、我々
package com.main;
import ...
public class TriggerMetricProcessor {
public static void main(String[] args) throws Exception {
ApplicationContext context =
new ClassPathXmlApplicationContext("application-context.xml");
TriggerMetricProcessor triggerMetricProcessor = (TriggerMetricProcessor) context.getBean("triggerMetricProcessor");
triggerMetricProcessor.initMetricProcessor(context);
}
private void initMetricProcessor(ApplicationContext context) {
GenericBeanFactoryAccessor beanFactoryAccessor = new GenericBeanFactoryAccessor(context);
final Map<String, Object> metricProcessors = beanFactoryAccessor.getBeansWithAnnotation(ProcessMetric.class);
for (final Object metricProcessor : metricProcessors.values()) {
final Class<? extends MetricProcessor> metricProcessorClass = (Class<? extends MetricProcessor>)metricProcessor.getClass();
final ProcessMetric annotation = metricProcessorClass.getAnnotation(ProcessMetric.class);
System.out.println("Found MetricProcessor class: " + metricProcessorClass + ", with name: " + annotation.name());
}
}
}
ある以下のクラスを持っている
<beans>
<context:component-scan base-package="com.metric">
<context:include-filter type="annotation" expression="com.metric.ProcessMetric" />
</context:component-scan>
<bean id="triggerMetricProcessor" class="com.main.TriggerMetricProcessor" />
</beans>
です第3のモジュールを
maven clean install assembly:single
としてコンパイルします。
これは
をjarファイル "main_application-と-dependencies.jar" を生成その後、我々は
java -cp "metric_process_external.jar" -jar main_application-with-dependencies.jar
としての実行これでアプリケーションは、唯一の "LatencyMetricProcessor" を見つけ、 "TestMetricProcessor" が見つかりません。
誰かが助けてくれますか?
我々が使用する春2.5.6 – Thiyanesh