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


700

Maven2 विकास के प्रयोग / त्वरित और गंदे नकली चरण के दौरान मुझे पागल कर रहा है।

मेरे पास एक pom.xmlफाइल है जो उस वेब-ऐप ढांचे के लिए निर्भरता को परिभाषित करता है जिसे मैं उपयोग करना चाहता हूं, और मैं उस फ़ाइल से स्टार्टर प्रोजेक्ट्स को जल्दी से उत्पन्न कर सकता हूं। हालाँकि, कभी-कभी मैं एक ऐसी 3 पार्टी लाइब्रेरी से लिंक करना चाहता हूं, जिसमें पहले से कोई pom.xmlफाइल परिभाषित नहीं है, इसलिए pom.xmlहाथ से तीसरी पार्टी के लिए फाइल बनाने के बजाय इसे स्थापित करें, और मेरे लिए निर्भरता जोड़ें pom.xml, मैं बस चाहूंगा मावेन को बताने के लिए: "मेरी परिभाषित निर्भरताओं के अलावा, किसी भी जार को /libभी शामिल करें।"

ऐसा लगता है कि यह सरल होना चाहिए, लेकिन अगर यह है, तो मुझे कुछ याद आ रहा है।

यह कैसे करना है पर किसी भी संकेत बहुत सराहना की है। इसमें से कुछ, अगर किसी /libनिर्देशिका में मावेन को इंगित करने का एक आसान तरीका है और आसानी से एक संलग्नता के लिए pom.xmlमैप किए गए सभी संलग्न जार के साथ बना सकते हैं, जिसे मैं तब नाम / स्थापित कर सकता हूं और एक गिर गए झपट्टे में लिंक भी पर्याप्त होगा।


यदि आप नेटबीन का उपयोग कर रहे हैं, तो बस इन चरणों का पालन करें: [मैं नेटवैन एम्बेडेड मावेन का उपयोग करके मावेन रिपॉजिटरी में मॉड्यूल कैसे स्थापित करूं?] [1] [१]: stackoverflow.com/a/339874/530153
रजत गुप्ता

1
मैं यह बताना चाहता हूं कि यह लिंक stackoverflow.com/a/339874/530153 जार को एक बार में स्थापित करने के लिए काम करता है।
पॉल

जवाबों:


600

लोकप्रिय दृष्टिकोण की समस्याएं

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

आपको "स्थानीय प्रतिनिधि को स्थापित" दृष्टिकोण क्यों नहीं लागू करना चाहिए

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

आपको "सिस्टम स्कोप" दृष्टिकोण क्यों नहीं लागू करना चाहिए

जार आप "सिस्टम स्कोप" दृष्टिकोण पर निर्भर करते हैं और न ही किसी रिपॉजिटरी में स्थापित होते हैं या आपके लक्ष्य पैकेजों से जुड़े होते हैं। इसीलिए आपके वितरण पैकेज में उपयोग के समय उस निर्भरता को हल करने का कोई तरीका नहीं होगा। मेरा मानना ​​है कि यही वजह थी कि सिस्टम स्कोप का इस्तेमाल भी कम हो गया। वैसे भी आप एक चित्रित सुविधा पर भरोसा नहीं करना चाहते हैं।

स्थिर इन-प्रोजेक्ट रिपॉजिटरी समाधान

इसे अपने में डालने के बाद pom:

<repository>
    <id>repo</id>
    <releases>
        <enabled>true</enabled>
        <checksumPolicy>ignore</checksumPolicy>
    </releases>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
    <url>file://${project.basedir}/repo</url>
</repository>

x.y.zमावेन के ग्रुप आईडी के साथ प्रत्येक कलाकृतियों के लिए कलाकृतियों के लिए अपनी खोज में अपनी परियोजना के अंदर निम्नलिखित स्थान शामिल होंगे:

repo/
| - x/
|   | - y/
|   |   | - z/
|   |   |   | - ${artifactId}/
|   |   |   |   | - ${version}/
|   |   |   |   |   | - ${artifactId}-${version}.jar

इस बारे में विस्तार से जानने के लिए आप इस ब्लॉग पोस्ट को पढ़ सकते हैं ।

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

हाथ से इस संरचना को बनाने के बजाय, मैं आपके जार को कलाकृतियों के रूप में स्थापित करने के लिए मावेन प्लगइन का उपयोग करने की सलाह देता हूं। इसलिए, repoफ़ोल्डर निष्पादित के तहत एक इन-प्रोजेक्ट रिपॉजिटरी में एक विरूपण साक्ष्य को स्थापित करने के लिए:

mvn install:install-file -DlocalRepositoryPath=repo -DcreateChecksum=true -Dpackaging=jar -Dfile=[your-jar] -DgroupId=[...] -DartifactId=[...] -Dversion=[...]

यदि आप इस दृष्टिकोण को चुनेंगे तो आप रिपॉजिटरी घोषणा को सरल बनाने में सक्षम होंगे pom:

<repository>
    <id>repo</id>
    <url>file://${project.basedir}/repo</url>
