注释扫描不扫描类路径中的外部罐子
问题:Spring组件注释扫描不会拾取未包含在pom.xml中的外部罐子中注释的类。但我需要扫描具有来自外部罐子的特定注释的类。这些外部jar将被放置在类路径中,但在编译期间不会被我的应用程序知道。注释扫描不扫描类路径中的外部罐子
1)我们有一个行家模块(的artifactId = “metric_processor”),它产生一个jar文件(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)我们有另一个行家模块(“的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)我们有三分之一(主)行家模块(的artifactId = “main_application”),其是一个独立的应用程序(使用弹簧),其中包括es模块“metric_processor”在编译范围内。 (但不包括“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>
该模块的应用程序上下文XML是
<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
由此产生的JAR文件“main_application与 - dependencies.jar”
然后我们运行它作为
java -cp "metric_process_external.jar" -jar main_application-with-dependencies.jar
现在,应用程序只能找到“LatencyMetricProcessor”,不找到“TestMetricProcessor”。
有人可以帮忙吗?
当您使用-jar选项执行jar文件时,-cp选项将被忽略。
的Oracle Java docs的-jar选项说:
罐子
执行封装在JAR文件的程序。第一个参数是 JAR文件的名称,而不是启动类名称。为了使 这个选项起作用,JAR文件的清单必须包含Main-Class:classname形式的行 。这里,classname标识 类,该类具有公共静态void main(String [] args)方法, 用作应用程序的起点。有关使用Jar文件和Jar文件清单的信息,请参阅Jar工具 参考页和Java教程的Jar踪迹以获取有关信息 的信息。
当您使用此选项时,JAR文件是所有用户类的源 ,而其他用户类路径设置将被忽略。
还检查了这个帖子:stackoverflow.com/questions/5879925/in-linux-how-to-execute-java-jar-file-with-external-jar-files
所以你需要使用Class-Path:
头在你的清单文件中指定metric_process_external.jar。你应该可以让你的Maven assembly插件来做到这一点。
如果这是不实际的,你需要无-jar标志运行应用程序:
java -cp "metric_process_external.jar:main_application-with-dependencies.jar" com.main.TriggerMetricProcessor
我们使用的弹簧2.5.6 – Thiyanesh 2013-05-12 09:52:29