मावेन को निर्भरता को लक्ष्य / परिवाद में कॉपी करने के लिए मजबूर करना


252

मुझे अपने प्रोजेक्ट की रनटाइम निर्भरताएँ target/libफ़ोल्डर में कैसे मिलेंगी ?

यह अभी है, के बाद के रूप में फ़ोल्डर केवल अपने प्रोजेक्ट के जार, लेकिन क्रम निर्भरता से कोई भी शामिल हैं।mvn clean installtarget


आप इसकी आवश्यकता क्यों है ? आपके मावेन प्रोजेक्ट का प्रकार क्या है? जार?
अलेक्जेंड्रे विक्टर

मेरी मावेन परियोजना का प्रकार JAR है। मुझे इसकी आवश्यकता है क्योंकि बहुत सारी निर्भरताएं हैं और मैं जार को एक निष्पादन योग्य के रूप में तैनात करने की कोशिश कर रहा हूं।
माइकल

2
असेंबली के साथ सावधानी - यदि आपके पास डिपो के बीच ओवरलैपिंग पैकेज / कक्षाएं हैं, तो आपके पास शायद बुरा समय होगा।
डेनिअक

जवाबों:


260

यह मेरे लिए काम करता है:

<project>
  ...
  <profiles>
    <profile>
      <id>qa</id>
      <build>
        <plugins>
          <plugin>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
              <execution>
                <phase>install</phase>
                <goals>
                  <goal>copy-dependencies</goal>
                </goals>
                <configuration>
                  <outputDirectory>${project.build.directory}/lib</outputDirectory>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>
</project>

11
यदि आप चाहते हैं कि यह हर समय हो, तो <प्रोफाइल> ... <प्रोफाइल> रैपर को हटा दें और <बिल्ड> टैग को केवल <प्रोजेक्ट> के तहत करें
Dan Halbert

3
@Gegy इस लिबास में जार को नहीं तोड़ती /, लेकिन संकलित परियोजना में कक्षाएं भी शामिल करती हैं
मिडहट

5
यह ठीक है, लेकिन यह परीक्षण निर्भरता को भी कॉपी कर रहा है। मैं खुद को excludeScopeविकल्प ( maven.apache.org/plugins/maven-d dependency-plugin-… ) पर जोड़ता हूं
अल्फोंसो निशिकावा

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

2
नोट: नोड के <excludeScope>test</excludeScope>अंदर जाता है configuration
जेसी चिशोल्म

84

सबसे अच्छा तरीका इस बात पर निर्भर करता है कि आप क्या करना चाहते हैं:

  • यदि आप अपनी निर्भरता को WAR या EAR फ़ाइल में बाँधना चाहते हैं, तो बस अपनी परियोजना के पैकेजिंग प्रकार को EAR / WAR में सेट करें। मावेन निर्भरता को सही स्थान पर बांध देगा।
  • यदि आप एक JAR फ़ाइल बनाना चाहते हैं जिसमें आपका कोड आपके सभी आश्रितों के साथ शामिल हो, तो जार के साथ असेंबली विवरणक के साथ असेंबली प्लगइन का उपयोग करें । मावेन आपके सभी वर्गों और किसी भी निर्भरता से वर्गों के साथ एक पूर्ण JAR फ़ाइल उत्पन्न करेगा।
  • यदि आप अपनी निर्भरता को लक्ष्य निर्देशिका में अंतःक्रियात्मक रूप से खींचना चाहते हैं, तो अपनी फ़ाइलों को कॉपी करने के लिए निर्भरता प्लगइन का उपयोग करें ।
  • यदि आप किसी अन्य प्रकार के प्रसंस्करण के लिए निर्भरता में खींचना चाहते हैं, तो आपको संभवतः अपना स्वयं का प्लगइन उत्पन्न करना होगा। निर्भरता की सूची और डिस्क पर उनके स्थान को प्राप्त करने के लिए एपीआई हैं। आपको इसे वहां से लेना होगा ...

80
mvn install dependency:copy-dependencies 

लक्ष्य फ़ोल्डर में बनाई गई निर्भरता निर्देशिका के साथ मेरे लिए काम करता है। पसंद है!


35

मावेन निर्भरता प्लगइन पर एक नज़र डालें , विशेष रूप से, निर्भरता: प्रतिलिपि-निर्भरता लक्ष्य । शीर्षक के तहत उदाहरण पर एक नज़र डालें निर्भरता: कॉपी-निर्भरता मोजो । सेट outputDirectory $ {basedir} / लक्ष्य / lib करने के लिए विन्यास संपत्ति (मेरा मानना है कि, आप परीक्षण करना होगा)।

उम्मीद है की यह मदद करेगा।


15
वैकल्पिक रूप से, आप $ {project.build.directory} / lib का उपयोग कर सकते हैं बजाय $ {आधारित} / लक्ष्य / कार्य के
Cuga

31

