2013-05-12 120 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