</repository>

एक सहायक स्क्रिप्ट

चूंकि प्रत्येक काम के लिए इंस्टॉलेशन कमांड निष्पादित करना कष्टप्रद है और निश्चित रूप से त्रुटि प्रवण है, इसलिए मैंने एक उपयोगिता स्क्रिप्ट बनाई है जो एक libफ़ोल्डर से किसी प्रोजेक्ट रिपॉजिटरी में स्वचालित रूप से सभी जार स्थापित करता है, जबकि स्वचालित रूप से सभी मेटाडेटा (ग्रुपआईड, आर्टिफिशियल और आदि) को हल करता है। फ़ाइलों के नाम। स्क्रिप्ट आपके लिए कॉपी-पेस्ट करने के लिए निर्भरता xml को प्रिंट करती है pom

अपने लक्ष्य पैकेज में निर्भरताओं को शामिल करें

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

इस समस्या को हराने के लिए, मैं आपके लक्ष्य पैकेज में इन निर्भरताओं को शामिल करने का सुझाव देता हूं। यह आप या तो असेंबली प्लगइन के साथ कर सकते हैं या OneJar प्लगइन के साथ बेहतर कर सकते हैं । वनजार पर आधिकारिक दस्तावेजीकरण को समझना आसान है।


3
मैंने हमेशा माना कि आप इस परियोजना में एक भंडार बना सकते हैं, अंत में इसकी पुष्टि कर सकते हैं, बहुत बढ़िया!
एल्बफैन

19
ध्यान देने योग्य दो बातें: 1) मैं "$ {project.baseUri} रेपो" का उपयोग करने के बजाय "फ़ाइल: // $ {project.basedir} / रेपो" का उपयोग करके एक RFC- आज्ञाकारी url भी विंडोज पर प्राप्त करने की सलाह देता हूं। 2) यदि आप अपनी परियोजना को सबमॉडुल्स में बनाते हैं, तो यह दृष्टिकोण विफल हो जाता है क्योंकि $ {project.baseUri} मॉड्यूल की उपनिर्देशिका में हल हो जाता है। किसी भी विचार कैसे इस समस्या को हल करने के लिए?
ओलिवर हनप्पी

8
यह लगभग मुझे वहां मिल गया - लेकिन निकिता की स्क्रिप्ट ने बुरी तरह से नामी जार फाइलों के साथ बहुत चालाक होने की कोशिश की जो मेरे पास थी। इसलिए मैंने एक सरलीकृत संस्करण बनाया जो ग्रुपआईड के लिए कोई अनुमान नहीं लगाता है: github.com/carchrae/install-to-project-repo
Tom Carchrae

3
ऐसा शानदार जवाब !! कुछ करने के 2 तरीके हैं, सही तरीका और काम करने का तरीका, आप सही तरीके से करते हैं!
पंथ्रो

1
यहाँ आपको यह भी जानकारी मिलती है कि कैसे अपने जार फ़ाइल से कलाकृतियों को स्वचालित रूप से जनरेट किया जा सकता है: devcenter.heroku.com/articles/local-maven-d dependencies
डिर्क

486

केवल दूर फेंक कोड के लिए

गुंजाइश सेट == प्रणाली और बस एक groupId, विरूपण साक्ष्य और संस्करण बनाते हैं

<dependency>
    <groupId>org.swinglabs</groupId>
    <artifactId>swingx</artifactId>
    <version>0.9.2</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/swingx-0.9.3.jar</systemPath>
</dependency>

नोट: सिस्टम निर्भरताएँ परिणामित जार / युद्ध में कॉपी नहीं की जाती हैं
(देखें कि मावेन का उपयोग करके निर्मित युद्ध में सिस्टम निर्भरता कैसे शामिल करें )


