सवाल संस्करण संख्या को टेक्स्ट फ़ाइल में आउटपुट करने के लिए मेवेन का उपयोग करना


मैं एक ज़िप फ़ाइल जेनरेट करना चाहता हूं जो मैवेन के साथ एक एप्लीकेशन अपडेट करेगा। ज़िप को सर्वर पर होस्ट किया जाएगा और मैं ज़िप उत्पन्न करने के लिए असेंबली प्लगइन का उपयोग कर रहा हूं। हालांकि मैं मैवेन को स्वचालित रूप से एक टेक्स्ट फ़ाइल जेनरेट करना चाहता हूं जो ज़िप के बाहर वर्तमान संस्करण संख्या को संग्रहीत करता है। क्या यह संभव है?

संपादित करें: मैंने दो कस्टम असेंबली बनाने के लिए मैवेन असेंबली प्लगइन और दो डिस्क्रिप्टर का उपयोग करके इसे सफलतापूर्वक किया। एक में एक निर्देशिका-एकल लक्ष्य होता है और यह फ़िल्टरिंग के आधार पर अद्यतन संस्करण.txt के साथ एक फ़ोल्डर बनाता है। फिर एक ही लक्ष्य वाला दूसरा व्यक्ति वास्तव में ज़िप फ़ाइल को संकुल करता है। यह बहुत ही सुरुचिपूर्ण प्रतीत होता है और मुझे लगता है कि यह पूरी तरह से अद्यतन फ़ोल्डर के साथ मेवेन रेपो की तारीख ठीक से ऊपर नहीं होगा। अगर ऐसा करने का एक बेहतर तरीका है तो कृपया मुझे बताएं।


44
2017-08-20 15:03


मूल




जवाब:


ज़रूर। कहीं भी src / main / संसाधनों में एक टेक्स्ट फ़ाइल बनाएं, इसे कॉल करें version.txt (जो कुछ भी)

फ़ाइल सामग्री:

${project.version}

अब अपने pom.xml में, बिल्ड तत्व के अंदर, इस ब्लॉक को रखें:

<build>
  <resources>
    <resource>
      <directory>src/main/resources</directory>
      <filtering>true</filtering>
      <includes>
        <include>**/version.txt</include>
      </includes>
    </resource>
    <resource>
      <directory>src/main/resources</directory>
      <filtering>false</filtering>
      <excludes>
        <exclude>**/version.txt</exclude>
      </excludes>
    </resource>
    ...
  </resources>
</build>

प्रत्येक निर्माण के बाद, फ़ाइल (जिसे आप लक्ष्य / कक्षाओं में पा सकते हैं) में वर्तमान संस्करण होगा।

अब अगर आप फ़ाइल को कहीं और स्वचालित रूप से स्थानांतरित करना चाहते हैं, तो आपको संभवतः एक चींटी कार्य निष्पादित करने की आवश्यकता होगी Maven-antrun-प्लगइन

कुछ इस तरह:

  <build>
    ...
    <plugins>
      <plugin>
        <artifactId>maven-antrun-plugin</artifactId>
         <version>1.4</version>
         <executions>
          <execution>
            <phase>process-resources</phase>
            <configuration>
               <tasks>
                 <copy file="${project.build.outputDirectory}/version.txt"
                   toFile="..." overwrite="true" />
              </tasks>
            </configuration>
            <goals>
              <goal>run</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
   </plugins>
 </build>

77
2017-08-20 15:18



किसी कारण से पहला ब्लॉक संस्करण / लक्ष्य में संस्करण को प्रतीत नहीं करता है। यदि मैं version.txt बनाता हूं तो कोड का दूसरा ब्लॉक काम करता प्रतीत होता है। - sanz
क्या आपकी परियोजना एक वेबपैप है? फिर संसाधन फ़िल्टरिंग थोड़ा अलग काम करता है। मैं कुछ मिनटों में अपना जवाब अपडेट करूंगा (रात्रिभोज पहले) :-) - Sean Patrick Floyd
@SeanPatrickFloyd क्या आप यह बताने के लिए दिमाग में होंगे कि मुझे फ़िल्टरिंग की आवश्यकता क्यों है = इसमें शामिल करने के लिए गलत और फ़िल्टरिंग = गलत है? इसका क्या मतलब है? - Karussell
@ करसुसेल का मतलब है कि जब आप हर संसाधन को फ़िल्टर नहीं करना चाहते हैं तो आपको दो अलग-अलग रनों की आवश्यकता होती है, एक फिल्टरिंग के साथ, बिना किसी के। और किसी एक रन में जो शामिल है उसे स्पष्ट रूप से दूसरे में शामिल करने की आवश्यकता है - Sean Patrick Floyd
आपको फ़ाइल को एक अलग ऑपरेशन के साथ स्थानांतरित करने की आवश्यकता नहीं है। आप निर्दिष्ट कर सकते हैं <targetPath>। - Adam


