2010-01-07 6 views
77

के साथ एक रननेबल जार का निर्माण मैं मैवेन मंत्र के लिए अपेक्षाकृत नया हूं, लेकिन मैवेन के साथ एक कमांड लाइन रननेबल जार बनाने की कोशिश कर रहा हूं। मैंने अपनी निर्भरताओं को स्थापित किया है, लेकिन जब मैं mvn install चलाता हूं और जार चलाने की कोशिश करता हूं, तो दो चीजें होती हैं। सबसे पहले, कोई मुख्य वर्ग नहीं मिला है, जो कि सुधार योग्य है। जब मैंने इसे सही किया है, तो मुझे दौड़ने में त्रुटियां मिलती हैं कि कक्षाएं नहीं मिल सकती हैं।मैवेन 2

मैवेन जार के अंदर मेरी निर्भरता पुस्तकालयों को पैकेजिंग नहीं कर रहा है, इसलिए मैं जार को स्टैंड-अलोन एप्लिकेशन के रूप में चलाने में असमर्थ हूं। मैं इसे कैसे ठीक करूं?

+0

आप Netbenas – SjB

+7

@SjB तरह Maven के लिए आईडीई का उपयोग कर सकते दिया जाता है बनाते हैं? मुझे ऐसा नहीं लगता। –

+1

वास्तव में क्या, वास्तव में डुप्लिकेट? –

उत्तर

105

ऐसा करने का सबसे आसान तरीका maven-assembly-plugin और पूर्वनिर्धारित jar-with-dependencies डिस्क्रिप्टर का उपयोग करके एक असेंबली बनाना होगा। आपको इस उबेर जार के लिए मुख्य श्रेणी के प्रवेश के साथ एक मेनिफेस्ट उत्पन्न करने की भी आवश्यकता होगी। नीचे दिए गए स्निपेट से पता चलता विधानसभा प्लगइन कॉन्फ़िगर कैसे ऐसा करने के लिए: फिर

<build> 
    <plugins> 
    <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <configuration> 
     <descriptorRefs> 
      <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 
     <archive> 
      <manifest> 
      <mainClass>fully.qualified.MainClass</mainClass> 
      </manifest> 
     </archive> 
     </configuration> 
    </plugin> 
    </plugins> 
</build> 

, विधानसभा उत्पन्न करने के लिए, बस चलाने:

mvn assembly:assembly 

आप अपने निर्माण के हिस्से के रूप विधानसभा जनरेट करना चाहते हैं , बस पैकेज चरण के लिए assembly:single मोजो बाँध:

<build> 
    <plugins> 
    <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <configuration> 
     <descriptorRefs> 
      <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 
     <archive> 
      <manifest> 
      <mainClass>fully.qualified.MainClass</mainClass> 
      </manifest> 
     </archive> 
     </configuration> 
     <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
      <goal>single</goal> 
      </goals> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
</build> 

और बस चलाने:

mvn package 
+1

मेवेन-शेड-प्लगइन भी इसी तरह काम करता है और इस उद्देश्य के लिए समर्पित है। –

+4

यह वसंत, और अन्य पुस्तकालयों के लिए काम नहीं करता है जो कक्षा पथ पर एक ही नाम के साथ कई संसाधनों की अपेक्षा करते हैं। वसंत के मामले में, मेटा-आईएनएफ \ spring.schemas कई जारों (सेम, जेडीबीसी, आदि) में शामिल है और एक्सएमएल पार्सर के लिए एक्सएमएल नेमस्पेस समर्थन को कॉन्फ़िगर करने के लिए प्रयोग किया जाता है। यदि आप 'जार-ऑन-निर्भरता' का प्रयास करते हैं, तो pasing application-context.xml रनटाइम पर "org.xml.sax.SAXParseException: cvc-elt.1: तत्व 'बीन्स' की घोषणा नहीं मिल सकता है।" –

+0

@ डेविड मैवेन जावा "सीमा" को हल नहीं करेगा। उस मामले में बस अपने आवेदन को साफ-सफाई करें (यानी uberjar में नहीं)। –

25

मैवेन आपकी जार फ़ाइल के अंदर अपनी निर्भरताओं को पैकेज नहीं कर रहा है, क्योंकि आप आमतौर पर जावा प्रोग्राम के साथ ऐसा नहीं करते हैं।

