में बाहरी जार स्कैन नहीं कर रहा है समस्या: वसंत घटक एनोटेशन स्कैन बाहरी जार में एनोटेटेड कक्षा को नहीं उठा रहा है जो pom.xml में शामिल नहीं है। लेकिन मुझे बाहरी जार से विशिष्ट एनोटेशन वाले वर्गों के लिए स्कैन करने की आवश्यकता है। ये बाहरी जार क्लासपाथ में रखे जाएंगे लेकिन संकलन समय के दौरान मेरे आवेदन के लिए ज्ञात नहीं होंगे।एनोटेशन स्कैन क्लासपाथ
1) हम एक Maven मॉड्यूल (artifactId = "metric_processor") जो एक जार फ़ाइल (metric_processor.jar) पैदा करता है और निम्न वर्गों
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 {
.....
}
2) हम एक और Maven मॉड्यूल है (है "artifactId = "metric_processor_external") जो एक जार (metric_processor_external.jar) पैदा करता है और संकलन समय गुंजाइश के रूप में "metric_processor" मॉड्यूल भी शामिल है।
package com.metric;
@ProcessMetric(name="TEST_METRIC_EXTERNAL")
@Component
public class TestMetricProcessor implements MetricProcessor {
....
}
3) हम एक तिहाई (मुख्य) Maven मॉड्यूल (artifactId = "main_application" है) जो एक स्टैंड अकेले आवेदन (वसंत का उपयोग करता है) जिसमें शामिल हैं संकलन क्षेत्र में ई मॉड्यूल "मेट्रिक_प्रोसेसर"। (लेकिन "metric_processor_external" शामिल नहीं है)। तीसरा मॉड्यूल के लिए निर्माण प्लगइन इस मॉड्यूल के लिए
<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>
ऐप्लिकेशन संदर्भ एक्सएमएल
<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>
मैं निम्नलिखित वर्ग जो आवेदन
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());
}
}
}
के शुरुआती बिंदु है है है हम तीसरे मॉड्यूल को
maven clean install assembly:single
के रूप में संकलित करें
यह जार फ़ाइल "main_application-साथ-dependencies.jar"
फिर हम चलाने का उत्पादन अपने
java -cp "metric_process_external.jar" -jar main_application-with-dependencies.jar
अब आवेदन केवल "LatencyMetricProcessor" पाता है और "TestMetricProcessor" नहीं मिल रहा है के रूप में।
क्या कोई मदद कर सकता है?
उपयोग हम वसंत 2.5.6 – Thiyanesh