मावेन: मेरी परियोजना के लिए बाहरी बाहरी जार को जोड़ने का सबसे अच्छा तरीका?


151

यह मावेन सीखने का मेरा पहला दिन है और मैं अभी भी बुनियादी बातों से जूझ रहा हूं। मेरे पास एक बाहरी .jar फ़ाइल (सार्वजनिक रिपॉजिट में उपलब्ध नहीं है) जो मुझे अपनी परियोजना में संदर्भित करने की आवश्यकता है और मैं यह जानने की कोशिश कर रहा हूं कि मेरा सबसे अच्छा विकल्प क्या है।

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

1) मेरी परियोजना के संदर्भों में .jar फ़ाइल को जोड़ने के लिए मेरा सबसे अच्छा विकल्प क्या है, यह देखते हुए कि मैं परियोजना और पुस्तकालय दोनों को स्रोत नियंत्रण में रखना चाहता हूं?

2) मैं अभी भी ग्रहण को निर्भरता नहीं देख सकता। मैंने इसे मैन्युअल रूप से पोम के खंड में जोड़ा था, और यह m2eclipse में निर्भरता सूची में ठीक दिखाता है। mvan संकलन और mvn पैकेज दोनों सफल होते हैं, लेकिन कार्यक्रम के परिणाम चलते हैं:

Exception in thread "main" java.lang.Error: Unresolved compilation problems:
        LibraryStuff cannot be resolved to a type

यह पोम के संपादन के बाद है:

<dependency>
  <groupId>stuff</groupId>
  <artifactId>library</artifactId>
  <version>1.0</version>
  <systemPath>${lib.location}/MyLibrary.jar</systemPath>
  <scope>system</scope>
</dependency>

क्या मुझे एमवायएन इंस्टाल करना चाहिए: इनस्टॉल-फाइल को लगा कि मेरे पास पहले से ही pom.xml है जैसा कि ऊपर संपादित किया गया है?

धन्यवाद!

जवाबों:


67

मुझे लगता है कि आपको mvn install:install-fileलाइब्रेरी के जार के साथ अपने स्थानीय भंडार को आबाद करने के लिए उपयोग करना चाहिए, फिर आपको सिस्टम से संकलन करने के लिए गुंजाइश बदलनी चाहिए।

यदि आप मावेन के साथ शुरू कर रहे हैं तो मेरा सुझाव है कि मावेन को सीधे आईडीई प्लगइन्स का उपयोग न करें क्योंकि यह जटिलता की एक अतिरिक्त परत जोड़ता है।

त्रुटि के लिए, क्या आप अपने वर्गपथ पर आवश्यक जार डालते हैं? यदि आप लाइब्रेरी से प्रकारों का उपयोग कर रहे हैं, तो आपको रनटाइम में भी इसकी आवश्यकता है। इसका मावेन से कोई लेना-देना नहीं है।

मुझे समझ नहीं आया कि आप लाइब्रेरी को सोर्स कंट्रोल क्यों करना चाहते हैं - यह सोर्स कोड के लिए है बाइनरी जार नहीं।


36
अधिक के लिए mvn install::install-file: mkyong.com/maven/…
डग टी।

7
mvn install::install-fileअपने स्थानीय रिपॉजिटरी का उपयोग करने का मतलब यह होगा कि जो कोई भी आपके स्रोत कोड को क्लोन करता है उसे यह मैनुअल कदम भी करना होगा। अन्यथा, बिल्ड आउट-ऑफ-द-बॉक्स टूट गया है
इसेन एनजी

हालांकि जार को युद्ध फ़ाइल में नहीं जोड़ा जाएगा।
प्राची

207

आप एक प्रोजेक्ट रिपोजिटरी बना सकते हैं, इसलिए आपको run mvn install:install-fileहर बार नए कंप्यूटर पर काम करने की ज़रूरत नहीं है

<repository>
    <id>in-project</id>
    <name>In Project Repo</name>
    <url>file://${project.basedir}/libs</url>
</repository>