4
धन्यवाद यह वास्तव में मैं क्या चाहता हूँ के करीब है। किसी भी तरह से एक प्रविष्टि के रूप में उन सभी को जोड़ने के लिए? कहो कि मेरे पास 10 जार हैं, क्या मैं उन सभी को किसी भी तरह से जोड़ सकता हूं, उदाहरण के लिए /some/path/*.jar के लिए सिस्टमपाथ? या मुझे अभी भी एक ज्ञात निर्भरता के रूप में प्रत्येक का इलाज करना है? फिर भी, वास्तव में मैं क्या जरूरत के करीब, धन्यवाद!

11
इस तरह एक systemPath का उपयोग करें: "<systemPath> $ {basedir} /lib/BrowserLauncher2-1_3.jar </ systemPath>" $ {basedir} आपके प्रोजेक्ट के रूट की ओर इशारा कर रहा है।
फ्रेडेरिक मोरिन

4
परियोजना का उपयोग करना बेहतर है। आपके रास्ते में उपसर्ग जैसे: <systemPath> $ {project.basedir} /lib/AwesomeLib.jar </ systemPath>
मैथ्यू

76
जबकि मैं समझता हूं कि यह वही है जो ओपी के लिए पूछ रहा था, मैं अभी भी रेखांकित करना चाहता हूं कि systemगुंजाइश का उपयोग करना एक भयानक अभ्यास है जो दृढ़ता से हतोत्साहित किया जाता हैनिर्भरता + स्कोप देखें ।
पास्कल थिवेंट

6
@marioosh याद रखें कि प्रश्न का मूल इरादा त्वरित प्रयोग के लिए था। यदि आप एक mvan पैकेज करना चाहते हैं, तो जार को रेपो में स्थापित करें।
प्योरोलॉजिकल ऑक्ट

64

आप अपनी परियोजना पर स्थानीय भंडार बना सकते हैं

उदाहरण के लिए यदि आपके पास libsप्रोजेक्ट संरचना में फ़ोल्डर है

  • में libsफ़ोल्डर आप की तरह निर्देशिका संरचना बनाना चाहिए:/groupId/artifactId/version/artifactId-version.jar

  • अपने pom.xml में आपको रिपॉजिटरी रजिस्टर करना चाहिए

    <repository>
        <id>ProjectRepo</id>
        <name>ProjectRepo</name>
        <url>file://${project.basedir}/libs</url>
    </repository>
  • और हमेशा की तरह निर्भरता जोड़ें

    <dependency>
        <groupId>groupId</groupId>
        <artifactId>artifactId</artifactId>
        <version>version</version>
    </dependency>

बस इतना ही।

विस्तृत जानकारी के लिए: मावेन में बाहरी पुस्तकालयों को कैसे जोड़ा जाए


1
आप जवाब लगभग सही है। GroupId को सर्वर उपनिर्देशिकाओं में विभाजित किया जाना चाहिए।
पीटर फ़ोर्टिन

5
बेशक, यदि आपके पास 'com.foo.bar' जैसे जटिल समूह हैं, तो आपकी निर्देशिका संरचना /com/foo/bar/artifactId/version/artifactId-verion.jar
Dmytro Boichenko

क्या यह उस उत्तर से काफी अलग है जो एक साल पहले है ?
जोशुआ टेलर

अंतिम निर्देशिका में, जहाँ jar फ़ाइल स्थित है, आपको संबंधित pom xml फ़ाइल को भी जोड़ना होगा।
फेडरिको

30

नोट: सिस्टम स्कोप का उपयोग करते समय ( जैसा कि इस पृष्ठ पर बताया गया है ), मावेन को निरपेक्ष पथ की आवश्यकता है।

यदि आपके जार आपकी परियोजना की जड़ में हैं, तो आप $ {आधारित} के साथ अपने सिस्टमपैथ मानों को उपसर्ग करना चाहते हैं।


15

यह मैंने क्या किया है, यह पैकेज की समस्या के आसपास भी काम करता है और यह चेक आउट कोड के साथ काम करता है।

मैंने अपने मामले में परियोजना में एक नया फ़ोल्डर बनाया जिसका मैंने उपयोग किया repo, लेकिन उपयोग करने के लिए स्वतंत्र महसूस करता हूंsrc/repo

मेरे पोम में मुझे एक निर्भरता मिली जो किसी भी सार्वजनिक मावेन रिपॉजिटरी में नहीं है

<dependency>
    <groupId>com.dovetail</groupId>
    <artifactId>zoslog4j</artifactId>
    <version>1.0.1</version>
    <scope>runtime</scope>
</dependency>

मैंने तब निम्न निर्देशिका बनाई repo/com/dovetail/zoslog4j/1.0.1 बनाई और उस फ़ोल्डर में JAR फ़ाइल की प्रतिलिपि बनाई।

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

<?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>com.dovetail</groupId>
    <artifactId>zoslog4j</artifactId>
    <packaging>jar</packaging>
    <version>1.0.1</version>
    <name>z/OS Log4J Appenders</name>
    <url>http://dovetail.com/downloads/misc/index.html</url>
    <description>Apache Log4j Appender for z/OS Logstreams, files, etc.</description>
</project>

दो वैकल्पिक फाइलें जो मैं बनाता हूं वे गुम चेकसम चेतावनी को हटाने के लिए पीओएम और जार के लिए SHA1 चेकसम हैं।

shasum -b < repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.jar \
          > repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.jar.sha1

shasum -b < repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.pom \
          > repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.pom.sha1

अंत में मैं अपने pom.xml में निम्नलिखित अंश जोड़ता हूं जो मुझे स्थानीय रिपॉजिटरी को संदर्भित करने की अनुमति देता है

<repositories>
    <repository>
        <id>project</id>
        <url>file:///${basedir}/repo</url>
    </repository>
</repositories>

नमस्ते, क्या आपने स्थानीय रिपॉजिटरी में या अपनी जार फाइलों के बगल में पोम फाइलें रखी हैं?
पयमनख h

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

मैं अभी भी उस समाधान को पसंद करता हूं जिसे मैंने यहां पोस्ट किया है stackoverflow.com/questions/2229757/…
आर्किमिडीज ट्रेजानो

मुझे यह तरीका पसंद है, हालाँकि मैंने इसका इस्तेमाल किया है जार को स्थानीय रेपो में स्थापित करने के लिए मावेन इंस्टॉल प्लगइन का ।
कार्ल जी

13

आपको वास्तव में एक रिपॉजिटरी के माध्यम से एक ढांचा प्राप्त करना चाहिए और सामने की निर्भरता की पहचान करनी चाहिए। सिस्टम स्कोप का उपयोग करना एक आम गलती है जिसका लोग उपयोग करते हैं, क्योंकि वे "निर्भरता प्रबंधन के बारे में परवाह नहीं करते हैं।" परेशानी यह है कि ऐसा करने से आप एक विकृत मावेन बिल्ड के साथ समाप्त हो जाते हैं जो सामान्य स्थिति में मावेन नहीं दिखाएगा। आप इस तरह से एक दृष्टिकोण के बाद बेहतर होंगे ।


12

इस तरह हम एक स्थानीय जार को जोड़ते हैं या स्थापित करते हैं

    <dependency>
        <groupId>org.example</groupId>
        <artifactId>iamajar</artifactId>
        <version>1.0</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/lib/iamajar.jar</systemPath>
    </dependency>

मैं कुछ डिफ़ॉल्ट groupId और विरूपण साक्ष्य दिया क्योंकि वे अनिवार्य हैं :)


11

मावेन इंस्टॉल प्लगइन में स्थानीय रिपॉजिटरी में जार स्थापित करने के लिए कमांड लाइन का उपयोग होता है, पोम वैकल्पिक है लेकिन आपको GroupId, ArtifactId, संस्करण और पैकेजिंग (सभी POM सामान) को निर्दिष्ट करना होगा।


वास्तव में, वह जो उल्लेख करता है वह यह है कि आपको उस पुस्तकालय के लिए एक पॉम नहीं बनाना है जिसे आप अपने स्थानीय भंडार में आयात कर रहे हैं
फ्रेडेरिक मॉरिन

5
-1, कभी-कभी आप बस इसे स्थापित करने की परेशानी के बिना एक जार फ़ाइल जोड़ना चाहते हैं।
लियोनेल सेप

8

<scope>system</scope>दूसरों के द्वारा बताए गए कारणों के लिए उपयोग करना एक भयानक विचार है, फ़ाइल को अपने स्थानीय रिपॉजिटरी में मैन्युअल रूप से स्थापित करना बिल्ड को अप्राप्य बनाता है, और उपयोग <url>file://${project.basedir}/repo</url>करना एक अच्छा विचार नहीं है क्योंकि (1) जो कि एक अच्छी तरह से गठित fileURL नहीं हो सकता है (जैसे कि यदि परियोजना असामान्य पात्रों के साथ एक निर्देशिका में बाहर की जाँच की जाती है), (2) परिणाम अनुपयोगी है अगर इस परियोजना का पीओएम किसी और की परियोजना की निर्भरता के रूप में उपयोग किया जाता है।

यह मानते हुए कि आप एक सार्वजनिक भंडार में कलाकृतियों को अपलोड करने के लिए तैयार नहीं हैं, एक हेल्पर मॉड्यूल का शिमोन का सुझाव काम करता है। लेकिन अब एक आसान तरीका है ...

सिफारिश

उपयोग गैर maven-जार-maven-प्लगइन । क्या वास्तव में आप के लिए पूछ रहे थे, अन्य दृष्टिकोणों की कमियों के साथ नहीं।


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

8

मुझे ऐसा करने का एक और तरीका मिला, एक हर्को पोस्ट से यहां देखें

संक्षेप में (कुछ कॉपी और पेस्ट के बारे में क्षमा करें)

  • repoअपने रूट फ़ोल्डर के तहत एक निर्देशिका बनाएँ :
आपका प्रोजेक्ट
+ - pom.xml
+ - src
+ - रेपो
  • जार को अपनी स्थानीय रेपो निर्देशिका में स्थापित करने के लिए इसे चलाएं
mvan परिनियोजित: परिनियोजन-फ़ाइल -Durl = फ़ाइल: /// पथ / to / yourproject / repo / -Dfile = mylib-1.0.jar -DgroupId = com.example -DartifactId = mylib -Dpackaging = jar -Dversion = 1.0
  • इसे जोड़ें pom.xml:
<repositories>
    <!--other repositories if any-->
    <repository>
        <id>project.local</id>
        <name>project</name>
        <url>file:${project.basedir}/repo</url>
    </repository>
</repositories>


<dependency>
    <groupId>com.example</groupId>
    <artifactId>mylib</artifactId>
    <version>1.0</version>  
</dependency>

6

CloudBees के लोगों के साथ इस तरह के JAR की उचित पैकेजिंग के बारे में वास्तव में लंबी चर्चा करने के बाद, उन्होंने समाधान के लिए एक अच्छा प्रस्ताव दिया:

एक नकली मावेन परियोजना का निर्माण, जो एक पूर्व-मौजूदा JAR को प्राथमिक विरूपण साक्ष्य के रूप में संलग्न करता है, जो कि POM इंस्टॉल: इनस्टॉल-फाइल निष्पादन में चल रहा है। यहाँ POM के इस तरह के एक उदाहरण है:

 <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <version>2.3.1</version>
            <executions>
                <execution>
                    <id>image-util-id</id>
                    <phase>install</phase>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                    <configuration>
                        <file>${basedir}/file-you-want-to-include.jar</file>
                        <groupId>${project.groupId}</groupId>
                        <artifactId>${project.artifactId}</artifactId>
                        <version>${project.version}</version>
                        <packaging>jar</packaging>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

लेकिन इसे लागू करने के लिए, मौजूदा परियोजना संरचना को बदलना चाहिए। सबसे पहले, आपको यह ध्यान में रखना चाहिए कि इस तरह के प्रत्येक JAR के लिए अलग नकली Maven प्रोजेक्ट (मॉड्यूल) बनाया जाना चाहिए। और सभी उप-मॉड्यूलों सहित एक माता-पिता मावेन परियोजना बनाई जानी चाहिए जो हैं: सभी जेएआर रैपर और मौजूदा मुख्य परियोजना। संरचना हो सकती है:

रूट प्रोजेक्ट (इसमें मूल POM फ़ाइल में मॉड्यूल XML तत्व के साथ सभी उप-मॉड्यूल शामिल हैं ) (POM पैकेजिंग)

JAR 1 आवरण मावेन बाल परियोजना (पोम पैकेजिंग)

जार 2 आवरण मावेन बाल परियोजना (पोम पैकेजिंग)

मुख्य मौजूदा मावेन बाल परियोजना (WAR, JAR, EAR .... पैकेजिंग)

जब माता-पिता mvn के माध्यम से चल रहे हों: स्थापित करें या mvn: पैकेजिंग को मजबूर किया जाए और उप-मॉड्यूल निष्पादित किए जाएंगे। इसका मतलब यहां माइनस के रूप में हो सकता है, क्योंकि प्रोजेक्ट स्ट्रक्चर को बदला जाना चाहिए, लेकिन अंत में नॉन स्टैटिक सॉल्यूशन मिलता है


बस एक अवलोकन, लेकिन मुझे नहीं लगता कि आपको प्रत्येक JAR के लिए एक नया POM बनाने की आवश्यकता है जिसे आप जोड़ना चाहते हैं। JAR के सभी को जोड़ने के लिए एक एकल POM बनाने के लिए पर्याप्त होना चाहिए, बशर्ते आपके पास प्रत्येक जार के लिए एक निष्पादन ब्लॉक हो जिसे आप जोड़ना चाहते हैं। आपको बस यह सुनिश्चित करने की आवश्यकता है कि प्रत्येक ब्लॉक में एक अद्वितीय आईडी है। परिणाम एक एकल मावेन मॉड्यूल है जो सभी जेएआर को स्थानीय रेपो में जोड़ देगा। (बस यह सुनिश्चित करें कि मावेन निर्देशांक किसी भी चीज से नहीं
टकराता है

नायक। जैसा मुझे चाहिए था यह बिल्कुल वैसा ही है। अच्छा लगा एक फेला। 2013 एक अच्छा वर्ष रहा होगा;)
ndtreviv

5

मुझे जो सबसे सरल लगता है, वह है अपने कस्टम जारों को शामिल करने के लिए बस अपने मावेन-कंपाइलर-प्लगइन को कॉन्फ़िगर करना। यह उदाहरण किसी भी जार फाइलों को एक कार्यकारी निर्देशिका में लोड करेगा।

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <includes>
                    <include>lib/*.jar</include>
                </includes>
            </configuration>
        </plugin>

1
अगर मैं इस मावेन को जोड़ दूं says nothing to complile!
रवि पारेख

यह कह रहा है all classes are up to date nothing to compileक्योंकि यह *.javaअब और नहीं दिखेगा । आप का उपयोग करके उन्हें वापस जोड़ सकते हैं <include>**/*.java</include>। फिर भी जार के लिए मेरे लिए कोई सफलता नहीं
माइकल लाफार्ग

