2013-05-12 19 views
6

Problem: Skanowanie adnotacji składnika sprężyn nie zbiera klasy opisanej w zewnętrznym słoiku, który nie jest zawarty w pom.xml. Ale muszę skanować pod kątem klas z konkretną adnotacją z zewnętrznych słoików. Te zewnętrzne słoiki zostaną umieszczone w ścieżce klas, ale nie będą znane mojej aplikacji podczas kompilacji.Skanowanie adnotacji nie skanuje zewnętrznych słoików w ścieżce klasy

1) Mamy moduł maven (artifactId = "metric_processor"), który tworzy plik jar (metric_processor.jar) i ma następujące klasy

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) mamy kolejny moduł maven ("artifactId = "metric_processor_external"), który wytwarza się kubek (metric_processor_external.jar) i obejmuje "metric_processor" moduł jako kompilacji zakresie czasu.

package com.metric; 
@ProcessMetric(name="TEST_METRIC_EXTERNAL") 
@Component 
public class TestMetricProcessor implements MetricProcessor { 
    .... 
} 

3), to trzeci (główny) modułu maven (artifactId = "main_application"), który jest samodzielną aplikacją (używa sprężyny), która obejmuje Moduł es "metric_processor" w zakresie kompilacji. (Ale nie zawiera "metric_processor_external"). Kompilacji wtyczki do trzeciego modułu jest

<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> 

Zastosowanie kontekst xml dla tego modułu jest

<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> 

Mam następujące klasy, która jest punktem wyjścia dla zastosowania

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()); 
     } 
    } 
} 

my skompiluj trzeci moduł jako

ta produkuje plik jar "main_application-z-dependencies.jar"

Potem dobiegł końca jak

java -cp "metric_process_external.jar" -jar main_application-with-dependencies.jar 

Teraz aplikacja znajdzie tylko "LatencyMetricProcessor" i nie znaleźć "TestMetricProcessor".

Czy ktoś może pomóc?

+0

używamy wiosna 2.5.6 – Thiyanesh

Odpowiedz

8

Po użyciu opcji -jar do wykonania pliku jar, opcja -cp jest ignorowana.

The Oracle Java docs dla opcji -jar powiedzieć:

-jar

wykonać program zamknięty w pliku JAR. Pierwszy argument to nazwa pliku JAR zamiast nazwy klasy uruchamiania. Aby ta opcja zadziałała, manifest pliku JAR musi zawierać wiersz postaci Main-Class: classname. W tym przypadku nazwa_klasy identyfikuje klasę mającą publiczną metodę statycznej pustej magistrali (String [] args), którą pełni jako punkt wyjścia twojej aplikacji. Informacje na temat pracy z plikami jar i manifestami plików JAR można znaleźć na stronie odniesienia narzędzia Jar i ścieżce Jar instrukcji Java Tutorial.

Gdy używa się tej opcji, plik JAR jest źródłem wszystkich klas użytkowników , a inne ustawienia ścieżki klasy użytkownika są ignorowane.

również sprawdzić ten wpis: stackoverflow.com/questions/5879925/in-linux-how-to-execute-java-jar-file-with-external-jar-files

Więc musisz określić metric_process_external.jar w pliku manifestu użyciu Class-Path: nagłówek. Powinieneś być w stanie uzyskać wtyczkę Maven Assembly, aby to zrobić.

Jeśli nie jest to praktyczne, musisz uruchomić aplikację bez -jar flagi:

java -cp "metric_process_external.jar:main_application-with-dependencies.jar" com.main.TriggerMetricProcessor 
+0

Dziękuję bardzo. To działa dobrze. – Thiyanesh

+0

Co jeśli używam deklaracji bean przy użyciu XML. Czy to zadziała? Mam tam problemy. – Shamli

Powiązane problemy