<dependency>
    <groupId>dropbox</groupId>
    <artifactId>dropbox-sdk</artifactId>
    <version>1.3.1</version>
</dependency>

/groupId/artifactId/version/artifactId-verion.jar

विस्तार से पढ़िए यह ब्लॉग पोस्ट

https://web.archive.org/web/20121026021311/charlie.cu.cc/2012/06/how-add-external-libraries-maven


2
"Mvan क्लीन पैकेज" करते समय उपरोक्त समाधान का उपयोग करते हुए एक चेतावनी दिखाई गई - परियोजना के लिए POM <dependency_name> अनुपलब्ध है, कोई निर्भरता जानकारी उपलब्ध नहीं है।
जिग्नेश गोहेल

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

2
या, आप सीधे स्थानीय निर्भरता जोड़ सकते हैं जैसे कि stackoverflow.com/a/22300875/640378
mauryat

2
मुझे फ़ाइल का उपयोग करना था: /// $ {project.basedir} / libs (3 फॉरवर्डेड स्लैश) फ़ाइल के बजाय: // $ {project.basedir} / libs
Loc Phan

2
यदि जार स्थापित किया जा रहा है, तो मावेन संकलित जार नहीं है, आपको मेटाडेटा को परिभाषित करने के लिए एक नई पोम फ़ाइल भी जोड़ना होगा। इन सभी मैनुअल परेशानी से खुद को बचाने के लिए, मैं mvn install:install-fileआपके स्थानीय रिपॉजिटरी से आपके इन-प्रोजेक्ट रिपॉजिटरी में संपूर्ण निर्देशिका संरचना का उपयोग करने और उसके बाद कॉपी करने की सलाह दूंगा।
इसन एनजी

33

इसे आसानी से <निर्भर> तत्व के अंदर निहित <गुंजाइश> तत्व का उपयोग करके प्राप्त किया जा सकता है।

उदाहरण के लिए:

 <dependencies>
   <dependency>
     <groupId>ldapjdk</groupId>
     <artifactId>ldapjdk</artifactId>
     <scope>system</scope>
     <version>1.0</version>
     <systemPath>${basedir}\src\lib\ldapjdk.jar</systemPath>
   </dependency>
 </dependencies>

संदर्भ: http://www.tutorialspoint.com/maven/maven_external_d dependencies.htm


यह विधि बहुत अच्छी तरह से काम करती है जब आपके पास केवल एंबेडेड एंबेडेड मावेन होता है, और आपके पास इंस्टॉल प्लगइन (ऑफ़लाइन सिस्टम) की कमी होती है, इसलिए आप installनिर्भर-एड प्रोजेक्ट पर लक्ष्य नहीं चला सकते हैं । Ofc में एक एयरगैप्ड सिस्टम होना और सभी प्लगइन्स होना लेकिन इंस्टॉल प्लगइन होना, काफी दुर्लभ स्थिति है।
कार्डिन ली जेएच

1
सबसे साफ और सबसे आसान।
अजय कुमार

स्थानीय निर्भरता पथ को कैसे जोड़ा जाए, जो $ {project.basedir} फ़ोल्डर के बाहर है, जैसे मुझे $ {आधारित} \ src \ lib \ ldapjdk.jar पथ चाहिए अन्य फ़ोल्डर में 1 स्तर
नवीन कुमार

मुझे त्रुटि हो रही है -"The POM for … is missing, no dependency information available” even though it exists in Maven Repository
garg10may

28

मावेन मैनुअल ऐसा करने के लिए कहता है :

mvn install:install-file -Dfile=non-maven-proj.jar -DgroupId=some.group -DartifactId=non-maven-proj -Dversion=1 -Dpackaging=jar

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

25

