2012-01-04 20 views
23

से एकाधिक रननेबल जार (प्रतिभूतियों के साथ शामिल) बनाएं, मेरे पास एक एकल मैवेन प्रोजेक्ट है जिसमें एकाधिक मुख्य वर्ग हैं। मैं इन परियोजनाओं में से चलने योग्य जार (जिसमें एली निर्भरताओं को शामिल करना) उत्पन्न करना चाहता हूं।एक एकल मैवेन प्रोजेक्ट

<build> 
<plugins> 
    <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <configuration> 
      <archive> 
       <manifest> 
        <mainClass>classpath.to.my.mainClass</mainClass> 
       </manifest> 
      </archive> 
      <descriptorRefs> 
       <descriptorRef>jar-with-dependencies</descriptorRef> 
      </descriptorRefs> 
     </configuration> 
    </plugin> 
</plugins> 
</build> 

उनके Maven-विधानसभा के साथ इस हासिल करने के लिए एक रास्ता है: मैं वर्तमान में निम्नलिखित निर्माण विन्यास (maven.assembly का उपयोग) है? यदि नहीं, तो मेरे लक्ष्य को प्राप्त करने का सबसे आसान तरीका क्या है?

+0

आप अलग अलग विन्यास के साथ 'Maven-विधानसभा-plugin' के लिए कई' ' प्रविष्टियों बनाने की कोशिश की है? यह इस प्लगइन को दो बार ट्रिगर करेगा और उम्मीद है कि दो जेएआर फाइलें ... –

+0

@dma_k आपके सुझाव के बाद, तीन जेएआर उत्पन्न करने की कोशिश कर रहा है, पहले दो को पिछले ' 'कॉन्फ़िगरेशन द्वारा ओवरराइट किया गया है। – anon

+0

