मवन के साथ निष्पादन योग्य जार का निर्माण?


122

मैं एक छोटे से घर परियोजना के लिए एक निष्पादन योग्य जार उत्पन्न करने की कोशिश कर रहा हूं जिसे "लॉगमैनगर" कहा जाता है, मावेन का उपयोग करना, बस इस तरह से:

मैं मावेन का उपयोग कर निर्भरता के साथ एक निष्पादन योग्य जार कैसे बना सकता हूं?

मैंने वहां दिखाए गए स्निपेट को pom.xml में जोड़ा, और mvan असेंबली: असेंबली को चलाया। यह logmanager / लक्ष्य में दो जार फाइलें उत्पन्न करता है: logmanager-0.1.0.jar, और logmanager-0.1.0-जार-साथ-निर्भरताएँ ।jar। पहले जार पर डबल क्लिक करने पर मुझे एक त्रुटि मिलती है:

Could not find the main class: com.gorkwobble.logmanager.LogManager. Program will exit.

जब मैं जार के साथ निर्भरताएँ को डबल-क्लिक करता हूँ, तो थोड़ी अलग त्रुटि:

Failed to load Main-Class manifest attribute from: C:\EclipseProjects\logmanager\target\logmanager-0.1.0-jar-with-dependencies.jar

मैंने पथ और क्लासनाम को कॉपी और पेस्ट किया, और पीओएम में वर्तनी की जांच की। मेरा मुख्य वर्ग एक ग्रहण लॉन्च कॉन्फ़िगरेशन से ठीक लॉन्च करता है। क्या कोई यह जानने में मेरी मदद कर सकता है कि मेरी जार फाइल क्यों नहीं चलेगी? इसके अलावा, दो जार क्यों हैं? कृपया मुझे बताएं कि क्या आपको और अधिक जानकारी चाहिये?

यहाँ pom.xmlसंदर्भ के लिए पूर्ण है :

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.gorkwobble</groupId>
  <artifactId>logmanager</artifactId>
  <name>LogManager</name>
  <version>0.1.0</version>
  <description>Systematically renames specified log files on a scheduled basis. Designed to help manage MUSHClient logging and prevent long, continuous log files.</description>
  <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.2</version>
            <!-- nothing here -->
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.2-beta-4</version>
            <configuration>
              <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
              </descriptorRefs>
              <archive>
                <manifest>
                  <mainClass>com.gorkwobble.logmanager.LogManager</mainClass>
                </manifest>
              </archive>
            </configuration>
            <executions>
              <execution>
                <phase>package</phase>
                <goals>
                  <goal>single</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
              <source>1.6</source>
              <target>1.6</target>
            </configuration>
          </plugin>
    </plugins>
  </build>
  <dependencies>
    <!-- commons-lang -->
    <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.4</version>
    </dependency> 

    <!-- Quartz scheduler -->
    <dependency>
        <groupId>opensymphony</groupId>
        <artifactId>quartz</artifactId>
        <version>1.6.3</version>
    </dependency>
    <!-- Quartz 1.6.0 depends on commons collections -->
    <dependency>
      <groupId>commons-collections</groupId>
      <artifactId>commons-collections</artifactId>
      <version>3.1</version>
    </dependency>
    <!-- Quartz 1.6.0 depends on commons logging -->
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.1</version>
    </dependency>
    <!-- Quartz 1.6.0 requires JTA in non J2EE environments -->
    <dependency>
      <groupId>javax.transaction</groupId>
      <artifactId>jta</artifactId>
      <version>1.1</version>
      <scope>runtime</scope>
    </dependency>

    <!-- junitx test assertions -->
    <dependency>
        <groupId>junit-addons</groupId>
        <artifactId>junit-addons</artifactId>
        <version>1.4</version>
        <scope>test</scope>
    </dependency>

    <!-- junit dependency; FIXME: make this a separate POM -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.1</version>
    </dependency>

  </dependencies>
  <dependencyManagement>
  </dependencyManagement>
</project>

जवाबों:


244

वास्तव में, मुझे लगता है कि आपके द्वारा बताए गए प्रश्न में दिया गया उत्तर गलत है ( UPDATE - 20101106: किसी ने यह तय किया है, यह उत्तर संस्करण को संपादित करने से पहले के संस्करण को संदर्भित करता है ) और यह बताता है, कम से कम आंशिक रूप से, आप परेशानियों में क्यों भागते हैं।


यह logmanager / लक्ष्य में दो जार फाइलें उत्पन्न करता है: logmanager-0.1.0.jar, और logmanager-0.1.0-जार-साथ-निर्भरताएँ ।jar।

