2013-05-12 23 views
6

Sorun: Yay Bileşeni Ek açıklama taraması, pom.xml dosyasında bulunmayan dış kavanozda açıklanmış olan sınıfı seçmiyor. Ama dış kavanozlardan belirli bir açıklama ile sınıfları taramak gerekiyor. Bu harici kavanozlar sınıf yoluna yerleştirilecek ancak derleme sırasında başvurumla bilinmeyecek.Notlama taraması sınıf yolunda harici kavanozları taramıyor

1) Bir kavanoz dosyası (metric_processor.jar) üretir ve sahip olan bir maven modülü (artifactId = "metric_processor") aşağıdaki sınıfların

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 { 
    ..... 
} 
) Biz (başka bir Maven modülüne sahip olması "artifactId = bir kavanoz (metric_processor_external.jar) üretir ve derleme zaman kapsamı olarak "metric_processor" modülü içerir) "metric_processor_external".

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

3) üçüncü bir (ana) maven modülü (artifactId = "main_application" sahip) olan Dahil olan tek başına bir uygulamadır (yay kullanır) derleme kapsamındaki "metric_processor" es modülü. (Ancak "metric_processor_external" dahil değildir). Üçüncü modül için yapı eklentisi, bu modül için

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

uygulama bağlamında 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> 

I uygulama

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

başlangıç ​​noktası olduğu aşağıdaki sınıfı olduğu biz üçüncü modülü

olarak derleyin

Bu "main_application-ile-dependencies.jar" kavanoz dosyası

Sonra çalıştırmak üreten onun

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

Şimdi uygulama yalnızca "LatencyMetricProcessor" bulur ve "TestMetricProcessor" bulamazsa olarak.

Birisi yardım edebilir mi?

+0

Kullandığımız bahar 2.5.6 – Thiyanesh

cevap

8

Bir jar dosyasını yürütmek için -jar seçeneğini kullandığınızda, -cp seçeneği yoksayılır.

-jar seçeneği için Oracle Java docs

ki:

-jar

bir JAR dosyası kapsüllü bir program çalıştır. İlk argüman, bir başlangıç ​​sınıfı adı yerine bir JAR dosyasının adı olan 'dur. Bu seçeneğin çalışması için için JAR dosyasının bildirimi, Ana Sınıf: sınıf adı olan bir satır içermelidir. Burada, classname, uygulamasının başlangıç ​​noktası olarak hizmet ettiği genel statik void main (String [] args) yöntemine sahip sınıfını tanımlar. başvuru sayfasına ve Kavanoz dosyaları ve Kavanoz dosyası bildirimleriyle çalışma hakkında bilgi edinmek için bilgi için Java Öğreticisinin Jar trail'ini inceleyin.

Bu seçeneği kullandığınızda, JAR dosyası tüm kullanıcı sınıflarının kaynağıdır ve diğer kullanıcı sınıfı yol ayarları dikkate alınmaz.

Ayrıca bu yayını göz atın: stackoverflow.com/questions/5879925/in-linux-how-to-execute-java-jar-file-with-external-jar-files

Yani bir Class-Path: başlık kullanarak bildirim dosyası metric_process_external.jar belirtmek gerekir. Bunu yapmak için Maven montaj eklentinizi almanız gerekir.

pratik değilse, -jar bayrağı olmadan uygulamayı çalıştırmak gerekir:

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

Çok teşekkür ederim. İyi çalışıyor. – Thiyanesh

+0

XML kullanarak fasulye beyanı kullanıyorum. Çalışacak mı? Orada meselelerle karşılaşıyorum. – Shamli

İlgili konular