' 'कॉन्फ़िगरेशन विकल्प के साथ खेलने का प्रयास करें (यहां देखें [http://maven.apache.org/plugins/maven-assembly-plugin/howto.html))। –

उत्तर

18

मैं एक संतोषजनक ढंग से maven-assembly-plugin के साथ इस समस्या को हल करने में सक्षम नहीं था, इसलिए मैं एक अलग समाधान के लिए चला गया। इस प्रकार

<build> 
    <plugins> 
    <plugin> 
    <groupId>org.dstovall</groupId> 
    <artifactId>onejar-maven-plugin</artifactId> 
    <version>1.4.4</version> 
    <executions> 
     <execution> 
     <id>build-first</id> 
      <configuration> 
      <mainClass>classpath.to.first.Main</mainClass> 
      <attachToBuild>true</attachToBuild> 
      <classifier>onejar</classifier> 
      <filename>first-runnable.jar</filename> 
      </configuration> 
      <goals> 
      <goal>one-jar</goal> 
      </goals> 
     </execution> 
     <execution> 
     <id>build-second</id> 
      <configuration> 
      <mainClass>classpath.to.second.Main</mainClass> 
      <attachToBuild>true</attachToBuild> 
      <classifier>onejar</classifier> 
      <filename>second-runnable.jar</filename> 
      </configuration> 
      <goals> 
      <goal>one-jar</goal> 
      </goals> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
</build> 

<pluginRepositories> 
    <pluginRepository> 
    <id>onejar-maven-plugin.googlecode.com</id> 
    <url>http://onejar-maven-plugin.googlecode.com/svn/mavenrepo</url> 
    </pluginRepository> 
</pluginRepositories> 
+1

दो 'आईडी' में दो 'आईडी' को अलग नहीं होना चाहिए? मेरा मावेन शिकायत करता है कि मेरे पास एक ही आईडी एक से अधिक बार है। –

+0

@AndreHolzner: हाँ, यह एक त्रुटि –

+1

आईएमएचओ थी, मैवेन-असेंबली-प्लगइन के साथ भी यही बात संभव है। देखें @ donal-fellows उत्तर – Gabriel

19

आप इसे कर सकते हैं। आपको प्रत्येक आर्टिफैक्ट के निर्माण के लिए एक अलग निष्पादन की आवश्यकता होगी (यानी, प्रत्येक अपनी आईडी दें लेकिन आप चरण को डिफ़ॉल्ट रूप से छोड़ सकते हैं), और आपको अंतिम नाम और संग्रह/मेनिफेस्ट/मेनक्लास निर्दिष्ट करना होगा प्रत्येक

<build> 
<plugins> 
    <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <executions> 
      <execution> 
      <id>build-a</id> 
      <configuration> 
       <archive> 
       <manifest> 
        <mainClass>foobar.Aclass</mainClass> 
       </manifest> 
       </archive> 
       <descriptorRefs> 
       <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
       <finalName>foobar_a.jar</finalName> 
      </configuration> 
      </execution> 
      <execution> 
      <id>build-b</id> 
      <configuration> 
       <archive> 
       <manifest> 
        <mainClass>foobar.Bclass</mainClass> 
       </manifest> 
       </archive> 
       <descriptorRefs> 
       <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
       <finalName>foobar_b.jar</finalName> 
      </configuration> 
      </execution> 
     </executions> 
    </plugin> 
</plugins> 
</build> 
+2

शायद यह स्पष्ट रूप से घोषित करना चाहिए कि 'एकल' लक्ष्य का उपयोग किया जाना है। –

+3

इस समाधान की कोशिश करने और [यहां पोस्ट किया गया] (http://stackoverflow.com/a/15799254/288875), ऐसा लगता है कि किसी को भी '' और '' टैग जोड़ने की आवश्यकता है? –

+0

मैंने लक्ष्य और चरण टैग शामिल करने के लिए पोस्ट (सहकर्मी समीक्षा के लिए प्रतीक्षा) संपादित किया। – Gabriel

1

थोड़ा और पिछले जवाब यह है कि मेरे लिए बहुत मददगार था, आप mvn साफ पैकेज चलाने चरण पैकेज और लक्ष्य विधानसभा जोड़ सकते हैं और चलाने की आवश्यकता निर्दिष्ट करने के लिए, पोम है::

मैं onejar-maven-plugin इस्तेमाल किया
<plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>build-a</id> 
        <configuration> 
         <archive> 
          <manifest> 
           <mainClass>firstMainClass</mainClass> 
          </manifest> 
         </archive> 
         <descriptorRefs> 
          <descriptorRef>jar-with-dependencies</descriptorRef> 
         </descriptorRefs> 
         <finalName>a.jar</finalName> 
        </configuration> 
        <phase>package</phase> 
        <goals> 
         <goal>assembly</goal> 
        </goals> 
       </execution> 
       <execution> 
        <id>build-b</id> 
        <configuration> 
         <archive> 
          <manifest> 
           <mainClass>SecondMainClass</mainClass> 
          </manifest> 
         </archive> 
         <descriptorRefs> 
          <descriptorRef>jar-with-dependencies</descriptorRef> 
         </descriptorRefs> 
         <finalName>b.jar</finalName> 
        </configuration> 
        <phase>package</phase> 
        <goals> 
         <goal>assembly</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
+2

लक्ष्य 'असेंबली' को बहिष्कृत किया गया है। [प्लगइन जानकारी] देखें (https://maven.apache.org/plugins/maven-assembly-plugin/plugin-info.html)। इसके बजाए 'एकल' का उपयोग करने के लिए बेहतर है। – Gabriel

6

The top answer अगर आप किसी भी विन्यास (या किसी भी संसाधन, उस बात के लिए) अपने जार फ़ाइल (जैसे, विन्यास स्प्रिंग फ्रेमवर्क ऑटो बाइंडिंग के लिए) में बंडल हो जाता कि उपयोग नहीं कर रहे काम करता है।

सौभाग्य से, यह समाधान maven-shade-plugin के साथ भी काम करता है और आपके पास onejar-maven-plugin के साथ उपर्युक्त समस्या नहीं है।

इसके अलावा, maven-shade-plugin को onejar-maven-plugin के विपरीत सक्रिय रूप से बनाए रखा जा रहा है जो कि Googlecode है जो purgatory में है।

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <version>2.4.1</version> 
    <executions> 
    <execution> 
     <id>build-first</id> 
     <phase>package</phase> 
     <goals> 
     <goal>shade</goal> 
     </goals> 
     <configuration> 
     <transformers> 
      <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">       
      <mainClass>classpath.to.first.Main</mainClass> 
      </transformer> 
     </transformers> 
     <finalName>first-runnable</finalName> 
     </configuration>   
    </execution> 
    <execution> 
     <id>build-second</id> 
     <phase>package</phase> 
     <goals> 
     <goal>shade</goal> 
     </goals> 
     <configuration> 
     <transformers> 
      <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">       
      <mainClass>classpath.to.second.Main</mainClass> 
      </transformer> 
     </transformers> 
     <finalName>second-runnable</finalName> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 
संबंधित मुद्दे