अद्यतन हमने अभी-अभी अपना स्वयं का Nexus सर्वर स्थापित किया है, बहुत आसान और क्लीनर।

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

  1. GitHub पर रेपो बनाएं:
    https://github.com/<user_name>/mvn-repo/

  2. Pom.xml में रिपोजिटरी जोड़ें
    (ध्यान दें कि पूर्ण पथ की कच्ची फ़ाइल रेपो नाम से थोड़ी भिन्न होगी)

    <repository>
        <id>project-common</id>
        <name>Project Common</name>
        <url>https://github.com/<user_name>/mvn-repo/raw/master/</url>
    </repository>
  3. होस्ट करने के लिए निर्भरता जोड़ें (Github या निजी सर्वर)
    a। आपको बस इतना पता होना चाहिए कि फाइलें @glitch
    /groupId/artifactId/version/artifactId-version.jar
    b द्वारा बताए गए पैटर्न में संग्रहीत हैं अपने होस्ट पर इस पैटर्न से मिलान करने के लिए फ़ोल्डर्स बनाएँ।
    यानी अगर आपके पास नाम की जार फाइल है service-sdk-0.0.1.jar, तो फोल्डर बनाएं service-sdk/service-sdk/0.0.1/और जार फाइल service-sdk-0.0.1.jarको उसमें रखें।
    सी। ब्राउज़र से जार डाउनलोड करने की कोशिश करके इसका परीक्षण करें (हमारे मामले में:https://github.com/<user_name>/mvn-repo/raw/master/service-sdk/service-sdk/0.0.1/service-sdk-0.0.1.jar

  4. अपनी pom.xml फ़ाइल में निर्भरता जोड़ें:

    <dependency>
        <groupId>service-sdk</groupId>
        <artifactId>service-sdk</artifactId>
        <version>0.0.1</version>
    </dependency>
  5. का आनंद लें


अच्छा, यह मुझे मिला सबसे उल्लेखनीय समाधान है, धन्यवाद
चार्ली वू

11

SystemPath का उपयोग न करें। यहां लोगों ने जो कुछ भी कहा है, उसके विपरीत, आप अपने चेक-आउट प्रोजेक्ट निर्देशिका के तहत एक फ़ोल्डर में एक बाहरी जार डाल सकते हैं और मैवेन इसे अन्य निर्भरताओं की तरह पा सकते हैं। यहाँ दो महत्वपूर्ण चरण हैं:

  1. -DlocalRepositoryPath के साथ "mvn इंस्टॉल: इंस्टॉल-फाइल" का उपयोग करें।
  2. अपने POM में उस पथ को इंगित करने के लिए एक रिपॉजिटरी कॉन्फ़िगर करें।

यह काफी सीधा है और आप यहां एक कदम-दर-चरण उदाहरण पा सकते हैं: http://randomizedsort.blogspot.com/2011/10/configuring-maven-to-use-local-library.html


8

मावेन परियोजना में गैर मावेन जार जोड़ने का मावेन तरीका

मावेन परियोजना और गैर मावेन जार

अपने निर्माण अनुभाग में मावेन इंस्टॉल प्लगइन्स जोड़ें

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-install-plugin</artifactId>
        <version>${version.maven-install-plugin}</version>
        <executions>

            <execution>
                <id>install-external-non-maven1-jar</id>
                <phase>clean</phase>
                <configuration>
                    <repositoryLayout>default</repositoryLayout>
                    <groupId>jar1.group</groupId>
                    <artifactId>non-maven1</artifactId>
                    <version>${version.non-maven1}</version>
                    <file>${project.basedir}/libs/non-maven1.jar</file>
                    <packaging>jar</packaging>
                    <generatePom>true</generatePom>
                </configuration>
                <goals>
                    <goal>install-file</goal>
                </goals>
            </execution>
            <execution>
                <id>install-external-non-maven2-jar</id>
                <phase>clean</phase>
                <configuration>
                    <repositoryLayout>default</repositoryLayout>
                    <groupId>jar2.group</groupId>
                    <artifactId>non-maven2</artifactId>
                    <version>${version.non-maven2}</version>
                    <file>${project.basedir}/libs/non-maven2.jar</file>
                    <packaging>jar</packaging>
                    <generatePom>true</generatePom>
                </configuration>
                <goals>
                    <goal>install-file</goal>
                </goals>
            </execution>
            <execution>
                <id>install-external-non-maven3-jar</id>
                <phase>clean</phase>
                <configuration>
                    <repositoryLayout>default</repositoryLayout>
                    <groupId>jar3.group</groupId>
                    <artifactId>non-maven3</artifactId>
                    <version>${version.non-maven3}</version>
                    <file>${project.basedir}/libs/non-maven3.jar</file>
                    <packaging>jar</packaging>
                    <generatePom>true</generatePom>
                </configuration>
                <goals>
                    <goal>install-file</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

निर्भरता जोड़ें

<dependencies>
    <dependency>
        <groupId>jar1.group</groupId>
        <artifactId>non-maven1</artifactId>
        <version>${version.non-maven1}</version>
    </dependency>
    <dependency>
        <groupId>jar2.group</groupId>
        <artifactId>non-maven2</artifactId>
        <version>${version.non-maven2}</version>
    </dependency>
    <dependency>
        <groupId>jar3.group</groupId>
        <artifactId>non-maven3</artifactId>
        <version>${version.non-maven3}</version>
    </dependency>
</dependencies>

सन्दर्भ नोट मैं ब्लॉग का मालिक हूँ


आप जार के संस्करणों और मावेन इंस्टॉल प्लगइन के बारे में कैसे जानते हैं?
ऑस्क

जार के संस्करणों सिर्फ बने होते हैं प्लगइन संस्करण स्थापित Maven, नवीनतम है
craftsmannadeem

7

यदि आप एक ही समस्या से मिलते हैं और आप स्प्रिंग-बूट v1.4 + का उपयोग कर रहे हैं , तो आप इसे इस तरह से कर सकते हैं।

इसमें एक SystemScope शामिल है जिसे आप जार में सिस्टम-स्कोप निर्भरता जोड़ने के लिए उपयोग कर सकते हैं।

जैसे

मैं अपने प्रोजेक्ट में oracle ड्राइवर का उपयोग कर रहा हूँ।

<dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc14</artifactId>
        <version>10.2.0.3.0</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/src/main/resources/extra-jars/ojdbc14-10.2.0.3.0.jar</systemPath>
    </dependency>

फिर jSystemScope को शामिल करें = जार को पथ / BOOT-INF / lib / ** में शामिल करने के लिए सही

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <includeSystemScope>true</includeSystemScope>
    </configuration>
</plugin>

और डुप्लिकेट से बचने के लिए संसाधन से बाहर करना शामिल है, जार वसा पर्याप्त ~ है

<build>
    <testSourceDirectory>src/test/java</testSourceDirectory>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <excludes>
                <exclude>**/*.jar</exclude>
            </excludes>
        </resource>
    </resources>
</build>

सौभाग्य!


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

कैसे कई जार के बारे में ??
मिथुन_घोस

4

अपना सिस्टम बदलें ।

<dependency>
  <groupId>stuff</groupId>
  <artifactId>library</artifactId>
  <version>1.0</version>
  <systemPath>${project.basedir}/MyLibrary.jar</systemPath>
  <scope>system</scope>
</dependency>

3

Pom.xml आपके स्थानीय रिपॉजिटरी को देखने और आपकी कलाकृतियों से निर्भरता को खोजने के लिए प्रयास करने जा रहा है। इसके अलावा, आपको वास्तव में सिस्टम स्कोप या सिस्टमपैथ विशेषताओं का उपयोग नहीं करना चाहिए, ये सामान्य रूप से उन चीजों के लिए आरक्षित हैं जो जेडीके में हैं और जेआरई नहीं।

मावेन कलाकृतियों को स्थापित करने के तरीके के लिए यह प्रश्न देखें ।


3

ध्यान दें कि उपयोग करने वाले सभी उदाहरण

<repository>...</respository> 

बाहरी की आवश्यकता है

<repositories>...</repositories> 

टैग लगाना। यह कुछ उदाहरणों से स्पष्ट नहीं है।


2

यहां सबसे अच्छा समाधान एक भंडार स्थापित करना है: नेक्सस या आर्टिफैक्ट। यदि आप इस तरह की चीजों को रखने के लिए जगह देते हैं, और आगे यह आपके सामान को बाहर से कैशिंग करके चीजों को गति देता है।

यदि आप जिस चीज के साथ काम कर रहे हैं वह खुला स्रोत है, तो आप केंद्रीय में डालने पर भी विचार कर सकते हैं ।

गाइड देखें ।


1

ग्रहण ऑक्सीजन के साथ आप नीचे दिए गए काम कर सकते हैं:

  1. WEB-INF / lib में अपने पुस्तकालयों को रखें
  2. प्रोजेक्ट -> बिल्ड बिल्ड पथ -> लाइब्रेरी जोड़ें -> वेब ऐप लाइब्रेरी

मावेन परियोजना स्थापित करते समय उन्हें ले जाएगा।


3
यदि मैं करता हूं, तो क्या मेरी परियोजना को खींचने वाले अन्य उपयोगकर्ताओं को ग्रहण में भी ऐसा ही करना होगा?
क्रूसी

0

यदि बाहरी जार केवल मावेन परियोजना द्वारा बनाया जाता है, तो आप अपने सिस्टम पर संपूर्ण परियोजना की प्रतिलिपि बना सकते हैं और एक चला सकते हैं

mvn install

परियोजना निर्देशिका में। यह जार को .m2 डायरेक्टरी में जोड़ेगा जो कि लोकल मावेन रिपॉजिटरी है।

अब आप जोड़ सकते हैं

<dependency>
     <groupId>copy-from-the=maven-pom-of-existing-project</groupId>
     <artifactId>copy-from-the=maven-pom-of-existing-project</artifactId>
     <version>copy-from-the=maven-pom-of-existing-project</version>
</dependency>

यह सुनिश्चित करेगा कि आप

mvn exec:java 

काम करता है। यदि आप यहां सुझाए गए का उपयोग करते हैं

<scope>system</scope>

फिर आपको कमांड लाइन के माध्यम से निष्पादित करते समय व्यक्तिगत रूप से कक्षाएं जोड़ना होगा।

आप यहाँ वर्णित निम्न कमांड द्वारा बाहरी जार जोड़ सकते हैं

mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> \
-DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>

0

इस समस्या से निपटने के लिए मैंने सबसे कुशल और साफ तरीका जीथब पैकेज का उपयोग किया है

  1. अपनी आवश्यकता के अनुसार GitHub पर एक साधारण खाली सार्वजनिक / निजी रिपॉजिटरी बनाएं कि आप अपने बाहरी जार को सार्वजनिक रूप से होस्ट करना चाहते हैं या नहीं।

  2. ऊपर बनाए गए गितुब भंडार में आपको बाहरी जार तैनात करने के लिए मावेन कमांड के नीचे चलाएं

    mvn deploy:deploy-file \ -DgroupId= your-group-id \ -DartifactId= your-artifact-id \ -Dversion= 1.0.0 -Dpackaging= jar -Dfile= path-to-file \ -DrepositoryId= id-to-map-on-server-section-of-settings.xml \ -Durl=https://maven.pkg.github.com/github-username/github-reponame-created-in-above-step

    ऊपर कमांड आपको बताए गए GitHub रिपॉजिटरी में बाहरी जार तैनात करेगा -Durl=। आप इस लिंक को कैसे GitHub पैकेज GitHub पैकेज परिनियोजन ट्यूटोरियल के रूप में निर्भरता को परिनियोजित कर सकते हैं

  3. उसके बाद आप निर्भरता का उपयोग कर जोड़ सकते हैं groupId, artifactIdऔर versionमावेन pom.xmlऔर चलाने में उपरोक्त चरण में उल्लेख किया गया हैmvn install

  4. Maven GitHub पैकेज रजिस्ट्री से बाहरी जार की निर्भरता प्राप्त करेगा और आपके maven प्रोजेक्ट में प्रदान करेगा।

  5. यह काम करने के लिए आपको settings.xmlGitHub पैकेज रजिस्ट्री से लाने के लिए आपको maven को कॉन्फ़िगर करना होगा ।

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