मावेन के वितरण प्रबंधन संगठन को कैसे निर्दिष्ट किया जाए?


110

मैं यह पता लगाने की कोशिश कर रहा हूं कि कई (लगभग 50+) maven2 परियोजनाओं को कैसे व्यवस्थित किया जाए, ताकि वे एक केंद्रीय सांठगांठ के भंडार में तैनात हो सकें। mvn deployलक्ष्य का उपयोग करते समय , किसी को इस तरह वितरण वितरण टैग में लक्ष्य निर्दिष्ट करने की आवश्यकता होती है:

<distributionManagement>
   <repository>
      <id>nexus-site</id>
        <url>http://central_nexus/server</url>
   </repository>
</distributionManagement>

अब, मैं हर एक pom.xml (उन 50+ में से) को इस ब्लॉक को बार-बार शामिल नहीं करना चाहता। मेरी पहली हालांकि settings.xmlफ़ाइल होगी, लेकिन ऐसा लगता है कि यह (डिजाइन द्वारा) वहां इसे परिभाषित करना संभव नहीं है। तो, पहला सवाल यह होगा कि ऐसा क्यों है? यदि यह संभव होगा तो मैं इसे maven2 वितरण में settings.xml में निर्दिष्ट कर सकता हूं, जिसे सभी डेवलपर्स को वितरित किया जा सकता है।

एकमात्र संभव समाधान जो मैंने पाया है वह एक संगठन-व्यापी मास्टर-पोम प्रोजेक्ट बनाना था, जिसमें ये सेटिंग्स हों, और अन्य सभी pom.xml <parent>टैग के माध्यम से इस मास्टर-पोम पर निर्भर करें । लेकिन मल्टी-मॉड्यूल बिल्ड में यह अजीब लगता है:

- master configuration POM (pm)
- Project 1 parent pom (p1 with module 1 and module 2 as modules)
    - Project 1 module pom (with pm as parent)
    - Project 2 module pom (with pm as parent)

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

एक समस्या मुझे मिली मावेन साइट पीढ़ी के साथ थी, जो कि इस सेटअप के साथ समस्या लगती है (यदि वे कोई प्रत्यक्ष बैक-रेफरेंस नहीं हैं तो मॉड्यूल सही तरीके से लिंक नहीं होते हैं)

तो, क्या यह एक वैध दृष्टिकोण है? समस्या का कोई अन्य, अधिक स्पष्ट, सरल समाधान?



5
@ ओआरडीआर: वे केवल एक परियोजना में इसे लिखना लिखते हैं। बिंदु यह है कि मैं इसके बारे में 500 बार डुप्लिकेट नहीं करना चाहता था ...
mglauche

1
समझा। मुद्दा लेना। जैसा कि उत्तर देने वाले ने कहा, आपके पास परियोजना के लिए एक मुख्य पोम हो सकता है, जिसमें 'डिस्ट्रीबिंगमन्गंट' शामिल होगा ...
ओएचडीआर

जवाबों:


144

इसके लिए सबसे अच्छा उपाय यह है कि आप अपने संगठन की सभी परियोजनाओं के लिए एक साधारण अभिभावक पोम फाइल प्रोजेक्ट (पैकेजिंग 'पोम' के साथ) बनाएं।

<?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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>your.company</groupId>
    <artifactId>company-parent</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <distributionManagement>
        <repository>
            <id>nexus-site</id>
            <url>http://central_nexus/server</url>
        </repository>
    </distributionManagement>

</project>

यह बनाया जा सकता है, जारी किया जा सकता है, और आपके स्थानीय सांठगांठ पर तैनात किया जा सकता है, ताकि सभी को इसकी कलाकृतियों तक पहुंच हो।

अब उन सभी परियोजनाओं के लिए जिन्हें आप इसका उपयोग करना चाहते हैं, बस इस खंड को शामिल करें:

<parent>
  <groupId>your.company</groupId>
  <artifactId>company-parent</artifactId>
  <version>1.0.0</version>
</parent>

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

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

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

- pom.xml (aggregator)
    - project-parent
    - project-module1
    - project-module2

आप इस संरचना के साथ क्या करते हैं, अपने मूल मॉड्यूल को एग्रीगेटर में शामिल करें और mvn installरूट डायरेक्टरी से सब कुछ बनाएं।

हम अपने संगठन में इस सटीक समाधान का उपयोग करते हैं और इसने समय की कसौटी पर खरा उतरा और हमारे लिए काफी अच्छा काम किया है।


यहां एक और जवाब है जहां मैं परियोजना की विरासत के बारे में अधिक विस्तार से वर्णन करता हूं और यह कैसे प्रबंधित करता है कि यह विरासत जटिलता है, दंड को क्षमा करें। ;) stackoverflow.com/questions/6347913
जेसी वेब

7
बस एक छोटा सा ध्यान दें: कारणों के लिए क्यों कंपनी माता पिता सबसे अच्छा समाधान है, चर्चा को देखें settings.xml में distributionManagement निर्दिष्ट नहीं कर सकते Maven उपयोगकर्ता की सूची से।
प्रेमाक ब्रेडा

