2013-05-12 8 views
6

में बाहरी जार स्कैन नहीं कर रहा है समस्या: वसंत घटक एनोटेशन स्कैन बाहरी जार में एनोटेटेड कक्षा को नहीं उठा रहा है जो pom.xml में शामिल नहीं है। लेकिन मुझे बाहरी जार से विशिष्ट एनोटेशन वाले वर्गों के लिए स्कैन करने की आवश्यकता है। ये बाहरी जार क्लासपाथ में रखे जाएंगे लेकिन संकलन समय के दौरान मेरे आवेदन के लिए ज्ञात नहीं होंगे।एनोटेशन स्कैन क्लासपाथ

1) हम एक Maven मॉड्यूल (artifactId = "metric_processor") जो एक जार फ़ाइल (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") जो एक जार (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" है) जो एक स्टैंड अकेले आवेदन (वसंत का उपयोग करता है) जिसमें शामिल हैं संकलन क्षेत्र में ई मॉड्यूल "मेट्रिक_प्रोसेसर"। (लेकिन "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> 

ऐप्लिकेशन संदर्भ एक्सएमएल

<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 
के रूप में संकलित करें

यह जार फ़ाइल "main_application-साथ-dependencies.jar"

फिर हम चलाने का उत्पादन अपने

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

अब आवेदन केवल "LatencyMetricProcessor" पाता है और "TestMetricProcessor" नहीं मिल रहा है के रूप में।

क्या कोई मदद कर सकता है?

+0

उपयोग हम वसंत 2.5.6 – Thiyanesh

उत्तर

8

जब आप एक जार फ़ाइल निष्पादित करने के लिए -jar विकल्प का उपयोग करते हैं, तो -cp विकल्प को अनदेखा किया जाता है।

Oracle Java docs जार विकल्प के लिए कहते हैं:

जार

एक कार्यक्रम एक जार फ़ाइल में समझाया निष्पादित। पहला तर्क स्टार्टअप क्लास नाम के बजाय एक JAR फ़ाइल का नाम है। के लिए यह विकल्प काम करने के लिए, जेएआर फ़ाइल के मेनिफेस्ट में मुख्य श्रेणी: वर्गनाम के रूप में पंक्ति होनी चाहिए। यहां, वर्गनाम वर्ग की पहचान करता है जिसमें सार्वजनिक स्थैतिक शून्य मुख्य (स्ट्रिंग [] तर्क) विधि है जो आपके एप्लिकेशन के शुरुआती बिंदु के रूप में कार्य करता है। जार फाइल संदर्भ पृष्ठ और जावा ट्यूटोरियल के जार ट्रेल को जानकारी के लिए जार फ़ाइलों और जार-फ़ाइल मैनिफ़ेस्ट के साथ काम करने के बारे में देखें।

जब आप इस विकल्प का उपयोग करते हैं, तो JAR फ़ाइल सभी उपयोगकर्ता कक्षाओं का स्रोत है, और अन्य उपयोगकर्ता श्रेणी पथ सेटिंग्स को अनदेखा कर दिया जाता है।

इसके अलावा इस पोस्ट की जाँच: stackoverflow.com/questions/5879925/in-linux-how-to-execute-java-jar-file-with-external-jar-files

तो तुम एक Class-Path: हेडर का उपयोग कर अपने मैनिफ़ेस्ट फ़ाइल में metric_process_external.jar का उल्लेख करना होगा। ऐसा करने के लिए आपको अपना मेवेन असेंबली प्लगइन प्राप्त करने में सक्षम होना चाहिए।

अगर वह व्यावहारिक नहीं है, आप जार ध्वज के बिना अपने आवेदन चलाने की आवश्यकता होगी:

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

आपको बहुत बहुत धन्यवाद। यह बढ़िया काम करता है। – Thiyanesh

+0

यदि मैं एक्सएमएल का उपयोग कर बीन घोषणा का उपयोग कर रहा हूं तो क्या होगा। क्या ये काम करेगा? मुझे वहां मुद्दों का सामना करना पड़ रहा है। – Shamli

संबंधित मुद्दे