问题:Spring Component Annotation扫描没有拾取外部jar中注释的类,该类未包含在pom.xml中.但是我需要从外部jar中扫描具有特定注释的类.这些外部jar将放在类路径中,但在编译期间我的应用程序不会知道.
1)我们有一个maven模块(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)我们有另一个maven模块(“artifactId =”metric_processor_external“),它生成一个jar(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”),它是一个独立的应用程序(使用spring),它在编译范围内包含模块“metric_processor”. (但不包括“metric_processor_external”).第三个模块的构建插件是
此模块的应用程序上下文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
我们将第三个模块编译为
maven clean install assembly:single
这会生成jar文件“main_application-with-dependencies.jar”
然后我们运行它
java -cp "metric_process_external.jar" -jar main_application-with-dependencies.jar
现在应用程序只找到“LatencyMetricProcessor”并且找不到“TestMetricProcessor”.
有人可以帮忙吗?
-jar选项的Oracle Java docs说:
-jar
Execute a program encapsulated in a JAR file. The first argument is
the name of a JAR file instead of a startup class name. In order for
this option to work,the manifest of the JAR file must contain a line
of the form Main-Class: classname. Here,classname identifies the
class having the public static void main(String[] args) method that
serves as your application’s starting point. See the Jar tool
reference page and the Jar trail of the Java Tutorial for @R_327_4045@ion
about working with Jar files and Jar-file manifests.When you use this option,the JAR file is the source of all user
classes,and other user class path settings are ignored.
另请查看这篇文章:stackoverflow.com/questions/5879925/in-linux-how-to-execute-java-jar-file-with-external-jar-files
因此,您需要使用Class-Path:标头在清单文件中指定metric_process_external.jar.您应该可以使用Maven程序集插件来执行此操作.
如果这不实用,则需要在没有-jar标志的情况下运行应用程序:
java -cp "metric_process_external.jar:main_application-with-dependencies.jar" com.main.TriggerMetricProcessor
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。