क्लासिक परामर्श मॉडल में, जिसमें "क्लाइंट कोड का मालिक है", मेरी विकास टीम को प्रोजेक्ट ऑफ-साइट पर काम करना होगा और फिर ग्राहक-साइट के लिए नवीनतम कोड लेना होगा और इसे फिर से बनाना होगा। मेरी स्थिति में, मल्टी-मॉड्यूल प्रोजेक्ट के साथ काम करना, अगर मैं प्रोजेक्ट POM में कंपनी POM का संदर्भ देता हूं, तो मुझे ग्राहक के कंपनी POM को इंगित करने के लिए उस संदर्भ को अपडेट करना होगा। अगर मैं इसे मदद कर सकता हूं तो मैं सेटिंग में सभी पर्यावरण विशिष्ट सेटिंग्स को बनाए रखने का प्रयास करूंगा। मेरी स्थिति के लिए अनुशंसित दृष्टिकोण क्या है?
वेब उपयोगकर्ता

2
@WebUser आपकी समस्या एक ऐसी स्थिति की तरह लगती है, जहाँ आपको अपनी POM फ़ाइल में विभिन्न मूल्यों की आवश्यकता होती है, जो इस उत्तर पते के विपरीत है: कई मॉड्यूलों में डुप्लिकेट सेटिंग्स से परहेज। मुझे लगता है कि आपको settings.xml फ़ाइल के माध्यम से गुणों को इंजेक्ट करने का प्रयास करना चाहिए । अगर वह आपकी मदद नहीं करता है, तो एसओ पर एक नया प्रश्न पूछें, इसे यहां लिंक करें, और मैं आपकी सहायता करने का प्रयास करूंगा।
जेसी वेब

धन्यवाद @JesseWebb मैंने कोशिश की कि वह समाप्त हो जाए और यह उन मूल्यों को अलग करने के लिए उपयोगी है जो मैंने वर्णित स्थिति के लिए पोम से दूर हैं। अपनी आवश्यकताओं के लिए, मैंने सक्रिय प्रोफ़ाइल और पीओएम में हल किए गए लोगों के तहत प्रासंगिक गुण जोड़े।
वेब उपयोगकर्ता

36

माता-पिता POM की कोई आवश्यकता नहीं है।

आप पूरी तरह से अपने poms में वितरण प्रबंधन भाग को छोड़ सकते हैं और इसे या तो अपने बिल्ड सर्वर पर या settings.xml में सेट कर सकते हैं।

बिल्ड सर्वर पर करने के लिए, बस mvnकमांड को पास करें :

-DaltSnapshotDeploymentRepository=snapshots::default::https://YOUR_NEXUS_URL/snapshots
-DaltReleaseDeploymentRepository=releases::default::https://YOUR_NEXUS_URL/releases

देखें https://maven.apache.org/plugins/maven-deploy-plugin/deploy-mojo.html विवरण जो विकल्प सेट किया जा सकता है के लिए।

इसे अपने में सेट करना भी संभव है settings.xml

बस एक प्रोफ़ाइल बनाएं जो सक्षम है और जिसमें संपत्ति है।

उदाहरण सेटिंग। Xml:

<settings>
[...]
  <profiles>
    <profile>
      <id>nexus</id>
      <properties>
        <altSnapshotDeploymentRepository>snapshots::default::https://YOUR_NEXUS_URL/snapshots</altSnapshotDeploymentRepository>
        <altReleaseDeploymentRepository>releases::default::https://YOUR_NEXUS_URL/releases</altReleaseDeploymentRepository>
      </properties>
    </profile>
  </profiles>

  <activeProfiles>
    <activeProfile>nexus</activeProfile>
  </activeProfiles>

</settings>

सुनिश्चित करें कि "स्नैपशॉट" और "रिलीज़" के लिए क्रेडेंशियल <servers>आपकी सेटिंग्स के अनुभाग में हैं। xml

गुण altSnapshotDeploymentRepository और altReleaseDeploymentRepository को maven-तैनाती-प्लगइन संस्करण 2.8 के साथ पेश किया गया है। पुराने संस्करण त्रुटि संदेश के साथ विफल हो जाएंगे

Deployment failed: repository element was not specified in the POM inside distributionManagement element or in -DaltDeploymentRepository=id::layout::url parameter

इसे ठीक करने के लिए, आप प्लग-इन के नए संस्करण को लागू कर सकते हैं:

        <build>
          <pluginManagement>
            <plugins>
              <plugin>
                <artifactId>maven-deploy-plugin</artifactId>
                <version>2.8</version>
              </plugin>
            </plugins>
          </pluginManagement>
        </build>

मैं लगातार इस समाधान की कोशिश कर रहा हूं लेकिन केवल altDeploymentRepository संपत्ति काम करती है। altReleaseDeploymentRepository और altSnapshotDeploymentRepository को मान्यता नहीं दी गई है और मुझे यह त्रुटि मिली है: परिनियोजन विफल: वितरण तत्व के अंदर POM में रिपॉजिटरी तत्व निर्दिष्ट नहीं किया गया था या -DaltDeploymentRepository = id :: लेआउट :: url पैरामी। किसी भी सुझाव से मदद मिलेगी। धन्यवाद
Shabirmean

@ शब्बीरमैन कारण तैनाती प्लग-इन का बहुत पुराना संस्करण है। मैंने एक समाधान के साथ अपना उत्तर बढ़ाया है।
माइकल व्याराज़

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