पहले एक packageचरण के दौरान उत्पन्न लॉजमैन मॉड्यूल का JAR है jar:jar(क्योंकि मॉड्यूल में पैकेजिंग का प्रकार है jar)। दूसरा एक विधानसभा द्वारा निर्मित है assembly:assemblyऔर इसमें वर्तमान मॉड्यूल और इसकी निर्भरता (यदि आपने विवरणक का उपयोग किया है jar-with-dependencies) से कक्षाएं शामिल होनी चाहिए ।

पहले जार पर डबल क्लिक करने पर मुझे एक त्रुटि मिलती है:

Could not find the main class: com.gorkwobble.logmanager.LogManager. Program will exit.

यदि आपने संदर्भ के रूप में पोस्ट किए गए लिंक के सुझाए गए कॉन्फ़िगरेशन को लागू किया है, तो आपने निष्पादन योग्य कलाकृतियों का उत्पादन करने के लिए जार प्लगइन को कॉन्फ़िगर किया, कुछ इस तरह से:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
      <archive>
        <manifest>
          <addClasspath>true</addClasspath>
          <mainClass>com.gorkwobble.logmanager.LogManager</mainClass>
        </manifest>
      </archive>
    </configuration>
  </plugin>

तो logmanager-0.1.0.jarवास्तव में निष्पादन योग्य है लेकिन 1. यह वह नहीं है जो आप चाहते हैं (क्योंकि इसमें सभी निर्भरता नहीं है) और 2. इसमें शामिल नहीं है com.gorkwobble.logmanager.LogManager(यह वही है जो त्रुटि कह रहा है, जार की सामग्री की जांच करें)।

जब मैं जार के साथ निर्भरताएँ को डबल-क्लिक करता हूँ, तो थोड़ी अलग त्रुटि:

Failed to load Main-Class manifest attribute from: C:\EclipseProjects\logmanager\target\logmanager-0.1.0-jar-with-dependencies.jar

फिर से, यदि आपने सुझाव के अनुसार असेंबली प्लगइन कॉन्फ़िगर किया है, तो आपके पास कुछ इस तरह है:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
    </configuration>
  </plugin>

इस सेटअप के साथ, logmanager-0.1.0-jar-with-dependencies.jarवर्तमान मॉड्यूल और इसकी निर्भरता से कक्षाएं शामिल हैं लेकिन, त्रुटि के अनुसार, इसमें एक प्रविष्टि META-INF/MANIFEST.MF नहीं होती है Main-Class(इसकी संभावना वैसी ही नहीं है जैसे कि Logmanager-0.1.0.jar में)। जार वास्तव में निष्पादन योग्य नहीं है , जो फिर से वह नहीं है जो आप चाहते हैं।


इसलिए, मेरा सुझाव configurationतत्व को मावेन-जार-प्लगइन से हटाना और मावेन-असेंबली-प्लगइन को इस से कॉन्फ़िगर करना होगा:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.2</version>
    <!-- nothing here -->
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2-beta-4</version>
    <configuration>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
      <archive>
        <manifest>
          <mainClass>org.sample.App</mainClass>
        </manifest>
      </archive>
    </configuration>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

बेशक, org.sample.Appउस वर्ग के साथ बदलें जिसे आप निष्पादित करना चाहते हैं। लिटिल बोनस, मैं चरण के assembly:singleलिए बाध्य हूं packageताकि आपको assembly:assemblyअब और नहीं चलना पड़े । बस चलाने mvn installऔर विधानसभा का निर्माण मानक निर्माण के दौरान किया जाएगा।

तो, कृपया अपने pom.xml को ऊपर दिए गए कॉन्फ़िगरेशन के साथ अपडेट करें और चलाएं mvn clean install। फिर, targetनिर्देशिका में सीडी और फिर कोशिश करें:

java -jar logmanager-0.1.0-jar-with-dependencies.jar

यदि आपको कोई त्रुटि मिलती है, तो कृपया इसके साथ अपने प्रश्न को अपडेट करें और META-INF/MANIFEST.MFफ़ाइल की सामग्री और आपके pom.xml(प्लगइन्स कॉन्फ़िगरेशन भागों) के प्रासंगिक हिस्से को पोस्ट करें । कृपया इसका परिणाम भी पोस्ट करें:

java -cp logmanager-0.1.0-jar-with-dependencies.jar com.gorkwobble.logmanager.LogManager

यह प्रदर्शित करने के लिए कि यह कमांड लाइन पर ठीक काम कर रहा है (इस बात की परवाह किए बिना कि ग्रहण क्या कह रहा है)।

