मावेन: रिश्तेदार मार्ग से जार पर निर्भरता जोड़ें


232

मेरे पास एक मालिकाना जार है जिसे मैं एक निर्भरता के रूप में अपने पोम में जोड़ना चाहता हूं।

लेकिन मैं इसे रिपॉजिटरी में नहीं जोड़ना चाहता। कारण यह है कि मैं अपने सामान्य मैवेन कमांड्स जैसे mvn compile, आदि, बॉक्स से बाहर काम करना चाहता हूं । (डेवलपर्स से मांग के बिना इसे अपने द्वारा कुछ भंडार में जोड़ने के लिए)।

मैं चाहता हूं कि जार स्रोत नियंत्रण में एक 3rdparty lib में होना चाहिए, और pom.xml फ़ाइल से संबंधित पथ द्वारा इसे लिंक करना चाहिए।

क्या यह किया जा सकता है? कैसे?

जवाबों:


343

मैं चाहता हूं कि जार स्रोत नियंत्रण में एक 3rdparty lib में होना चाहिए, और pom.xml फ़ाइल से संबंधित पथ द्वारा इसे लिंक करना चाहिए।

आप वास्तव में इस चाहते हैं (समझते हैं अगर आप एक कंपनी के भंडार का उपयोग नहीं कर सकते हैं), तो मेरी सलाह एक "फ़ाइल भंडार" परियोजना के लिए स्थानीय और करने के लिए उपयोग करने के लिए किया जाएगा का उपयोग नहीं एक systemदायरे वाले निर्भरता। systemदायरे वाले से बचा जाना चाहिए, इस तरह निर्भरता कई स्थिति में अच्छी तरह से काम नहीं करते (जैसे विधानसभा में), वे लाभ की तुलना में अधिक परेशानियों का कारण है।

इसलिए, परियोजना के लिए एक स्थानीय भंडार की घोषणा करें:

<repositories>
  <repository>
    <id>my-local-repo</id>
    <url>file://${project.basedir}/my-repo</url>
  </repository>
</repositories>

पैरामीटर के install:install-fileसाथ प्रयोग करके अपने तीसरे पक्ष के काम को वहां स्थापित करें localRepositoryPath:

mvn install:install-file -Dfile=<path-to-file> -DgroupId=<myGroup> \ 
                         -DartifactId=<myArtifactId> -Dversion=<myVersion> \
                         -Dpackaging=<myPackaging> -DlocalRepositoryPath=<path>

अद्यतन: ऐसा लगता है कि प्लगइन के संस्करण 2.2 का उपयोग करते समय install:install-fileउपेक्षा करता है localRepositoryPath। हालाँकि, यह संस्करण 2.3 और बाद में प्लगइन के साथ काम करता है। तो संस्करण को निर्दिष्ट करने के लिए प्लगइन के पूरी तरह से योग्य नाम का उपयोग करें:

mvn org.apache.maven.plugins:maven-install-plugin:2.3.1:install-file \
                         -Dfile=<path-to-file> -DgroupId=<myGroup> \ 
                         -DartifactId=<myArtifactId> -Dversion=<myVersion> \
                         -Dpackaging=<myPackaging> -DlocalRepositoryPath=<path>

मावेन-इंस्टॉल-प्लगइन प्रलेखन

अंत में, इसे किसी अन्य निर्भरता की तरह घोषित करें (लेकिन systemगुंजाइश के बिना ):

<dependency>
  <groupId>your.group.id</groupId>
  <artifactId>3rdparty</artifactId>
  <version>X.Y.Z</version>
</dependency>

यह IMHO एक systemस्कोप का उपयोग करने से बेहतर उपाय है क्योंकि आपकी निर्भरता को एक अच्छे नागरिक की तरह माना जाएगा (जैसे कि इसे असेंबली में शामिल किया जाएगा और इसी तरह)।

अब, मुझे यह उल्लेख करना है कि कॉर्पोरेट वातावरण में इस स्थिति से निपटने के लिए "सही तरीका" (शायद यहां मामला नहीं है) कॉर्पोरेट रिपॉजिटरी का उपयोग करना होगा।


2
यह एक अच्छा विचार है, लेकिन मावेन 2.2.1 पर, इंस्टॉल प्लगइन को अनदेखा करने लगता है localRepositoryPath...
जेक

1
स्थानीय रेपो की घोषणा क्यों? क्यों नहीं बस इसे ~ / .m2 / बाकी के साथ जाने दें।
लीफ ग्रुएनवोल्ड

6
@ leif81 क्योंकि तब रेपो और लाइब्रेरी को SCM रिपॉजिटरी में चेक किया जाता है -> कोई भी जो सोर्स चेकआउट करता है, उसके पास लाइब्रेरी / एप्लिकेशन की कॉपी बनाने के लिए जरूरी सब कुछ होता है।
डार्थ Android