@ इग्मुएलम, किसी भी कारण से यह जार के लिए काम नहीं करता है?
किशना

4

इसके साथ समस्या systemPathयह है कि आश्रितों के जार आपकी कलाकृतियों के साथ सकर्मक निर्भरताओं के रूप में वितरित नहीं होंगे। जो मैंने यहाँ पोस्ट किया है, उसे आज़माएँ: क्या यह आपके प्रोजेक्ट jar फ़ाइलों को Mavenize या WEB-INF / lib में डालना सबसे अच्छा है?

फिर हमेशा की तरह निर्भरता की घोषणा करें।

और कृपया पाद लेख पढ़ें।


3

एक अजीब समाधान मैंने पाया:

ग्रहण का उपयोग करना

  • सरल (गैर-मावेन) जावा परियोजना बनाएं
  • एक मुख्य वर्ग जोड़ें
  • क्लास जार में सभी जार जोड़ें
  • निर्यात करने योग्य जार (यह महत्वपूर्ण है, क्योंकि इसे करने के लिए यहां कोई अन्य तरीका नहीं है)
  • उत्पन्न JAR में आवश्यक लाइब्रेरी निकालें
  • लाइसेंस के मुद्दे तय करें
  • tadammm ... अपने m2repo के लिए उत्पन्न जार स्थापित करें
  • इस एकल निर्भरता को अपनी अन्य परियोजनाओं में जोड़ें।

