मावेन: जार को कैसे शामिल किया जाए, जो जे 2 ईई परियोजना में प्रतिनिधि में उपलब्ध नहीं हैं?


100

मेरे जे 2 ईई प्रोजेक्ट में मेरे पास कुछ निर्भरताएँ हैं, जो किसी भी मावेन भंडार में उपलब्ध नहीं हैं, क्योंकि वे मालिकाना पुस्तकालय हैं। इन पुस्तकालयों को रनटाइम पर उपलब्ध होने की आवश्यकता है, ताकि लक्ष्य /... / WEB-INF / lib को कॉपी करना पड़े ...

अभी, मैं उन्हें अपने POM में सिस्टम निर्भरता के रूप में सूचीबद्ध कर रहा हूं, लेकिन इस पद्धति के साथ समस्या यह है, कि संकलन के दौरान लक्ष्य निर्माण में कॉपी नहीं किया जा रहा है। साथ ही यह विधि बहुत सुरुचिपूर्ण नहीं है।

तो मावेन में उन्हें एकीकृत करने का सबसे अच्छा तरीका कौन सा है?

नोट: मैं अपना मावेन भंडार नहीं बनाना चाहता।


7
मुझे वास्तव में लगता है कि आपको मैवेन रिपॉजिटरी बनाने के अपने निर्णय की समीक्षा करनी चाहिए। यह बिल्कुल भी मुश्किल नहीं है और 100% इसके लायक है।
रॉबर्ट मुंटेनु

7
मावेन भंडार बनाने का मूल्य परिस्थितियों पर निर्भर है।
यिनक्रैश

जवाबों:


54

जैसा कि आपने कहा है कि आप अपना स्वयं का भंडार स्थापित नहीं करना चाहते हैं, शायद यह मदद करेगा।

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

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

mvn install:install-file -Dfile=/usr/jars/foo.jar -DpomFile=/usr/jars/foo.pom
mvn install:install-file -Dfile=/usr/jars/bar.jar -DpomFile=/usr/jars/bar.pom

या केवल

mvn install:install-file -Dfile=ojdbc14.jar -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0 -Dpackaging=jar

फिर आप अपनी परियोजना में सामान्य के रूप में निर्भरता का संदर्भ दे सकते हैं।

हालाँकि आपका सर्वश्रेष्ठ दांव अभी भी एक आंतरिक दूरस्थ भंडार स्थापित करना है और मैं खुद नेक्सस का उपयोग करने की सलाह दूंगा। यदि आवश्यक हो तो यह आपके विकास बॉक्स पर चल सकता है, और ओवरहेड न्यूनतम है।


1
धन्यवाद यह तरीका अब मेरे लिए अच्छा काम कर रहा है। मैंने POM का विस्तार किया ताकि फ़ाइलें स्थानीय प्रतिनिधि पर स्वचालित रूप से इंस्टॉल की जा रही हों: pastebin.ca/1504318
सैमसन

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

4
मेरे लिए काम करने वाली कमांड: "mvan install: install-file -Dfile = cassandra-jdbc-1.1.1.jar -DgroupId = org.apache-extras.cassandra-jdbc -DartifactId = cassandra-jdbc -Dversion = 1.1.1 -पैकिंग = जार "
मजरिक

193

इस समस्या का त्वरित समाधान चाहने वाले लोगों के लिए:

<dependency>
  <groupId>LIB_NAME</groupId>
  <artifactId>LIB_NAME</artifactId>
  <version>1.0.0</version>
  <scope>system</scope>
  <systemPath>${basedir}/WebContent/WEB-INF/lib/YOUR_LIB.jar</systemPath>
</dependency>

बस अपनी लाइब्रेरी को एक अद्वितीय समूहीकरण और विरूपण साक्ष्य नाम दें और यह इंगित करें कि यह फ़ाइल सिस्टम में कहां है। तुम तैयार हो।

बेशक यह एक गंदा त्वरित सुधार है जो केवल आपकी मशीन पर काम करेगा और यदि आप कामों के लिए रास्ता नहीं बदलते हैं। लेकिन कुछ समय, यही सब आप चाहते हैं, चलाने और कुछ परीक्षण करने के लिए।

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


4
ठंडा। क्या स्थानीय मशीन पथ के बजाय URL निर्दिष्ट करने का कोई तरीका है?
फ्रैकेहेड

3
एक पूर्ण और कामकाजी उदाहरण के लिए धन्यवाद !!! मुझे आशा है कि आप एक सोने की मछली पकड़ेंगे और यह आपको तीन इच्छाओं को पूरा करती है। :)
जॉन्डोडो

14
यह स्वीकृत उत्तर होना चाहिए क्योंकि यह स्व-निहित है (pom.xml में)
विक्रम

2
हाय राजर्षि, समूह और कलाकृति आईडी पूरी तरह से मनमाना हैं। फ़ाइल सिस्टम में आपके जार का रास्ता वह सब है जो इस काम के लिए मायने रखता है। क्योंकि वास्तव में जार एक मावेन निर्भरता नहीं है, आप केवल मावेन को एक जैसा व्यवहार करने के लिए कह रहे हैं।
रिक जैफ

1
2016 तक यह काम नहीं करता है। बिल्ड पथ को स्वीकार करता है, लेकिन कोड को छायांकित जार में शामिल नहीं करता है। चूहे ...
निशान

24

अपनी परियोजना के तहत एक रिपॉजिटरी फ़ोल्डर बनाएँ। चलो ले लो