6
मेरे पास @lemon जैसी ही समस्या थी, जिसे मैंने basedir/./my-local-repoएक एकल के .बजाय एक करके तय किया ।
ब्रायन

2
पैकेजिंग को जार होना चाहिए, इसलिए -पैकिंग = जार
डैनिला पियातोव

127

systemस्कोप का उपयोग करना । ${basedir}आपकी पोम की डायरेक्टरी है।

<dependency>
    <artifactId>..</artifactId>
    <groupId>..</groupId>
    <scope>system</scope>
    <systemPath>${basedir}/lib/dependency.jar</systemPath>
</dependency>

हालांकि यह सलाह दी जाती है कि आप रिपॉजिटरी में अपना जार इंस्टॉल करें, और इसे एससीएम के लिए प्रतिबद्ध न करें - आखिरकार यही मावेन खत्म करने की कोशिश करता है।


15
गुंजाइश प्रणाली से बचा जाना चाहिए हर जगह यह संभव है। भंडार में जार स्थापित करें एक बेहतर समाधान है ...
गैंडालफ स्टॉर्मको

14
हाँ, यदि संभव हो तो। उन्होंने स्पष्ट रूप से कहा कि वह इसे रिपॉजिटरी में नहीं रखना चाहते हैं। मैंने टिप्पणी करने के लिए कहा कि यह एक अच्छा अभ्यास नहीं है। लेकिन यह काम करता है।
बूझो

groovy, आप समाधान सबसे स्वीकार्य है अब तक मुझे लगता है .. मैं पूरी तरह से सवाल गलत है
चींटी