मानक का प्रयोग करें META-INF\MANIFEST.MF (फिर आप जावा कोड का उपयोग कर सकते हैं getClass().getPackage().getImplementationVersion() संस्करण प्राप्त करने के लिए)

.War के लिए इस कॉन्फ़िगरेशन का उपयोग करें:

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.1</version>
    <configuration>
        <archive>                   
            <manifest>
                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
            </manifest>
        </archive>
    </configuration>
</plugin>

यह निर्माण के दौरान प्रकट होगा, या आप कॉल कर सकते हैं mvn war:manifest

यह भी देखें टोमकैट चलाने पर पैकेज संस्करण कैसे प्राप्त करें?


11
2018-03-11 03:09





आप जो संदर्भ दे रहे हैं उसे बुलाया जाता है छानने

आपको किसी विशेष संसाधन पर फ़िल्टरिंग सक्षम करने की आवश्यकता है, और उसके बाद उपयोग करें ${project.version} जो आपके निर्माण के हिस्से के रूप में प्रतिस्थापित किया जाएगा


10
2017-08-20 15:16





आप संस्करण जानकारी फ़ाइल बनाने के लिए ग्रूवी स्क्रिप्ट का भी उपयोग कर सकते हैं। मुझे यह विधि अधिक पसंद है क्योंकि आपको असेंबली-प्लगइन के डिस्क्रिप्टर में सामान को बाहर करने की आवश्यकता नहीं है। यदि आप जेनकींस / हडसन (उदाहरण के लिए oug BUILD_ID आदि ...) से बना रहे हैं तो आप वैकल्पिक रूप से उपलब्ध सामानों को वैकल्पिक रूप से उपलब्ध कराने के लिए इस विधि का उपयोग भी कर सकते हैं।

तो आपके पास pom.xml में फ़ाइल-जनरेटिंग ग्रोवी स्क्रिप्ट होगी जैसे:

  <plugin>
    <groupId>org.codehaus.mojo.groovy</groupId>
    <artifactId>groovy-maven-plugin</artifactId>
    <version>1.0-beta-3</version>
    <executions>
      <execution>
        <phase>test</phase>
        <goals>
          <goal>execute</goal>
        </goals>
        <configuration>
          <source>
        <![CDATA[
        println("==== Creating version.txt ====");
        File mainDir = new File("src/main");
        if(mainDir.exists() && !mainDir.isDirectory()) {
            println("Main dir does not exist, wont create version.txt!");
            return;
        }
        File confDir = new File("src/main/conf");
        if(confDir.exists() && !confDir.isDirectory()) {
            println("Conf dir is not a directory, wont create version.txt!");
            return;
        }
        if(!confDir.exists()) {
            confDir.mkdir();
        }
        File versionFile = new File("src/main/conf/version.txt");
        if(versionFile.exists() && versionFile.isDirectory()) {
            println("Version file exists and is directory! Wont overwrite");
            return;
        }
        if(versionFile.exists() && !versionFile.isDirectory()) {
            println("Version file already exists, overwriting!");
        }
        println("Creating Version File");
        BufferedWriter writer = new BufferedWriter(new FileWriter(versionFile));

        writer.write("groupId = ${project.groupId}");
        writer.newLine();
        writer.write("artifactId = ${project.artifactId}");
        writer.newLine();
        writer.write("version = ${project.version}");
        writer.newLine();
        writer.write("timestamp = ${maven.build.timestamp}");

        String buildTag = "";
        String buildNumber = "";
        String buildId = "";
        try {
            buildTag = "${BUILD_TAG}";
            buildNumber = "${BUILD_NUMBER}";
            buildId = "${BUILD_ID}";

            writer.write("BUILD_TAG = " + buildTag + "\n");
            writer.write("BUILD_NUMBER = " + buildNumber + "\n");
            writer.write("BUILD_ID = " + buildId + "\n");

        } catch (Exception e) {
            println("============= Could not find BUILD_TAG probably this is not a Jenkins/Hudson build ===========");
        }

        writer.close();
        ]]>
          </source>
        </configuration>
      </execution>
    </executions>
  </plugin>

