2013-05-12 106 views
6

问题: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”。

有人可以帮忙吗?

+0

我们使用的弹簧2.5.6 – Thiyanesh 2013-05-12 09:52:29

回答

8

当您使用-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 
+0

非常感谢你。它工作正常。 – Thiyanesh 2013-05-18 12:17:31

+0

如果我使用XML来使用bean声明该怎么办。它会起作用吗?我在那里遇到问题。 – Shamli 2014-05-13 10:29:18