${project.basedir}/src/main/resources/repo

फिर, अपने कस्टम जार को इस रेपो में स्थापित करें:

mvn install:install-file -Dfile=[FILE_PATH] \
-DgroupId=[GROUP] -DartifactId=[ARTIFACT] -Dversion=[VERS] \ 
-Dpackaging=jar -DlocalRepositoryPath=[REPO_DIR]

अंत में, परियोजनाओं में निम्नलिखित रेपो और निर्भरता परिभाषा जोड़ें pom.xml:

<repositories>
    <repository>
        <id>project-repo</id>
        <url>file://${project.basedir}/src/main/resources/repo</url>
    </repository>
</repositories>

<dependencies>    
    <dependency>
        <groupId>[GROUP]</groupId>
        <artifactId>[ARTIFACT]</artifactId>
        <version>[VERS]</version>
    </dependency>
</dependencies>

1
इसने मेरे लिए बहुत अच्छा काम किया। PS मैं स्थानीय रेपो के लिए एक अलग निर्देशिका की सिफारिश करूंगा क्योंकि इसे "src" के भीतर
रखना

1
इसने एक जादू की तरह काम किया। मैं चींटी से मावेन के लिए एक पुराने प्रोजेक्ट को माइग्रेट कर रहा हूं और कुछ चीजें हैं जो मुझे वेब रिपोज में नहीं मिल सकती हैं।
पाउलो पेड्रोसो

सावधानी: जब -DlocalRepositoryPath के लिए मान समाप्त नहीं होता है / (यानी, एक फ़ोल्डर को इंगित करता है), तो वह repo groupId के साथ बनाया जाता है। Ex: यदि समूह आईडी है foo.comऔर localRepositoryPath है repo, तो रेपो फ़ोल्डर बन जाता है repo.foo.com
षष्ठी मन्त्र

यह प्रक्रिया मुख्य रूप से जावा परियोजनाओं और फाइल सिस्टम के लिए उपयोग किए जाने वाले मावेन बिल्ड ऑटोमेशन टूल का उपयोग करते हुए सिस्टम रिपॉजिटरी प्रबंधन के लिए एक स्थानीय परियोजना के रूप में है।
Oleksii Kyslytsyn

8

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


4
शब्दावली पर एक बिंदु, वे आंतरिक रिमोट रिपोजिटरी हैं, स्थानीय रिपोजिटरी नहीं। स्थानीय रिपॉजिटरी स्थानीय फाइल सिस्टम पर निर्भरता को डाउनलोड करने के लिए एक है।
रिच सेलर

3

यदि आप जेनकींस बिल्ड का उपयोग कर रहे हैं तो कोई भी समाधान काम नहीं करता है !! जब जेनकिन्स बिल्ड सर्वर के अंदर पोम चलाया जाता है .. तो ये समाधान विफल हो जाएगा, क्योंकि जेनकिन्स रन पोम इन फाइलों को एंटरप्राइज रिपॉजिटरी से डाउनलोड करने का प्रयास करेगा।

जर्क को src / main / resource / lib (लिबर फ़ोल्डर बनाएँ) के तहत कॉपी करें। ये आपकी परियोजना का हिस्सा होंगे और सभी तरह से परिनियोजन सर्वर पर जाएंगे। परिनियोजन सर्वर में, सुनिश्चित करें कि आपकी स्टार्टअप स्क्रिप्ट में ssp / main / resource / lib / * classpath में हैं। वियोला।


2

आप उन्हें एक निजी, स्थानीय रिपॉजिटरी (उदाहरण के लिए .m2 / रिपॉजिटरी में अपने होम डायरेक्टरी के तहत) स्थापित कर सकते हैं: अधिक जानकारी यहाँ


7
हां, मैं ऐसा कर सकता था, लेकिन फिर मुझे हर किसी को बताना होगा कि वह इस परियोजना का निर्माण करना चाहता है कि उसे निर्देशिका Z में फाइलें X, Y डालनी होंगी और यह वास्तव में चीजों को जटिल बनाती है। आखिरकार मैं निर्माण प्रक्रिया को आसान बनाने के लिए मावेन का उपयोग करना चाहता हूं।
सैमसन

2

यदि मैं अच्छी तरह से समझ रहा हूं, यदि आप क्या करना चाहते हैं तो संकलन चरण के दौरान निर्भरता को निर्यात करना है इसलिए प्रत्येक आवश्यक पुस्तकालयों को मैन्युअल रूप से पुनर्प्राप्त करने की कोई आवश्यकता नहीं होगी, आप मोजो कॉपी-निर्भरता का उपयोग कर सकते हैं ।

आशा है कि यह आपके मामले में उपयोगी हो सकता है ( उदाहरण )


2

@ रिक जाफे का समाधान मेरे लिए काम कर रहा है।

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

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

ऊपर के समाधान xx.jar के लिए 'निर्भरता. निर्भरता। SystemPath' रिटर्न परियोजना निर्देशिका के भीतर फाइलों पर इंगित नहीं करना चाहिए। देखें stackoverflow.com/questions/10935135/…
sarah.ferguson


1

अकेले स्थापित मेरे लिए काम नहीं किया।

mvn deploy:deploy-file -Durl=file:///home/me/project/lib/ \
  -Dfile=target/jzmq-2.1.3-SNAPSHOT.jar -DgroupId=org.zeromq \  
  -DartifactId=zeromq -Dpackaging=jar -Dversion=2.1.3
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.