और फिर pom.xml में आपकी असेंबली प्लगइन प्लगइन जो इस तरह दिखेगा:

  <plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2.1</version>
    <!-- Produce the all-dependencies-included jar for java classloaders -->
    <executions>
      <execution>
        <id>all</id>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
        <configuration>
          <finalName>${project.artifactId}</finalName>
          <descriptors>
            <descriptor>dist-all.xml</descriptor>
          </descriptors>
        </configuration>
      </execution>
    </executions>
  </plugin>

और अंततः आपकी असेंबली डिस्क्रिप्टर dist-all.xml इस तरह दिखेगा:

<?xml version="1.0" encoding="UTF-8"?>
<assembly>
  <id>all</id>
  <formats>
    <format>dir</format>
    <format>zip</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <fileSets>
    <fileSet>
      <directory>target</directory>
      <outputDirectory></outputDirectory>
      <includes>
        <include>*.jar</include>
      </includes>
    </fileSet>
    <fileSet>
      <directory>src/main/conf</directory>
      <outputDirectory></outputDirectory>
      <includes>
        <include>**</include>
      </includes>
    </fileSet>
  </fileSets>
</assembly>

7
2017-08-12 07:08





मेवेन 3 में, प्रयोग करें शॉन का जवाब अपना बनाने के लिए version.txt फ़ाइल, (मेरा निर्माण तिथि और सक्रिय प्रोफ़ाइल के साथ यहां दिखाया गया है):

${project.version}-${profileID}
${buildDate}

संपत्ति जोड़ना profileID प्रोफाइल में से प्रत्येक के लिए, उदा .:

<properties>
    <profileID>profileName</profileID>
</properties>

फ़ाइल को प्रतिलिपि बनाने के लिए फ़ाइल को कॉपी करने के लिए मैवेन कॉपी-संसाधनों का उपयोग करें ${basedir} या ${basedir}/target:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <version>3.0.2</version>
    <executions>
        <execution>
            <id>copy-resources</id>
            <phase>validate</phase>
            <goals>
                <goal>copy-resources</goal>
            </goals>
            <configuration>
                <outputDirectory>${basedir}</outputDirectory>
                <resources>
                    <resource>
                        <directory>${basedir}/target/.../[version.txt dir]/version.txt</directory>
                        <includes>
                            <include>version.txt</include>
                        </includes>
                        <filtering>true</filtering>
                    </resource>
                </resources>
            </configuration>
        </execution>
    </executions>
</plugin>

आउटपुट इस तरह दिखता है:

1.2.3-profileName
yymmdd_hhmm

6
2018-06-30 22:35



मुझे निम्न कॉन्फ़िगरेशन जोड़ने की आवश्यकता है, इसलिए यह पूरक है: <config> <delimiters> <delimiter> $ {*} </ delimiter> </ delimiters> </ config> जैसा कि निम्न पोस्ट में इंगित किया गया है: stackoverflow.com/questions/5340361/... - grails-coder


मैंने बस एक चींटी कार्य के साथ ऐसा किया।

<echo file="version.txt">${project.version}</echo>

1
2017-07-10 22:05



यह पूरी फाइल को प्रतिस्थापित करेगा। - Jerad Rutnam


एक संभावना है कि सभी परियोजना गुणों को निर्मित किया जाए .jar का उपयोग करते हुए maven-properties-plugin
फिर आप मानक का उपयोग करके इन गुणों को पढ़ सकते हैं (हालांकि बहुत व्यावहारिक नहीं) जावा गुण API

        <!-- Build properties to a file -->
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>properties-maven-plugin</artifactId>
            <version>1.0.0</version>
            <executions>
                <execution>
                    <phase>generate-resources</phase>
                    <goals> <goal>write-project-properties</goal> </goals>
                    <configuration>
                        <outputFile> ${project.build.outputDirectory}/build.properties </outputFile>
                    </configuration>
                </execution>
            </executions>
        </plugin>

इस दृष्टिकोण से सावधान रहें क्योंकि यह उन संपत्तियों को रिसाव कर सकता है जिन्हें प्रकाशित नहीं किया जाना चाहिए, यहां से भी settings.xml


0
2018-04-23 11:32