चीयर्स, Balint


3

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

प्रत्येक जार फ़ाइल के लिए एक निर्भरता प्रविष्टि जोड़ें, अधिमानतः एक पर्ल स्क्रिप्ट या कुछ समान और कॉपी / पेस्ट करें जो आपकी गोमुखी फ़ाइल में हो।

#! /usr/bin/perl

foreach my $n (@ARGV) {

    $n=~s@.*/@@;

    print "<dependency>
    <groupId>local.dummy</groupId>
    <artifactId>$n</artifactId>
    <version>0.0.1</version>
    <scope>system</scope>
    <systemPath>\${project.basedir}/lib/$n</systemPath>
</dependency>
";

हां यह वही है जो मैं देख रहा था। शोध परीक्षण कोड के माध्यम से इसे आगे बढ़ाने का एक तरीका। कुछ भी आकर्षक नहीं। हाँ, मुझे पता है कि यही वे सब कहते हैं :) विभिन्न मावेन प्लगइन समाधान मेरे उद्देश्यों के लिए ओवरकिल लगते हैं। मेरे पास कुछ जार हैं जो मुझे pom फ़ाइल के साथ 3rd पार्टी लिबास के रूप में दिए गए थे। मैं चाहता हूं कि यह शीघ्रता से संकलित / चले। यह समाधान जो मैंने तुच्छ रूप से अजगर के लिए अनुकूलित किया था, मेरे लिए अद्भुत काम किया। कट कर मेरे पोम में चिपक गया।
पॉल