संपादित करें: जावा 6 के लिए, आपको मावेन-कंपाइलर-प्लगइन को कॉन्फ़िगर करने की आवश्यकता है। इसे अपने pom.xml में जोड़ें:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
      <source>1.6</source>
      <target>1.6</target>
    </configuration>
  </plugin>

4
आपकी टिप्पणियों के लिए आभार! जैसा आपने निर्दिष्ट किया मैंने अपना pom.xml बदल दिया। जब मैं mvan क्लीन इंस्टॉल चलाता हूं, तो मुझे अपने कोड से संकलन त्रुटियों का एक गुच्छा मिलता है, यह कहते हुए कि एनोटेशन और इतने पर-सोर्स 1.3 का समर्थन नहीं किया जाता है। मैं jdk1.6 का उपयोग कर रहा हूं और यह ग्रहण में संकलित है; मुझे यकीन नहीं है कि 1.3 कैसे पेश किया गया। हो सकता है कि पोम स्निपेट में लाइब्रेरी संस्करणों में से एक पुराना है?
RMorrisey

धन्यवाद! मुझे 1.3 अंक मिले हैं। मुझे अपने POM में junit4 निर्भरता भी जोड़ना था। मैं अन्य सामान के समस्या निवारण पर काम कर रहा हूं; अगर मैं फंस गया तो फिर से पोस्ट करूँगा! अगर मुझे जार चल रहा है तो मैं इसे उत्तर के रूप में चिह्नित करूंगा। मेरे वर्तमान POM को ऊपर दिए गए प्रश्न में अपडेट किया गया है।
RMorrisey

क्या उत्पन्न जार फ़ाइल से संसाधनों को बाहर करने का कोई तरीका है?

2
क्या परिणामी जार का "सामान्य" नाम होना संभव है?
डेनियल शेवलेव

1
मुझे यह Sonatype ब्लॉग पोस्ट उपयोगी भी लगी

15

पास्कल थिवेंट के जवाब से मुझे भी मदद मिली। लेकिन अगर आप <pluginManagement>तत्व के भीतर अपने प्लग इन का प्रबंधन करते हैं , तो आपको प्लगइन प्रबंधन के बाहर फिर से विधानसभा को परिभाषित करना होगा, अन्यथा यदि आप चलाते हैं तो निर्भरता जार में पैक नहीं की जाती है mvn install

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>


    <build>
        <pluginManagement>
            <plugins>

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.1</version>
                    <configuration>
                        <source>1.6</source>
                        <target>1.6</target>
                    </configuration>
                </plugin>

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <version>2.4</version>
                    <configuration>
                        <archive>
                            <manifest>
                                <mainClass>main.App</mainClass>
                            </manifest>
                        </archive>
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                    </configuration>
                    <executions>
                        <execution>
                            <id>make-assembly</id>
                            <phase>package</phase>
                            <goals>
                                <goal>single</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>

            </plugins>

        </pluginManagement>

        <plugins> <!-- did NOT work without this  -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
            </plugin>
        </plugins>

    </build>


    <dependencies>
       <!--  dependencies commented out to shorten example -->
    </dependencies>

</project>

1
धन्यवाद माइक, यह मेरी मदद की। प्रारंभ में मेरा पैकेज <pluginManagement> का उपयोग किए बिना उत्पन्न हो रहा था। लेकिन ग्रहण pom.xml में कुछ त्रुटि दे रहा था "मावेन - प्लगइन निष्पादन जीवनचक्र द्वारा कवर नहीं किया गया"। जो मुझे विचलित करता है। इसलिए इसे हल करने के लिए मैंने <pluginManagement> जोड़ा, अब ग्रहण त्रुटि चली गई लेकिन मेरा पैकेज बनना बंद हो गया। पोम के ऊपर आपके स्निपेट ने मेरे लिए काम किया है। :)
शशडेनोवो

2
यह उपयोगी था .. <pluginManagement> का उपयोग करते समय, शीर्ष उत्तर काम नहीं करेगा।
इनिनप्रसर

5

यदि आप पैकेज पर असेंबली लक्ष्य को निष्पादित नहीं करना चाहते हैं, तो आप अगले कमांड का उपयोग कर सकते हैं:

mvn package assembly:single

यहाँ पैकेज कीवर्ड है।


-1

प्रोजेक्ट पर राइट क्लिक करें और मावेन बिल्ड, मावेन क्लीन, मावेन जेनरेट रिसोर्स और मावेन इंस्टॉल दें। जार फाइल अपने आप जेनरेट हो जाएगी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.