2013-04-03 8 views
18

का उपयोग करते हुए दो निष्पादन योग्य जार बनाना मैं एक Maven परियोजना है और मैं इसे से दो निष्पादन योग्य जार फ़ाइलों बनाना चाहते हैं। एक का उपयोग उपयोगकर्ताओं द्वारा अंतःक्रियात्मक रूप से किया जाएगा और दूसरा एक अनुसूचित नौकरी के रूप में चलाया जाएगा जो पूर्व द्वारा उत्पादित लॉग फ़ाइलों को पढ़ता है। अंत में, मैं उम्मीद करता हूं कि MANIFEST.MF फ़ाइल में मुख्य-श्रेणी विशेषता को छोड़कर दो जार फ़ाइलों को समान होना चाहिए।Maven-विधानसभा-प्लगइन

मैं निष्पादन योग्य जार बनाने के लिए मेवेन-एंट्रून-प्लगइन का उपयोग कर रहा हूं और यह ठीक काम करता प्रतीत होता है जब तक कि मैंने मैवेन प्रोफाइल पेश करके दूसरी जार फ़ाइल बनाने की कोशिश नहीं की। मेरी पोम फ़ाइल के प्रासंगिक अनुभाग इस तरह दिखता है:

<profiles> 
    <profile> 
     <id>publisher</id> 
     <build> 
      <finalName>${project.artifactId}</finalName> 
      <plugins> 
       ... 
       <plugin> 
        <artifactId>maven-assembly-plugin</artifactId> 
        <version>2.4</version> 
        <configuration> 
         <appendAssemblyId>false</appendAssemblyId> 
         <finalName>${project.artifactId}</finalName> 
         <archive> 
          <manifest> 
           <mainClass>fully.qualified.path.Publisher</mainClass> 
          </manifest> 
         </archive> 
         <descriptorRefs> 
          <descriptorRef>jar-with-dependencies</descriptorRef> 
         </descriptorRefs> 
        </configuration> 
        <executions> 
         <execution> 
          <phase>package</phase> 
          <goals> 
           <goal>single</goal> 
          </goals> 
         </execution> 
        </executions> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 
    <profile> 
     <id>logReader</id> 
     <build> 
      <finalName>${project.artifactId}</finalName> 
      <plugins> 
       ... 
       <plugin> 
        <artifactId>maven-assembly-plugin</artifactId> 
        <version>2.4</version> 
        <configuration> 
         <appendAssemblyId>false</appendAssemblyId> 
         <finalName>${project.artifactId}-logReader</finalName> 
         <archive> 
          <manifest> 
           <mainClass>fully.qualified.path.LogReader</mainClass> 
          </manifest> 
         </archive> 
         <descriptorRefs> 
          <descriptorRef>jar-with-dependencies</descriptorRef> 
         </descriptorRefs> 
        </configuration> 
        <executions> 
         <execution> 
          <phase>package</phase> 
          <goals> 
           <goal>single</goal> 
          </goals> 
         </execution> 
        </executions> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 
</profiles> 

वास्तव में, इन दोनों के बीच फर्क सिर्फ इतना है "finalName" और "mainClass" तत्व के रूप में प्लगइन में परिभाषित किया है।

जब मैं एमवीएन निष्पादित करने का प्रयास करता हूं: दोनों प्रोफाइल पर पैकेज (मैं इंटेलिजे आईडीईए का उपयोग कर रहा हूं), मुझे दो .jar फाइलें मिलती हैं, लेकिन एक सही है और दूसरा गलत है। "सही" में सभी निर्भरताएं और वैध MANIFEST.MF फ़ाइल होती है। "गलत" में कोई निर्भरता नहीं है और MANIFEST.MF फ़ाइल में "मुख्य श्रेणी" संपत्ति की कमी है जिसे मुझे निष्पादन योग्य होने के लिए आवश्यक है।

मुझे पता चला है कि अगर मैंने कभी एक प्रोफ़ाइल या दूसरी बार चलाया है, तो यह ठीक काम करता है, लेकिन अगर मैं दोनों प्रोफाइलों को एक साथ निष्पादित करने का प्रयास करता हूं, तो यह विफल हो जाता है। मैं अपने लॉग में निम्न नोट मिलता है, लेकिन मैं मानता होगा कि मैं पूरी तरह से समझ में नहीं आता कि वे क्या कह रहे हैं:

[INFO] Building jar: .../target/publisher.jar 
... 
[INFO] Building jar: .../target/publisher-logReader.jar 
[WARNING] Configuration options: 'appendAssemblyId' is set to false, and 'classifier' is missing. 
Instead of attaching the assembly file: .../target/publisher-logReader.jar, it will become the file for main project artifact. 
NOTE: If multiple descriptors or descriptor-formats are provided for this project, the value of this file will be non-deterministic! 
[WARNING] Replacing pre-existing project main-artifact file: .../target/publisher.jar with assembly file: .../target/publisher-logReader.jar 

इस बारे में कोई विचार? क्या एक ही एमवीएन के साथ दो जार फ़ाइलों का उत्पादन करना संभव है: इस तरह से पैकेज, या क्या मैं गलत पेड़ को भड़क रहा हूं?

धन्यवाद!

उत्तर

30

तो जैसे ही मैं इस पोस्ट में, मैं इस सूत्र मिला: जैसे,

Create multiple runnable Jars (with depencies included) from a single Maven project

यह है कि यह दो प्रोफाइल का उपयोग नहीं करता एक अलग दृष्टिकोण का उपयोग करता है, यह दो फांसी का उपयोग करता है:

<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.4</version> 
    <executions> 
     <execution> 
      <id>build-publisher</id> 
      <configuration> 
       <appendAssemblyId>false</appendAssemblyId> 
       <archive> 
        <manifest> 
         <mainClass>fully.qualified.path.Publisher</mainClass> 
        </manifest> 
       </archive> 
       <descriptorRefs> 
        <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
       <finalName>${project.artifactId}</finalName> 
      </configuration> 
      <phase>package</phase> 
      <goals> 
       <goal>single</goal> 
      </goals> 
     </execution> 
     <execution> 
      <id>build-logReader</id> 
      <configuration> 
       <appendAssemblyId>false</appendAssemblyId> 
       <archive> 
        <manifest> 
         <mainClass>fully.qualified.path.LogReader</mainClass> 
        </manifest> 
       </archive> 
       <descriptorRefs> 
        <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
       <finalName>${project.artifactId}-logReader</finalName> 
      </configuration> 
      <phase>package</phase> 
      <goals> 
       <goal>single</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

ऐसा लगता है कि यह काम कर रहा है। कहानी का नैतिक लगता है कि मैं प्रोफ़ाइल को पूरी तरह समझ नहीं पा रहा हूं या जब उनका उपयोग किया जाना चाहिए।

+1

यह समाधान [यह एक] [http://stackoverflow.com/a/8726969/288875) की तुलना में बेहतर (कम से कम मेरे लिए) काम करता है जिसमें '' और '' तत्वों की कमी है। –