हां - सवाल ही सबसे अच्छे उत्तर को शामिल नहीं करता है। अपने एकल स्रोत नियंत्रण सर्वर में सब कुछ डालकर "बॉक्स से बाहर निर्माण" करने के लिए बहुत कम है; बल्कि, सब कुछ बस "नियंत्रित" होना चाहिए। चेक-इन pom & settings.xml ( आंतरिक रेपो की ओर इशारा करते हुए ) करें, और अपनी परियोजना के लिए दो सर्वरों का उपयोग करें: (1) स्रोत नियंत्रण, (2) जेनरेट किया गया कृत्रिम नियंत्रण। यह जार में जाँच के बारे में अधिक समझ में आता है क्योंकि यह dll में जाँच करता है (मेरी पुरानी कॉर्प ने वास्तव में चेक-इन जार और lib.a / .so / .dll's में किया था। हमारा p4 सर्वर इतना धीमा था कि बाद में कुछ गुप्त रूप से दिन के लिए hg हो गया। -दिन भर का काम। समस्या का हल?
माइकल

किसी भी निर्देशिका को निर्दिष्ट करने का कोई तरीका जिसमें जार होते हैं इसलिए हमें न तो हर एक को जोड़ना पड़ता है जैसे कि क्या यह कर सकता है?
डीन हिलर

29

क्या यह मेरे पिछले उत्तर के अलावा एक अन्य विधि है, क्या मैं जार को मावेन 2 बिल्ड क्लासपाथ में स्थापित किए बिना जोड़ सकता हूं?

मल्टी-मॉड्यूल का उपयोग करते समय यह सीमा के आसपास हो जाएगा विशेष रूप से अगर डाउनलोड किए गए JAR को माता-पिता के बाहर बाल परियोजनाओं में संदर्भित किया जाता है। यह POM और SHA1 फ़ाइलों को बिल्ड के भाग के रूप में बनाकर सेटअप कार्य को भी कम करता है। यह फ़ाइल को नामों को ठीक किए बिना या मावेन रिपॉजिटरी संरचना का पालन किए बिना परियोजना में कहीं भी रहने की अनुमति देता है।

यह मावेन-इंस्टॉल-प्लगइन का उपयोग करता है। इस काम के लिए, आपको एक मल्टी-मॉड्यूल प्रोजेक्ट स्थापित करने की आवश्यकता है और एक नई परियोजना है जो बिल्ड को स्थानीय रिपॉजिटरी में फाइल स्थापित करने और यह सुनिश्चित करने का प्रतिनिधित्व करती है कि एक पहले है।

आप मल्टी-मॉड्यूल प्रोजेक्ट pom.xml इस तरह दिखेंगे:

<packaging>pom</packaging>
<modules>
<!-- The repository module must be first in order to ensure
     that the local repository is populated -->
    <module>repository</module>
    <module>... other modules ...</module>
</modules>

रिपॉजिटरी / pom.xml फ़ाइल में JAR को लोड करने की परिभाषाएँ होंगी जो आपकी परियोजना का हिस्सा हैं। निम्नलिखित pom.xml फ़ाइल के कुछ स्निपेट हैं।

<artifactId>repository</artifactId>
<packaging>pom</packaging>

पोम पैकेजिंग इसे किसी भी परीक्षण करने या किसी भी जार फ़ाइल को संकलित करने या उत्पन्न करने से रोकता है। Pom.xml का मांस बिल्ड सेक्शन में होता है जहाँ मावेन-इनस्टॉल-प्लगइन का उपयोग किया जाता है।

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <executions>
                <execution>
                        <id>com.ibm.db2:db2jcc</id>
                        <phase>verify</phase>
                        <goals>
                            <goal>install-file</goal>
                        </goals>
                        <configuration>
                            <groupId>com.ibm.db2</groupId>
                            <artifactId>db2jcc</artifactId>
                            <version>9.0.0</version>
                            <packaging>jar</packaging>
                            <file>${basedir}/src/jars/db2jcc.jar</file>
                            <createChecksum>true</createChecksum>
                            <generatePom>true</generatePom>
                        </configuration>
                </execution>
                <execution>...</execution>
            </executions>
        </plugin>
    </plugins>
</build>

एक से अधिक फ़ाइल स्थापित करने के लिए, बस अधिक निष्पादन जोड़ें।


यह केवल एक चीज है जिसने मेरे मल्टी-मॉड्यूल प्रोजेक्ट के लिए काम किया। अज्ञात कारण के लिए स्थानीय <रिपोजिटरी> दृष्टिकोण काम नहीं आया। तो धन्यवाद!
लोनजैक

10

यह मेरे लिए काम कर रहा है: मान लीजिए कि मेरे पास यह निर्भरता है

<dependency>
    <groupId>com.company.app</groupId>
    <artifactId>my-library</artifactId>
    <version>1.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/my-library.jar</systemPath>
</dependency>

फिर, अपने सिस्टम निर्भरता के लिए वर्ग-पथ को मैन्युअल रूप से इस तरह जोड़ें

<Class-Path>libs/my-library-1.0.jar</Class-Path>

पूर्ण कॉन्फ़िगरेशन:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <archive>
            <manifestEntries>
                <Build-Jdk>${jdk.version}</Build-Jdk>
                <Implementation-Title>${project.name}</Implementation-Title>
                <Implementation-Version>${project.version}</Implementation-Version>
                <Specification-Title>${project.name} Library</Specification-Title>
                <Specification-Version>${project.version}</Specification-Version>
                <Class-Path>libs/my-library-1.0.jar</Class-Path>
            </manifestEntries>
            <manifest>
                <addClasspath>true</addClasspath>
                <mainClass>com.company.app.MainClass</mainClass>
                <classpathPrefix>libs/</classpathPrefix>
            </manifest>
        </archive>
    </configuration>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.5.1</version>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/libs/</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

9

मैंने पहले ऐसा करने के लिए एक पैटर्न के बारे में लिखा है

यह पास्कल द्वारा प्रस्तावित समाधान के समान है, हालांकि यह सभी निर्भरता को एक समर्पित भंडार मॉड्यूल में स्थानांतरित करता है ताकि आपको इसे हर जगह दोहराना न पड़े, यदि यह एक बहु-मॉड्यूल निर्माण है तो निर्भरता का उपयोग किया जाता है।


6

मूल रूप से, इसे pom.xml में जोड़ें:

...

<repositories>
   <repository>
       <id>lib_id</id>
       <url>file://${project.basedir}/lib</url>
   </repository>
</repositories>

...

<dependencies>
  ...
  <dependency>
      <groupId>com.mylibrary</groupId>
      <artifactId>mylibraryname</artifactId>
      <version>1.0.0</version>
  </dependency>
  ...
</dependencies>

4

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

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


1
क्या आप एक उदाहरण दे सकते हैं कि आपने यह कैसे किया?
थॉमस

2

पास्कल द्वारा पोस्ट किए गए समाधान के लिए एक छोटा सा अतिरिक्त

जब मैंने इस मार्ग का अनुसरण किया, तो मुझे ओजबर्ड जार स्थापित करते समय मावेन में एक त्रुटि मिली।

[INFO] --- maven-install-plugin:2.5.1:install-file (default-cli) @ validator ---
[INFO] pom.xml not found in ojdbc14.jar

जोड़ने के बाद -pomFile, समस्या हल हो गई थी।

$ mvn install:install-file -Dfile=./lib/ojdbc14.jar -DgroupId=ojdbc \
   -DartifactId=ojdbc -Dversion=14 -Dpackaging=jar -DlocalRepositoryPath=./repo \
   -DpomFile=~/.m2/repository/ojdbc/ojdbc/14/ojdbc-14.pom

0

आप रन करने योग्य जार उत्पन्न करने के लिए ग्रहण का उपयोग कर सकते हैं: निर्यात / रन करने योग्य जार फ़ाइल


यकीन नहीं होता कि सवाल का जवाब दे रहा है। उसके पास पहले से ही जार के रूप में फाइल है।
जोहान्स जैंडर

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