Problema: Scansione di annotazione del componente a molla che non rileva la classe annotata nel contenitore esterno non inclusa in pom.xml. Ma ho bisogno di cercare classi con annotazioni specifiche da giare esterne. Questi jar esterni verranno posizionati nel classpath ma non saranno noti alla mia applicazione durante la compilazione.Scansione di annotazione non scansionare giare esterne nel classpath
1) Abbiamo un modulo maven (artifactId = "metric_processor") che produce un file jar (metric_processor.jar) ed ha seguenti classi
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) Abbiamo un altro modulo Maven ("artifactId = "metric_processor_external"), che produce un barattolo (metric_processor_external.jar) e comprende modulo "metric_processor" come portata fase di compilazione.
package com.metric;
@ProcessMetric(name="TEST_METRIC_EXTERNAL")
@Component
public class TestMetricProcessor implements MetricProcessor {
....
}
3) Abbiamo un terzo (principale) modulo maven (artifactId = "main_application"), che è un'applicazione stand-alone (usa molla) che include es modulo "metric_processor" in ambito di compilazione. (Ma non include "metric_processor_external"). Il plugin di generazione per il terzo modulo è
<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>
Application contesto XML per questo modulo è
<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>
devo classe a seguito della quale è il punto di partenza dell'applicazione
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());
}
}
}
siamo compilare il terzo modulo come
maven clean install assembly:single
Questo produce il file jar "main_application-con-dependencies.jar"
Poi abbiamo fatto il suo come
java -cp "metric_process_external.jar" -jar main_application-with-dependencies.jar
Adesso l'applicazione trova solo "LatencyMetricProcessor" e non trova il "TestMetricProcessor".
Qualcuno può aiutare?
usiamo primavera 2.5.6 – Thiyanesh