इसके बजाय आप निर्भरता को अपनी जार फ़ाइल के साथ एक साथ वितरित करते हैं और the Class-Path header of the Manifest में उनका उल्लेख करते हैं।

इस मार्ग पर जाने के लिए, आपको maven-jar-plugin के लिए addClasspath संपत्ति (here दस्तावेज) सक्षम करने की आवश्यकता होगी।

यदि आप वास्तव में अपनी जार फ़ाइल में अपनी सभी निर्भरताओं को शामिल करना चाहते हैं, तो आप jar-with-dependencies बनाने के लिए मेवेन असेंबली प्लगइन का उपयोग कर सकते हैं।

+4

+1 मुझे जावा प्रोग्राम कैसे हैं * आम तौर पर इरादा * बनाने के बारे में जानकारी खोजने में कठिनाई हुई है और विशेष रूप से मेवेन के साथ वितरित किया। –

6

मैं जोआचिम सौएर के साथ सहमत,

जार-साथ-निर्भरता का उपयोग कर आप अपने pom.xml में तरह जार प्लगइन कॉन्फ़िगर करना चाहिए करने के बजाय

:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.4</version> 
    <configuration> 
     <archive> 
      <index>true</index> 
      <manifest> 
       <addClasspath>true</addClasspath> 
       <mainClass>[mainClassFullName]</mainClass> 
      </manifest> 
      <manifestEntries> 
       <mode>development</mode> 
       <url>${project.url}</url> 
       <key>value</key> 
      </manifestEntries> 
     </archive> 
    </configuration> 
</plugin> 

और को यह विधानसभा विन्यास का उपयोग आपको असेंबली में जार निर्भरता जोड़ें:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> 
    <id>zip-with-jars</id> 
    <formats> 
    <format>zip</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <dependencySets> 
    <dependencySets> 
    <dependencySet> 
    <outputDirectory>/</outputDirectory> 
    <useProjectArtifact>true</useProjectArtifact> 
    <unpack>false</unpack> 
    <scope>runtime</scope> 
    </dependencySet> 
</dependencySets> 
    </dependencySets> 
</assembly> 
8

मैं छोटी परियोजनाओं के लिए यही करूंगा। अधिकांश समय आप एक विशाल जार नहीं चाहते हैं।

निर्माण करने के लिए: mvn स्वच्छ निर्भरता: कॉपी-निर्भरता पैकेज

(लक्ष्य dir में ) निष्पादित करने के लिए: जावा -cp myjar.jar: ./ निर्भरता/* com.something .MyClass

+0

+1 सरल के लिए नो कॉन्फ़िगरेशन नो-पोम-संशोधन समाधान। –

+0

बढ़िया! मैंने इसे अपने मेकफ़ाइल में, उसी निर्देशिका में pom.xml के साथ सहेजा। निर्माण: \ n एमवीएन .... (आपने क्या कहा) – Roboprog

+0

धन्यवाद। 2 घंटे से अधिक समय के लिए इंटरनेट खोजने के बाद यह बहुत उपयोगी जवाब मिला .... – Shekhar

2

बस नीचे दिए गए कोड को pom.xml में जोड़ें और इस प्रकार चलाएं: maven: install।जार ग्रहण के लक्षित फ़ोल्डर में बनाया जाएगा जिसका उपयोग "जावा -जर हैलो.जर" के रूप में किया जा सकता है। और है कि जादुई समस्या का हल: लेकिन लगता है कि मुख्य वर्ग का नाम com.abc.HelloWorld.java

<build> 
<plugins> 
<plugin> 
<groupid>org.apache.maven.plugins</groupid> 
<artifactid>maven-shade-plugin</artifactid> 
<executions> 
<execution> 
<phase>package</phase> 
<goals> 
<goal>shade</goal> 
</goals> 
<configuration> 
<finalname>HelloW</finalname> 
<transformers> 
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
<manifestentries> 
<main-class>com.abc.HelloWorld.java</main-class> 
<build-number>1</build-number> 
</manifestentries> 
</transformer> 
</transformers> 
</configuration> 
</execution> 
</executions> 
</plugin> 
</plugins> 

</build>