मावन निर्भरता को चलाने के लिए मावेन भाई मॉड्यूल की पहचान नहीं करता है: पेड़


90

मैं एक मल्टी-मॉड्यूल मावेन परियोजना स्थापित करने की कोशिश कर रहा हूं, और अंतर-मॉड्यूल निर्भरताएं स्पष्ट रूप से सही ढंग से सेट नहीं हो रही हैं।

मेरे पास है:

<modules>
  <module>commons</module>
  <module>storage</module>
</modules>

मूल POM में (जिसमें एक पैकेजिंग-प्रकार पोम है) और फिर उपनिर्देशिकाएँ commons/और storage/जो एक ही नाम के साथ JAR poms को परिभाषित करते हैं।

भंडारण कॉमन्स पर निर्भर करता है।

मुख्य (मास्टर) निर्देशिका में, मैं दौड़ता हूं mvn dependency:treeऔर देखता हूं:

[INFO] Building system
[INFO]    task-segment: [dependency:tree]
[INFO] ------------------------------------------------------------------------
[INFO] [dependency:tree {execution: default-cli}]
[INFO] domain:system:pom:1.0-SNAPSHOT
[INFO] \- junit:junit:jar:3.8.1:test
[INFO] ------------------------------------------------------------------------
[INFO] Building commons
[INFO]    task-segment: [dependency:tree]
[INFO] ------------------------------------------------------------------------
[INFO] [dependency:tree {execution: default-cli}]
...correct tree...
[INFO] ------------------------------------------------------------------------
[INFO] Building storage
[INFO]    task-segment: [dependency:tree]
[INFO] ------------------------------------------------------------------------
Downloading: http://my.repo/artifactory/repo/domain/commons/1.0-SNAPSHOT/commons-1.0-SNAPSHOT.jar
[INFO] Unable to find resource 'domain:commons:jar:1.0-SNAPSHOT' in repository my.repo (http://my.repo/artifactory/repo)
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Failed to resolve artifact.

Missing:
----------
1) domain:commons:jar:1.0-SNAPSHOT

"कॉमन्स" पर निर्भरता क्यों विफल हो जाती है, भले ही रिएक्टर ने स्पष्ट रूप से इसे देखा हो क्योंकि यह सफलतापूर्वक अपनी निर्भरता के पेड़ को संसाधित करता है? यह निश्चित रूप से 'नेट पर नहीं जाना चाहिए क्योंकि यह वहीं है ...

भंडारण के लिए पोम:

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <packaging>jar</packaging>
  <parent>
    <artifactId>system</artifactId>
    <groupId>domain</groupId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <groupId>domain</groupId>
  <artifactId>storage</artifactId>
  <name>storage</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <!-- module dependencies -->
    <dependency>
      <groupId>domain</groupId>
      <artifactId>commons</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>

    <!-- other dependencies -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

किसी भी सुझाव के लिए धन्यवाद!

(संपादित करें)

स्पष्ट करने के लिए, जो मैं यहाँ देख रहा हूँ वह यह है: मुझे मॉड्यूल Y को बनाने के लिए मॉड्यूल X को स्थापित करने की आवश्यकता नहीं है जो कि X पर निर्भर करता है, यह देखते हुए कि दोनों एक ही मूल POM से संदर्भित मॉड्यूल हैं। यह मेरे लिए सहज ज्ञान युक्त है कि अगर मेरे पास एक ही स्रोत के पेड़ में दो चीजें हैं, तो मुझे बिल्ड जारी रखने के लिए मध्यवर्ती उत्पादों को स्थापित नहीं करना चाहिए। उम्मीद है मेरी सोच यहाँ कुछ समझ में आती है ...


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

