मावेन 2 के साथ एक रनिंग जार का निर्माण


82

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

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


आप नेबेन की तरह मावेन के लिए आईडीई का उपयोग कर सकते हैं
बहमनी

7
@ एसजेबी: और वह जादुई रूप से समस्या का समाधान करता है? मुझे ऐसा नहीं लगता।
जोकिम सॉर

1
क्या वास्तव में, के नकली नकल?
स्टीफन केंडल

हो सकता है कि यह एक stackoverflow.com/questions/1832853/… , या यह एक stackoverflow.com/questions/574594/… (लेकिन स्वीकृत उत्तर गलत है), या यह एक stackoverflow.com/questions/1814426/… । वास्तव में, यह
मावेन

1
अन्य जवाब उतने साफ नहीं हैं, और uber जार (गलत तरीके से वर्तनी), निष्पादन योग्यता का उल्लेख नहीं करता है। इसके अलावा, अन्य विषय अप्रासंगिक सामग्री से भरे हुए हैं, जैसे कि स्रोत का स्तर आदि
स्टीफन केंडल

जवाबों:


113

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

<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
यह वसंत, और अन्य पुस्तकालयों के लिए काम नहीं करता है जो वर्ग पथ पर एक ही नाम के साथ कई संसाधनों की अपेक्षा करते हैं। वसंत के मामले में, META-INF \ spring.schemas कई जार (बीन्स, jdbc, आदि) में शामिल है और XML पार्सर के लिए XML नामस्थान समर्थन को कॉन्फ़िगर करने के लिए उपयोग किया जाता है। यदि आप 'जार-विद-डिपेंडेंसीज़' को आज़माते हैं, तो एप्लिकेशन-रेफरेंस-रेस्पोंस को पॉज़ करना। xml रनऑर्ग में विफल हो जाएगा जैसे "org.xml.sax.SAXParseException: cvc-elt.1: एलिमेंट 'बीन्स' की घोषणा नहीं कर सकता।"
डेविड रसेल

@ दाविद मावेन एक जावा "सीमा" को हल नहीं करेगा। बस उस स्थिति में अपने आवेदन को साफ-सुथरा (यानी uberjar में नहीं) पैकेज करें।
पास्कल थिवेंट

यह बिना किसी समस्या के स्प्रिंग कॉन्फ़िगरेशन के साथ काम करता है। मेरा मुख्य वर्ग क्लासपैथ एप्लिकेशन संदर्भ के साथ अन्य सभी वर्गों को लोड करता है और यह समाधान पूरी तरह से काम करता है।
वि। अव।

2
assembly:assemblyलक्ष्य है पदावनत
जारेड बेक

25

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

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

इस मार्ग पर जाने के लिए, आपको addClasspath( यहाँ प्रलेखित ) संपत्ति को सक्षम करना होगा maven-jar-plugin

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


4
+1 मैंने एक कठिन समय पाया है कि कैसे जावा प्रोग्रामों को बनाने और वितरित करने का इरादा है, खासकर मावेन के साथ।
एड ब्रानिन

8

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

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

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


महान! मैंने इसे अपने Makefile में pom.xml के साथ एक ही डायरेक्टरी में सेव किया। बिल्ड: \ n mvan .... (आपने क्या कहा)
Roboprog

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

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>

2

बस pom.xml में नीचे कोड जोड़ें और इसे चलाएं: maven: install करें। जार को ग्रहण के लक्ष्य फ़ोल्डर में बनाया जाएगा जिसका उपयोग "java -jar Hello.jar" के रूप में किया जा सकता है। लेकिन सुनिश्चित करें कि मुख्य वर्ग का नाम 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>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.