3

एक त्वरित और गंदा बैच समाधान (एलेक्स के जवाब पर आधारित):

libs.bat

@ECHO OFF
FOR %%I IN (*.jar) DO (
echo ^<dependency^>
echo ^<groupId^>local.dummy^</groupId^>
echo ^<artifactId^>%%I^</artifactId^>
echo ^<version^>0.0.1^</version^>
echo ^<scope^>system^</scope^>
echo ^<systemPath^>${project.basedir}/lib/%%I^</systemPath^>
echo ^</dependency^>
)

इसे इस तरह निष्पादित करें libs.bat > libs.txt:। फिर खोलेंlibs.txt निर्भरता के रूप में इसकी सामग्री को और कॉपी करें।

मेरे मामले में, मुझे केवल अपने कोड को संकलित करने के लिए पुस्तकालयों की आवश्यकता थी, और यह समाधान उस उद्देश्य के लिए सबसे अच्छा था।


2

हालांकि यह आपकी समस्या के लिए बिल्कुल फिट नहीं है, फिर भी मैं इसे यहाँ छोड़ दूँगा। मेरी आवश्यकताएं थीं:

  1. जार जो एक ऑनलाइन मावेन भंडार में नहीं पाया जा सकता है वह एसवीएन में होना चाहिए।
  2. यदि एक डेवलपर दूसरे पुस्तकालय को जोड़ता है, तो अन्य डेवलपर्स को मैन्युअल रूप से स्थापित करने से परेशान नहीं होना चाहिए।
  3. IDE (NetBeans in my case) को स्वतः पूर्णता प्रदान करने और सहायता करने के लिए स्रोत और जावदोक खोजने में सक्षम होना चाहिए।

आइए पहले (3) के बारे में बात करते हैं: बस एक फ़ोल्डर में जार होने और किसी तरह उन्हें अंतिम जार में विलय करने से यहां काम नहीं होगा, क्योंकि आईडीई को यह समझ नहीं आएगा। इसका मतलब है कि सभी पुस्तकालयों को ठीक से स्थापित किया जाना है। हालांकि, मैं "mvan इंस्टॉल-फाइल" का उपयोग करके सभी को इसे स्थापित नहीं करना चाहता।

मेरे प्रोजेक्ट में मुझे मेटाडेटेट की जरूरत थी। ये रहा:

  1. एक नया मावेन प्रोजेक्ट बनाएं (इसे "साझा-लिबास" या ऐसा ही कुछ नाम दें)।
  2. मेटाविजेट डाउनलोड करें और ज़िप को src / main / lib में निकालें।
  3. फ़ोल्डर doc / api में javadocs है। सामग्री का एक ज़िप बनाएं (डॉक्टर / एपीआई / एपीआई.ज़िप)।
  4. इस तरह पोम को संशोधित करें
  5. प्रोजेक्ट का निर्माण करें और लाइब्रेरी स्थापित की जाएगी।
  6. पुस्तकालय को अपनी परियोजना के लिए एक निर्भरता के रूप में जोड़ें, या (यदि आपने साझा-लिबास परियोजना में निर्भरता को जोड़ा है) एक बार में सभी पुस्तकालयों को प्राप्त करने के लिए निर्भरता के रूप में साझा-कामों को जोड़ें।