उस मामले के लिए एक सरल और सुरुचिपूर्ण समाधान जहां किसी को मावेन के किसी भी अन्य चरणों का उपयोग किए बिना निर्भरता को एक लक्ष्य निर्देशिका में कॉपी करने की आवश्यकता होती है (मुझे यह बहुत उपयोगी पाया गया जब वाडिन के साथ काम करते हुए)।

पूरा पोम उदाहरण:

<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>groupId</groupId>
    <artifactId>artifactId</artifactId>
    <version>1.0</version>

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.1.1</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-dependency-plugin</artifactId>
                    <executions>
                        <execution>
                            <phase>process-sources</phase>

                            <goals>
                                <goal>copy-dependencies</goal>
                            </goals>

                            <configuration>
                                <outputDirectory>${targetdirectory}</outputDirectory>
                            </configuration>
                        </execution>
                    </executions>
            </plugin>
        </plugins>
    </build>
</project>

फिर भागो mvn process-sources

जार फ़ाइल निर्भरता में पाया जा सकता है /target/dependency


1
maven- निर्भरता-प्लगइन (लक्ष्य "कॉपी-निर्भरता", "अनपैक") m2e द्वारा समर्थित नहीं है। :-(
पीएम

@Gobliins $ {targetdirectory} के बजाय $ {project.build.directory} / lib का उपयोग करें
दिव्यांग शाह

24

यदि आप कभी-कभार यह करना चाहते हैं (और इस तरह अपना पीओएम नहीं बदलना चाहते हैं), तो यह कमांड-लाइन आज़माएँ:

mvan निर्भरता: कॉपी-निर्भरता -DutputDirectory = $ {project.build.directory} / lib

यदि आप अंतिम तर्क छोड़ देते हैं , तो आश्रितों को इसमें रखा जाता है target/dependencies


धन्यवाद! यह केवल उन प्रॉबल्म्स को कॉपी करने का सबसे आसान तरीका है, जो किसी प्रोजेक्ट के लिए एक फ़ोल्डर में कहीं न कहीं आवश्यक होंगे ताकि आप उन्हें कहीं और कॉपी कर सकें, यदि आवश्यक हो, जैसे कि नॉन मावेन आधारित प्रोजेक्ट। ध्यान दें कि यदि आप चाहें तो उपयोग करने के लिए एक हार्डकोड फ़ोल्डर में बस पास कर सकते हैं, जैसेmvn dependency:copy-dependencies -DoutputDirectory=./lib
ब्रैड पार्क्स

क्या आप इसे pom.xml से बाहर कर सकते हैं?
गोबलींस

24

कुछ इस तरह की कोशिश करो:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
    <archive>
        <manifest>  
            <addClasspath>true</addClasspath>
            <classpathPrefix>lib/</classpathPrefix>
            <mainClass>MainClass</mainClass>
        </manifest>
    </archive>
    </configuration>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.4</version>
    <executions>
        <execution>
            <id>copy</id>
            <phase>install</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>
                    ${project.build.directory}/lib
                </outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

@Thomas मुझे लगता है कि maven clean install, तो आप पाएंगे libमेंtarget
Searene

1
मुझे केवल 1 निर्भरता की प्रतिलिपि बनाने के लिए क्या करना होगा?
एलन डोनिजेट

<classpathPrefix> lib / </ classpathPrefix> ने मेरी बहुत मदद की। धन्यवाद!
मार्टिन पाब्स्ट

इस installचरण को प्रतिस्थापित करेगा process-resourcesताकि buildलक्ष्य के चलने से पहले निर्भरता की प्रतिलिपि बनाई जा सके
व्यस्कलेव कोटरूटा

20

आपको बस pom.xml का निम्नलिखित स्निपेट चाहिए build/plugins:

<plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <phase>prepare-package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/lib</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

packageजब आप चलाएंगे तो ऊपर चरण में चलेगा

mvn clean package

और निर्भरताएँ स्निपेट में निर्दिष्ट आउटपुटडायरेरी पर कॉपी की जाएंगी, अर्थात libइस मामले में।

यदि आप केवल कभी-कभार ऐसा करना चाहते हैं, तो pom.xml में कोई परिवर्तन आवश्यक नहीं है। बस निम्नलिखित चलाएँ:

mvn clean package dependency:copy-dependencies

डिफ़ॉल्ट स्थान को ओवरराइड करने के लिए, जो है ${project.build.directory}/dependencies, सिस्टम नाम की संपत्ति जोड़ें outputDirectory, अर्थात

    -DoutputDirectory=${project.build.directory}/lib

7

मान

  • आप pom.xml को बदलना नहीं चाहते हैं
  • आप टेस्ट स्कॉप्ड (जैसे junit.jar) या प्रदान की गई निर्भरता (जैसे wlfullclient.jar) नहीं चाहते हैं

यहाँ मेरे लिए क्या काम किया है:

mvan स्थापित निर्भरता: कॉपी-निर्भरता -डिस्क्यूल्डस्कोप = रनटाइम

5

यदि आप अपने एप्लिकेशन जार का एक बंडल वितरित करना चाहते हैं, तो इसके सभी निर्भरता और कुछ लिपियों के साथ मेनक्लास को लागू करने के लिए, एपसेंबलर-मावेन-प्लगइन को देखें

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

  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>appassembler-maven-plugin</artifactId>
    <version>1.0</version>
    <executions>
      <execution>
        <id>generate-jsw-scripts</id>
        <phase>package</phase>
        <goals>
          <goal>generate-daemons</goal>
        </goals>
        <configuration>
          <!--declare the JSW config -->
          <daemons>
            <daemon>
              <id>myApp</id>
              <mainClass>name.seller.rich.MyMainClass</mainClass>
              <commandLineArguments>
                <commandLineArgument>start</commandLineArgument>
              </commandLineArguments>
              <platforms>
                <platform>jsw</platform>
              </platforms>              
            </daemon>
          </daemons>
          <target>${project.build.directory}/appassembler</target>
        </configuration>
      </execution>
      <execution>
        <id>assemble-standalone</id>
        <phase>integration-test</phase>
        <goals>
          <goal>assemble</goal>
        </goals>
        <configuration>
          <programs>
            <program>
              <mainClass>name.seller.rich.MyMainClass</mainClass>
              <!-- the name of the bat/sh files to be generated -->
              <name>mymain</name>
            </program>
          </programs>
          <platforms>
            <platform>windows</platform>
            <platform>unix</platform>
          </platforms>
          <repositoryLayout>flat</repositoryLayout>
          <repositoryName>lib</repositoryName>
        </configuration>
      </execution>
    </executions>
  </plugin>
  <plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2-beta-4</version>
    <executions>
      <execution>
        <phase>integration-test</phase>
        <goals>
          <goal>single</goal>
        </goals>
        <configuration>
          <descriptors>
            <descriptor>src/main/assembly/archive.xml</descriptor>
          </descriptors>
        </configuration>
      </execution>
    </executions>
  </plugin> 

विधानसभा विवरणक (src / main / विधानसभा में) एक ज़िप के रूप में direcotry पैकेज करने के लिए होगा:

<assembly>
  <id>archive</id>
  <formats>
    <format>zip</format>
  </formats>
  <fileSets>
    <fileSet>
     <directory>${project.build.directory}/appassembler</directory>
     <outputDirectory>/</outputDirectory>
    </fileSet>
  </fileSets>
</assembly>

2

यदि आप अपनी परियोजना को युद्ध बनाते हैं या कान के प्रकार मावेन निर्भरता की नकल करेंगे।



1

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

(1) pom में, <build> <plugins> के तहत, मैंने शामिल किया:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2-beta-5</version>
    <configuration>
        <archive>
            <manifest>
                <mainClass>dk.certifikat.oces2.some.package.MyMainClass</mainClass>
            </manifest>
        </archive>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
</plugin>

(2) रनिंग मावन कंपाइल असेंबली: असेंबली ने प्रोजेक्ट के टार्गेट डायरेक्टरी में वांछित my-project-0.1-SNAPSHOT-jar-with-dependencies.jar का उत्पादन किया।

(3) मैंने जावा को जावा -जार के साथ चलाया-मेरी परियोजना-0.1-स्नैपशॉट-जार-पर-निर्भरता।


मुख्य श्रेणी में नहीं पाया गया (3)
थॉमस

1

यह भारी निर्भरताओं को एम्बेड करने के लिए एक भारी समाधान है, लेकिन मावेन की असेंबली प्लगइन मेरे लिए चाल करता है।

@ रिच सेलर का जवाब काम करना चाहिए, हालांकि सरल मामलों के लिए आपको केवल उपयोग गाइड से इस अंश की आवश्यकता होनी चाहिए :

<project>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.2.2</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

आपका कोड उदाहरण समस्या को हल नहीं करता है, यह बस सब कुछ एक ही JAR में बंडल करता है। हां, इस लक्ष्य को प्राप्त करने के लिए असेंबली प्लगइन का उपयोग किया जा सकता है, लेकिन इस तरह नहीं।
डंकन जोन्स

हालाँकि, आगे पढ़ने पर, शायद आप इस टिप्पणी का जवाब दे रहे हैं ।
डंकन जोन्स

यह इतना लंबा हो चुका है कि मुझे वास्तव में याद नहीं है ... साथ ही मैंने अपनी आखिरी फर्म में लिनक्स प्रशासन पर ध्यान केंद्रित करने के बजाय कठोर हो गया है - लेकिन प्रतिक्रिया के लिए धन्यवाद!
RubyTuesdayDONO

0

यदि आपको ग्रहण में टॉमकैट सर्वर पर चलने पर WEB-INF / lib फ़ाइल में प्रदर्शित न होने वाली निर्भरता से संबंधित समस्याएं हैं, तो इस पर एक नज़र डालें:

TomNat लॉन्च करते समय ClassNotFoundException DispatcherServlet (wtpwebapps पर नकल नहीं की गई मावेन निर्भरता)

आपको बस प्रोजेक्ट गुण> परिनियोजन असेंबली में मावेन डिपेंडेंसी को जोड़ना होगा।

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