2015-01-29 10 views
5

मैं परियोजना का निर्माण करने के लिए इतना है कि अंतिम जार (नहीं तो संभव जार फ़ाइल में निर्भरता से कक्षाएं भी शामिल है) के लिए एक एकल जार फ़ाइल में सभी निर्भरता शामिल मैं धागा Including dependencies in a jar with Maven पीछा किया लेकिन lt निर्भरता भी शामिल करना चाहते हैं जो मैंने अपने पोम में भी उल्लेख नहीं किया। यहां मेरा पोम है जिसमें केवल दो निर्भरताएं हैं।मेवेन जार?

मैं चाहता हूँ जब जब अंतिम बनाया गया है, यह (या तो वर्ग या जार के रूप में)

<dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    <version>3.8.1</version> 
    <scope>test</scope> 
</dependency> 

<dependency> 
    <groupId>com.myProject</groupId> 
    <artifactId>utils</artifactId> 
    <version>1</version> 
</dependency> 
+0

है एक एक Maven छाया प्लगइन https://maven.apache.org/plugins/maven-shade-plugin/ – SubOptimal

+0

अन्य निर्भरता कि आप देख शायद अपनी निर्भरता ... डॉन की निर्भरता हैं देखो क्या आप उन्हें शामिल नहीं करना चाहते हैं? – jamp

+0

हां, मैं उन्हें शामिल नहीं करना चाहता हूं – user3198603

उत्तर

4

यहाँ आप कैसे maven-shade-plugin

साथ इसे हल करने के लिए एक उदाहरण pom.xml लगता है

जब आप mvn package चलाते हैं तो यह एक जार फ़ाइल target/app-with-dependencies.jar उत्पन्न करता है। इस जार फ़ाइल में प्रोजेक्ट के संकलित वर्ग और केवल निर्भरता org.slf4j:slf4j-log4j12 और com.myProject:utils शामिल हैं। इसमें निर्भरता शामिल नहीं है जिस पर org.slf4j:slf4j-log4j12 निर्भर है।

<?xml version="1.0" encoding="UTF-8"?> 
<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> 
    <groupId>sub.optimal</groupId> 
    <artifactId>shadedemo</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>jar</packaging> 
    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <maven.compiler.source>1.7</maven.compiler.source> 
     <maven.compiler.target>1.7</maven.compiler.target> 
     <maven.shade.version>2.3</maven.shade.version> 
     <maven.antrun.version>1.7</maven.antrun.version> 
    </properties> 
    <dependencies> 
     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-log4j12</artifactId> 
      <version>1.7.7</version> 
     </dependency> 
     <dependency> 
      <groupId>com.myProject</groupId> 
      <artifactId>utils</artifactId> 
      <version>1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <version>${maven.shade.version}</version> 
     </dependency> 
    </dependencies> 
    <build> 
     <plugins> 
      <plugin> 
       <artifactId>maven-shade-plugin</artifactId> 
       <version>${maven.shade.version}</version> 
       <configuration> 
        <quiet>true</quiet> 
        <verbose>false</verbose> 
       </configuration> 
       <executions> 
        <execution> 
         <phase>package</phase> 
         <goals> 
          <goal>shade</goal> 
         </goals> 
         <configuration> 
          <finalName>app-with-dependencies</finalName> 
          <artifactSet> 
           <includes> 
            <!-- 
            here you define the dependencies which 
            you want to be included 
            --> 
            <include>org.slf4j:slf4j-log4j12:*</include> 
            <include>com.myProject:utils:*</include> 
           </includes> 
          </artifactSet> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-antrun-plugin</artifactId> 
       <version>${maven.antrun.version}</version> 
       <executions> 
        <execution> 
         <phase>package</phase> 
         <goals> 
          <goal>run</goal> 
         </goals> 
         <configuration> 
          <tasks> 
           <delete> 
            <fileset dir="${project.build.directory}" includes="${project.name}-*.jar" /> 
           </delete> 
          </tasks> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
</project> 
+0

बहुत बहुत धन्यवाद। एक और तेज़ चीज मैं अंतिम जार से विशिष्ट संपत्ति फ़ाइल (MyProject.properties) को बाहर करना चाहता हूं। मैंने पुइटिंग तत्व MyProject.properties \t नीचे आपके उदाहरण में शामिल है लेकिन अभी भी MyProject.properties को अंतिम जार में शामिल किया गया है। कोई विचार क्यों? – user3198603

+0

मुझे http://stackoverflow.com/questions/17658831/how-can-i-exclude-dsa-and-sf-files-from-shaded-jar से जवाब मिला है। एक बार फिर धन्यवाद। – user3198603

+0

आपके समाधान पर एक प्रश्न। यह दो जार फाइलें बनाता है i.e a) shadedemo-1.0-SNAPSHOT और दूसरा ऐप-निर्भरता है। मुझे बस एक यानी ऐप-निर्भरता की आवश्यकता है .. क्या कोई तरीका है कि मैं आउटपुट को दो की बजाय एकल जार फ़ाइल के रूप में प्राप्त कर सकता हूं? – user3198603

3

एक तरह से Maven विधानसभा प्लगइन का उपयोग करने के लिए है यह विशिष्ट पोम में उल्लेख किया निर्भरता भी शामिल है, पोम .xml विन्यास की तरह है:

<plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <configuration> 
       <archive> 
        <manifest> 
         <mainClass>com.taobao.top.appstore.App</mainClass> 
        </manifest> 
       </archive> 
       <descriptorRefs> 
        <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
      </configuration> 
</plugin> 
+0

का नेतृत्व नहीं करता है यह http://stackoverflow.com/questions/1729054/including- निर्भरता-in-a-jar-with-maven द्वारा सुझाया गया समाधान है। लेकिन जैसा कि मैंने कहा है कि इसमें उन सभी निर्भरताओं को भी शामिल किया गया है जिन्हें मैंने पोम – user3198603

+0

में भी उल्लेख नहीं किया है जब आप निर्भरता आयात करते हैं, तो यह अन्य जारों पर निर्भर करता है, ध्यान दें कि मेवेन निर्भरता तंत्र मैवेन के लिए एक आयात कार्य है, http: // www .mkyong.com/maven/how-to-use-maven-निर्भरता-टू-डाउनलोड-लाइब्रेरी-स्वचालित रूप से/ – StackBox

+0

लेकिन किसी कारण से मैं केवल अपने पोम में उल्लिखित निर्भरताओं को शामिल करना चाहता हूं। क्या ऐसा करने के लिए कोई रास्ता है ? – user3198603

संबंधित मुद्दे