हर बार जब आपके पास एक नया पुस्तकालय होता है, तो बस एक नया निष्पादन जोड़ें और परियोजना को फिर से बनाने के लिए सभी को कहें (आप इस परियोजना में सुधार कर सकते हैं।


आप मावेन की जांच करना चाह सकते हैं : सापेक्ष पथ (जो IMHO एक बेहतर विकल्प है) द्वारा जार में निर्भरता जोड़ें
पास्कल थिवेंट

यह बेहतर है यदि आप यह सुनिश्चित कर सकते हैं कि स्थानीय रिपॉजिटरी के पास हमेशा परियोजना के समान रिश्तेदार पथ है। यदि मेरे पास विभिन्न स्थानों में कई परियोजनाएँ (या विभिन्न शाखाएँ) हैं तो यह काम नहीं करेगा।
सेफालोपॉड

मेरे जवाब में आपके प्रोजेक्ट के अंदर जार के बारे में pom.xml बताने का एक तरीका है। सिर्फ इतना ही क्यों न करें, और इसे $ {बेस्ड} / लीब में जार को इंगित करें?
एड ब्रानिन

1
@ ईडी क्योंकि यह बिल्कुल नहीं है कि सिस्टम स्कोप क्या है, सिस्टम स्कोप्ड निर्भरता के बहुत सारे दुष्प्रभाव हैं। यह एक भयानक अभ्यास है जिसे पूरी तरह से प्रतिबंधित किया जाना चाहिए।
पास्कल थिवेंट

2

3rd पार्टी जार स्थापित करने के लिए जो मावेन रिपॉजिटरी में मावेन-इनस्टॉल-प्लगइन का उपयोग नहीं करता है।

नीचे चरण हैं:

  1. स्रोत (वेबसाइट) से जार फ़ाइल मैन्युअल रूप से डाउनलोड करें
  2. एक फ़ोल्डर बनाएँ और उसमें अपनी जार फ़ाइल रखें
  3. अपने स्थानीय मावेन भंडार में तीसरे पक्ष के जार को स्थापित करने के लिए नीचे दिए गए कमांड को चलाएं

mvn इंस्टॉल: इंस्टॉल-फाइल -Dfile = -DgroupId = -DartifactId = -Dversion = -Dpackaging =

नीचे मैंने उदाहरण के लिए इसका उपयोग सिमोनसाइट लॉग 4 जे के लिए किया है

mvan install: install-file -Dfile = / Users / athanka / git / MyProject / repo / log4j-रोलिंग-appender.jar -DgroupId = uk.org.simonsite -DartolId = log4j-रोलिंग-ऐपेंडर -Dversion = 20150607-2059- Dpackaging = जार

  1. Pom.xml में नीचे की तरह निर्भरता शामिल है

      <dependency> 
            <groupId>uk.org.simonsite</groupId>
            <artifactId>log4j-rolling-appender</artifactId>
            <version>20150607-2059</version> 
      </dependency>
  2. अपनी पैकेजिंग बनाने के लिए mvan क्लीन इंस्टॉल कमांड चलाएँ

नीचे संदर्भ लिंक दिया गया है:

https://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html


यह एक बॉर्डरलाइन लिंक-ओनली उत्तर है । आपको यहाँ पर अधिक से अधिक जानकारी शामिल करने के लिए अपने उत्तर का विस्तार करना चाहिए, और केवल संदर्भ के लिए लिंक का उपयोग करना चाहिए।
गुडबाय StackExchange

2

उन लोगों के लिए जो यहां एक अच्छा जवाब नहीं मिला, यह वही है जो हम सभी आवश्यक निर्भरताओं के साथ एक जार प्राप्त करने के लिए कर रहे हैं। इस उत्तर ( https://stackoverflow.com/a/7623805/1084306 ) मेंवेन असेंबली प्लगइन का उपयोग करने का उल्लेख है लेकिन वास्तव में उत्तर में एक उदाहरण नहीं देता है। और यदि आप उत्तर के अंत तक सभी तरह से नहीं पढ़ते हैं (यह बहुत लंबा है), तो आप इसे याद कर सकते हैं। अपने pom.xml में नीचे जोड़ना जनरेट करेगाtarget/${PROJECT_NAME}-${VERSION}-jar-with-dependencies.jar

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.4.1</version>
            <configuration>
                <!-- get all project dependencies -->
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <!-- MainClass in mainfest make a executable jar -->
                <archive>
                  <manifest>
                    <mainClass>my.package.mainclass</mainClass>
                  </manifest>
                </archive>

            </configuration>
            <executions>
              <execution>
                <id>make-assembly</id>
                <!-- bind to the packaging phase -->
                <phase>package</phase> 
                <goals>
                    <goal>single</goal>
                </goals>
              </execution>
            </executions>
        </plugin>

1

मैंने @alex lehmann के उत्तर के लिए एक टिप्पणी में कुछ अजगर कोड की घोषणा की, इसलिए मैं इसे यहां पोस्ट कर रहा हूं।

def AddJars(jarList):
  s1 = ''
  for elem in jarList:
   s1+= """
     <dependency>
        <groupId>local.dummy</groupId>
        <artifactId>%s</artifactId>
        <version>0.0.1</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/manual_jars/%s</systemPath>
     </dependency>\n"""%(elem, elem)
  return s1

0

इसका उत्तर यह नहीं है कि उन्हें अपने POM में कैसे जोड़ा जाए, और कोई ब्रेनर नहीं हो सकता है, लेकिन क्या यह आपके क्लास रूम के काम में लिबास को जोड़ देगा? मुझे पता है कि जब मैं बाहरी जार की जरूरत होती है तो मैं वही करता हूं जो मैं अपने मावेन रेपो से नहीं जोड़ना चाहता।

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


1
यह वही है जो मैं कर रहा था, और यह काम करता है, लेकिन यह वैश्विक वर्ग पथ को भी प्रदूषित करता है, और मैं इससे दूर होने की कोशिश कर रहा हूं। धन्यवाद!

@purple वास्तव में आपने ऐसा कैसे किया?
TheRealChx101

0

हमारी परियोजना में क्या काम है आर्किमिडीज ट्रेजानो ने लिखा था, लेकिन हमारे पास हमारे .m2 / settings.xml में कुछ इस तरह था:

 <mirror>
  <id>nexus</id>
  <mirrorOf>*</mirrorOf>
  <url>http://url_to_our_repository</url>
 </mirror>

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


0

मैं सिर्फ एक त्वरित और गंदा काम चाहता था ... मैं निकिता वोल्कोव से स्क्रिप्ट नहीं चला सकता: वाक्यविन्यास त्रुटि + इसे जार नामों के लिए एक सख्त प्रारूप की आवश्यकता है।

मैंने यह पर्ल स्क्रिप्ट बनाई जो जार फ़ाइल नामों के लिए जो भी प्रारूप के साथ काम करती है, और यह एक xml में निर्भरता उत्पन्न करती है, इसलिए इसे सीधे एक पोम में चिपकाया जा सकता है।

आप इसका इस्तेमाल करना चाहते हैं, आप समझते हैं कि स्क्रिप्ट कर रहा है यह सुनिश्चित कर लें, तो आप बदलना पड़ सकता है libफ़ोल्डर और के लिए मूल्य groupIdया artifactId...

#!/usr/bin/perl

use strict;
use warnings;

open(my $fh, '>', 'dependencies.xml') or die "Could not open file 'dependencies.xml' $!";
foreach my $file (glob("lib/*.jar")) {
    print "$file\n";
    my $groupId = "my.mess";
    my $artifactId = "";
    my $version = "0.1-SNAPSHOT";
    if ($file =~ /\/([^\/]*?)(-([0-9v\._]*))?\.jar$/) {
        $artifactId = $1;
        if (defined($3)) {
            $version = $3;
        }
        `mvn install:install-file -Dfile=$file -DgroupId=$groupId -DartifactId=$artifactId -Dversion=$version -Dpackaging=jar`;
        print $fh "<dependency>\n\t<groupId>$groupId</groupId>\n\t<artifactId>$artifactId</artifactId>\n\t<version>$version</version>\n</dependency>\n";
        print " => $groupId:$artifactId:$version\n";
    } else {
        print "##### BEUH...\n";
    }
}
close $fh;

0

जावा में गुंजाइश = 'सिस्टम' दृष्टिकोण के लिए समाधान:

public static void main(String[] args) {
        String filepath = "/Users/Downloads/lib/";
        try (Stream<Path> walk = Files.walk(Paths.get(filepath))) {

        List<String> result = walk.filter(Files::isRegularFile)
                .map(x -> x.toString()).collect(Collectors.toList());

                String indentation = "    ";
                for (String s : result) {
                    System.out.println(indentation + indentation + "<dependency>");
                    System.out.println(indentation + indentation + indentation + "<groupId>"
                            + s.replace(filepath, "").replace(".jar", "")
                            + "</groupId>");
                    System.out.println(indentation + indentation + indentation + "<artifactId>"
                            + s.replace(filepath, "").replace(".jar", "")
                            + "</artifactId>");
                    System.out.println(indentation + indentation + indentation + "<version>"
                            + s.replace(filepath, "").replace(".jar", "")
                            + "</version>");
                    System.out.println(indentation + indentation + indentation + "<scope>system</scope>");
                    System.out.println(indentation + indentation + indentation + "<systemPath>" + s + "</systemPath>");
                    System.out.println(indentation + indentation + "</dependency>");
                }

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