1
नमस्ते। क्या आपको इसका हल मिला? मुझे यह समस्या भी है :(

1
क्या संकलन विफल रहता है, या सिर्फ निर्भरता: वृक्ष लक्ष्य अकेले? देखें डॉन विलिस का जवाब।
मेटामैट

OMG एक मॉड्यूल में अगर यह विफल हो जाता है क्योंकि यह दूसरे मॉड्यूल के प्रतीक नहीं ढूंढ सकता है, तो दूसरे को निर्भरता के रूप में जोड़ा जाना चाहिए और जार के रूप में स्थापित किया जाना चाहिए? यह कुंजी है ....
पश्चिमीगुण

यह दुख की बात है 3.6 इस समस्या को अभी तक हल नहीं करता है
yuxh

जवाबों:


21

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


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

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

मुझे वास्तव में इसी तरह के मुद्दों और अफसोस से निपटना है - मैं अब तक जवाब नहीं पा रहा हूं। ऐसा लग रहा है कि मावेन को इस बात की परवाह नहीं है कि निर्भरता आपके मॉड्यूल से जुड़ी हुई है, यह अभी तुरंत रेपो में जाती है। मैं आपके सवाल पर पसंदीदा डालूँगा - तो शायद कोई गुरु जवाब देगा। मुझे यह पता लगाने में दिलचस्पी है कि क्या यह किया जा सकता है
बोसोन

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

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

104

जैसा कि इस मावेन मेलिंग लिस्ट थ्रेड में चर्चा की गई है , निर्भरता: पेड़ का लक्ष्य अपने आप में रिएक्टर के बजाय भंडार में चीजों को देखेगा। आप इसके चारों ओर एमवायएन इंस्टालिंग के द्वारा काम कर सकते हैं, जैसा कि पहले सुझाव दिया गया है, या कुछ कम कर रहा है जो रिएक्टर को आमंत्रित करता है, जैसे कि

mvn compile dependency:tree

मेरे लिये कार्य करता है।


2
उस सस्ते वर्कअराउंड के लिए धन्यवाद। लेकिन क्या यह एक बग है? मुझे निर्भरता की उम्मीद है: ट्री गोल बिना किसी चाल के रिएक्टर पर निर्भर करता है।
mcoolive

यह ध्यान दिया जाना चाहिए कि किसी भी कार्य के लिए वही स्थिति होती है जो विश्व स्तर पर चलाई जाती है, लेकिन केवल कुछ उपप्रकारों को प्रभावित करती है।
trruse

दुर्भाग्य से, compileसकर्मक निर्भरताओं के डाउनलोड को ट्रिगर करता है। क्या वास्तव में उन्हें डाउनलोड किए बिना निर्भरता के पेड़ को सूचीबद्ध करने का एक तरीका है (पोम को छोड़कर, निश्चित रूप से)?
sschuberth

अन्य लक्ष्यों के लिए भी मुझे यही समस्या थी। जोड़ना compile( validateपर्याप्त नहीं है) वहां भी मदद की: mvn compile animal-sniffer:checkऔरmvn compile org.basepom.maven:duplicate-finder-maven-plugin:check
msa

आपके निर्माण के आधार पर, कुछ मॉड्यूल में कलाकृतियों पर निर्भरता भी हो सकती है जो बाद के चरणों में बनाई गई हैं। मेरे मामले में एक ज़िप फ़ाइल (मावेन-असेंबली-प्लगइन का उपयोग करके) packageचरण में बनाया गया था , इसलिए मुझे उदाहरण के लिए ऐसा करने की आवश्यकता थी mvn package animal-sniffer:check
मुसा

6

यह महसूस करना एक पुराना धागा है लेकिन ऐसा लगता है कि या तो उपकरण विकसित हो गया है या यह पहली बार के आसपास छूट गया है।

एक रिएक्टर बिल्ड करके स्थापित किए बिना निर्भरता को हल करने वाले निर्माण को करना संभव है।

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

बेशक यह सही समाधान नहीं है क्योंकि यह संरचना के भीतर एक एकल व्यक्तिगत मॉड्यूल के निर्माण को हल नहीं करता है। इस मामले में मावेन के पास अपने रिएक्टर में निर्भरता नहीं होगी और वह इसे भंडार में हल करने के लिए देखेगा। तो व्यक्तिगत बिल्ड के लिए आपको अभी भी पहले निर्भरता स्थापित करना होगा।

इस स्थिति का वर्णन करने वाला कुछ संदर्भ यहां दिया गया है ।


1
क्या एक ही मॉड्यूल बनाने का कोई तरीका है, पहली निर्भरता स्थापित किए बिना और पूर्ण मूल परियोजना का निर्माण किए बिना?
है क्विट - Anony-Mousse

1
उत्तर को पूरा करने के लिए - यदि प्लगइन को सीधे (चरणों के बिना) उदाहरण के लिए लागू किया जाता है mvn dependency:tree, तो यह तब भी स्रोतों से निर्भरता को हल नहीं करेगा जब तक कि आप compileचरण को आमंत्रित नहीं करते हैं । तो यह बजाय काम करेगा: mvn compile dependency:tree
स्टैनिस्लाव बश्किर्त्सेव

3

मेरे लिए, जो मुझे इस धागे तक ले गया, वह एक ऐसी ही समस्या थी और इसका समाधान सभी मॉड्यूल निर्भरता पोम के लिए सुनिश्चित करना था

 <packaging>pom</packaging>

जनक के पास था

पोम

मेरे मॉडल डिपो में पोम था - इसलिए कोई जार नहीं मिला।


मेरे लिए यह त्रुटि फेंकता है: POM पढ़ने में त्रुटि। कारण:
गैर

संपादित करें: मेरा मतलब है कि <पैकेजिंग> पोम </ पैकेजिंग> ने इसे ठीक किया। की जगह <पैकेजिंग> जार </ पैकेजिंग>
बॉस्टनर

4
यह प्रश्न में वर्णित समस्या को ठीक करता है, लेकिन अब बाल मॉड्यूल निर्यात योग्य अभिलेखागार (यानी जार, युद्ध, कान) का उत्पादन नहीं करते हैं।
शेल्डन

शेल्डन ने इस त्रुटि को ठीक करने के लिए एक समाधान खोजा और एक निर्यात योग्य संग्रह तैयार किया?
user3853134

3

केवल एक चीज जो मेरे लिए काम करती है: स्विच करने के लिए स्विच करना :(

मेरे पास है

Parent
  +---dep1
  +---war1 (using dep1)

और मैं युद्ध 1 में cd कर सकता हूं और mvan tomcat7 का उपयोग कर सकता हूं: रन-वार। मुझे हमेशा पूरे प्रोजेक्ट को पहले स्थापित करना पड़ता है, युद्ध 1 के बावजूद उसके माता-पिता और माता-पिता का संदर्भ युद्ध 1 और dep1 (मॉड्यूल के रूप में) होता है, इसलिए सभी निर्भरताएं जानी चाहिए।

मुझे समझ नहीं आ रहा है कि समस्या क्या है।


1
यही कारण है कि जब मैं मल्टी-मॉड्यूल प्रोजेक्ट बनाना होता है तो मैं ग्रेडेल का उपयोग करता हूं। :(
झोउ यिंग

2

इस तरह एक मावेन मॉड्यूल संरचना में:

- parent
  - child1
  - child2

आप parent pomइस में होगा :

<modules>
  <module>child1</module>
  <module>child2</module>
</modules>

अब आप पर निर्भर करता है, तो child1में child2अपने में निम्नलिखित डालकर <dependencies>में child2:

<dependency>
  <groupId>example</groupId>
  <artifactId>child1</artifactId>
</dependency>

आपको एक त्रुटि मिलेगी जो JAR के लिए child1नहीं मिल सकती है। यह एक घोषणा के द्वारा हल किया जा सकता <dependencyManagement>सहित ब्लॉक child1में pomके लिए parent:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>example</groupId>
      <artifactId>child1</artifactId>
      <version>${project.version}</version>
    </dependency>
  </dependencies>
</dependencyManagement>

child1अब निर्माण किया जाएगा जब आप पर एक compileया packageआदि लक्ष्य चलाते हैं parent, और संकलित फ़ाइलें child2मिल जाएगा child1


2

डॉन विलिस के जवाब से दूर :

यदि आपका बिल्ड आपके रिएक्टर सबमॉडल्स के बीच टेस्ट कोड साझा करने के लिए टेस्ट-जार बनाता है, जिसका आपको उपयोग करना चाहिए:

mvn test-compile dependency:tree

जो dependency:treeइस मामले में पूरा होने के लिए चलाने की अनुमति देगा ।


-1

सुनिश्चित करें कि जो मॉड्यूल विफल हो रहा है वह पोम में हल हो गया है, मॉड्यूल के पोम फ़ाइल में कॉन्फ़िगरेशन को शामिल करके सही माता-पिता को इंगित कर रहा है।

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