2010-06-10 14 views
16

मैं मेंMaven स्ट्रिंग पाठ वेब संसाधन

src/मुख्य/webapp/textfilesdir

इस textfilesdir मैं इसे समझते हैं, पैकेज चरण के दौरान के रूप में पाठ फ़ाइलों के साथ एक Maven वेब अनुप्रयोग है बदलें निर्देशिका

लक्ष्य/परियोजना-1.0-स्नैपशॉट के रूप में कॉपी किया जायेगा

निर्देशिका है, जो तब एक

लक्ष्य/में ज़िप किया गया है परियोजना-1.0-SNAPSHOT.war

समस्या

अब, मैं पर एक स्ट्रिंग प्रतिस्थापन करने की जरूरत है लक्ष्य/परियोजना-1.0-SNAPSHOT/textfilesdir में टेक्स्ट फ़ाइलों की सामग्री। यह तब टेक्स्टफाइलडियर को लक्ष्य/प्रोजेक्ट-1.0-एसएनएपीएसएचओटी में कॉपी करने के बाद किया जाना चाहिए, लेकिन लक्ष्य/प्रोजेक्ट-1.0-SNAPSHOT.war फ़ाइल से पहले बनाया जा रहा है। मेरा मानना ​​है कि यह सब पैकेज चरण के दौरान किया जाता है।

प्लगइन (संभावित रूप से maven-antrun-plugin) कैसे कर सकता है, इसे करने के लिए पैकेज चरण में प्लग करें।

टेक्स्ट फ़ाइलों में फ़िल्टर करने के लिए $ {property-name} जैसी गुण नहीं हैं। स्ट्रिंग प्रतिस्थापन संभवतः एकमात्र विकल्प है।

विकल्प

  1. लक्ष्य/परियोजना 1.0-SNAPSHOT निर्देशिका में नकल के बाद पाठ फ़ाइलों को संशोधित, फिर भी युद्ध निर्माण से पहले।

  2. पैकेजिंग के बाद, WAR से टेक्स्ट फ़ाइलों को निकालें, उन्हें संशोधित करें, और उन्हें वापस WAR में जोड़ें।

मुझे लगता है कि यहां एक और विकल्प है जिसे मैं याद कर रहा हूं। किसी को विचार?

उत्तर

4

विकल्प 1 ऐसा करने योग्य नहीं है, prepare-package बहुत जल्दी है, package बहुत देर हो चुकी है इसलिए मुझे नहीं पता कि आप कोई कस्टम काम कहां प्लग कर सकते हैं। विकल्प 2 करने योग्य है लेकिन एक दर्दनाक आईएमओ है। तो यहां कुछ और प्रस्ताव हैं (सभी AntRun और ReplaceRegExp और/या Replace कार्यों पर आधारित हैं)।

समाधान 1:

  1. जहां पाठ फ़ाइलें संसाधित करने की आवश्यकता है कि डाल एक नया फ़ोल्डर बनाएँ।
  2. prepare-package पर एंटर प्लगइन को बांधें और फ़ाइलों को संसाधित करने के लिए इसे कॉन्फ़िगर करें और target (उदा। target/textfilesdir) के तहत संसाधित फ़ाइलों को कुछ निर्देशिका में डालें।
  3. को webResource के रूप में शामिल करने के लिए युद्ध प्लगइन को कॉन्फ़िगर करें। विवरण के लिए Adding and Filtering External Web Resources देखें।

समाधान 2:

  1. बाइंड prepare-package को antrun प्लगइन और इसे कॉन्फ़िगर src/main/webapp/textfilesdir से पाठ फ़ाइलों को प्रोसेस और target/project-1.0-SNAPSHOT में प्रोसेस की गई फ़ाइलें डाल करने के लिए।
  2. पहले संसाधित फ़ाइलों को बाहर करने के लिए युद्ध प्लगइन को कॉन्फ़िगर करें। फिर, विवरण के लिए Adding and Filtering External Web Resources देखें।

मुझे लगता है कि मैं दूसरे समाधान के लिए जाऊंगा।

+0

के रूप में आम तौर पर, मैं ग्रूवी बजाय चींटी एम्बेड करने के लिए gmaven (http://docs.codehaus.org/display/GMAVEN/Executing+Groovy+Code) का उपयोग करने का सुझाव देंगे, लेकिन अन्यथा मैं पूरी तरह से सहमत (+1) –

+0

@seanizer: मुझे और अधिक ग्रोवी सोचने की ज़रूरत है :) यह निश्चित रूप से यहां अच्छी तरह से खेलेंगे। –

+0

yup। जबकि मैं ग्रोवी ऐप (grails आदि) के निर्माण के बारे में बहुत पागल नहीं हूं, मुझे लगता है कि ग्रोवी पूरी तरह से एक स्क्रिप्टिंग भाषा के रूप में अंडररेड है –

1

आप Maven-replacer-प्लगइन का उपयोग कर सकते हैं:

<plugin> 
     <groupId>com.google.code.maven-replacer-plugin</groupId> 
     <artifactId>maven-replacer-plugin</artifactId> 
     <version>1.3.7</version> 
     <executions> 
      <execution> 
       <phase>prepare-package</phase> 
       <goals> 
        <goal>replace</goal> 
       </goals>     
      </execution> 
     </executions> 
     <configuration> 
      <file>target/${project.artifactId}-${project.version}/WEB-IN/site.xml</file> 
      <replacements> 
       <replacement> 
        <token>ear.version</token> 
        <value>${ear.version}-${maven.build.timestamp}</value> 
       </replacement>   
      </replacements> 
     </configuration> 
    </plugin> 

लेकिन तुम दो और चाल की जरूरत है। एक युद्ध प्लगइन के लिए विस्फोट लक्ष्य जोड़ रहा है:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-war-plugin</artifactId> 
    <version>2.1.1</version> 
     ..... 
     <executions> 
     <execution> 
     <phase>prepare-package</phase> 
      <goals> 
       <goal>exploded</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

और आखिरकार पैकेज से पहले एमवीएन को साफ करने की आवश्यकता है। आप अपने पोम से यह कर सकते हैं: आप Maven युद्ध प्लगइन नए से 2.0.1 के एक संस्करण का उपयोग कर रहे हैं, तो

    <plugin> 
        <artifactId>maven-clean-plugin</artifactId> 
        <version>2.4.1</version> 
        <executions> 
         <execution> 
         <id>auto-clean</id> 
         <phase>initialize</phase> 
         <goals> 
          <goal>clean</goal> 
         </goals> 
         </execution> 
        </executions> 
      </plugin> 

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

7

मुझे एक ही समस्या थी और मैं इस मुद्दे के साथ बहुत परेशान था, इसलिए मैं जवाब दूंगा हालांकि यह प्रश्न बहुत पुराना है। जैसा कि लिंड्रो और फिल ने कहा है, कोई भी मैवेन-रेप्सर-प्लगइन का उपयोग कर सकता है। लेकिन उनका समाधान मेरे लिए काम नहीं करता था। useCache को सक्षम करने से एक त्रुटि हुई जिसने परियोजना को बनाना असंभव बना दिया। इसके अतिरिक्त, मैं ऑटो-क्लीन चीज़ को ठीक से काम करने के लिए नहीं बना सकता।

सबसे पहले Maven-replacer-प्लग इन, कॉन्फ़िगर करें::

<plugin> 
    <groupId>com.google.code.maven-replacer-plugin</groupId> 
    <artifactId>maven-replacer-plugin</artifactId> 
    <version>1.3.7</version> 
    <executions> 
    <execution> 
     <phase>prepare-package</phase> 
     <goals> 
     <goal>replace</goal> 
     </goals> 
    </execution> 
    </executions> 
    <configuration> 
    <includes> 
     <include>target/${project.build.finalName}/static/**/*.css</include> 
    </includes> 
    <regex>false</regex> 
    <token>someString</token> 
    <value>replaceString</value> 
    </configuration> 
</plugin> 

इससे पहले कि वास्तविक युद्ध बनाया गया है मैं अभी तक पोस्ट पर टिप्पणी करने के लिए अनुमति नहीं कर रहा हूँ के रूप में, मैं अपना पूरा समाधान यहाँ प्रदान करेगा , हम एक विस्फोटित युद्ध बनाते हैं। इसका मतलब है, युद्ध फ़ाइल की पूरी सामग्री एक उप निर्देशिका में संग्रहीत है (जो डिफ़ॉल्ट रूप से लक्ष्य/$ {project.build.finalName} है)। उसके बाद, मैवेन-रेप्सर-प्लगइन फाइलों की सामग्री को बदल देगा जैसा हमने निर्दिष्ट किया है। अंत में, .war पैकेज चरण में default-war नौकरी द्वारा पैक किया जाएगा। विस्फोटित युद्ध फ़ोल्डर की सामग्री को ओवरराइड करने से बचने के लिए, किसी को उस निर्देशिका में warSourceDirectory सेट करना होगा जहां विस्फोटित युद्ध सामग्री संग्रहीत की जाती है।निम्नलिखित विन्यास स्निपेट इस काम करेगा:

<plugin> 
    <artifactId>maven-war-plugin</artifactId> 
    <version>2.1.1</version> 
    <executions> 
    <execution> 
     <id>prepare</id> 
     <phase>prepare-package</phase> 
     <goals> 
     <goal>exploded</goal> 
    </goals> 
    </execution> 
    <execution> 
     <id>default-war</id> 
     <phase>package</phase> 
     <goals> 
     <goal>war</goal> 
     </goals> 
     <configuration> 
     <warSourceDirectory>${project.build.directory}/${project.build.finalName}</warSourceDirectory> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

प्रतिस्थापित सामग्री के साथ पैकेज mvn clean package

+0

शानदार, धन्यवाद। – user467257

3

का उपयोग कर रहा चरणों के साथ एक समस्या थी, तैयार-पैकेज का उपयोग बनाया जा सकता है युद्ध पर फ़ाइल की प्रतिलिपि नहीं , मेरे समाधान यह था:

Maven युद्ध प्लगइन में इस विन्यास जोड़े

<plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-war-plugin</artifactId> 
       <version>2.1.1</version> 
     <executions> 
      <execution> 
       <phase>prepare-package</phase> 
       <goals> 
        <goal>exploded</goal> 
       </goals> 
      </execution> 
      <executions> 
       <configuration> 
       <webResources> 
        <resource> 
         <directory>${basedir}/WebContent?</directory> <excludes> 
       <!--Exclude the file because it is copied using the maven replacer plugin --> 
         <exclude>/style.scss</exclude> 
         </excludes> 
        </resource> 
       </webResources> 
      </configuration> 
      </plugin> 
      Add the configuration to replacer 
<plugin> 
     <groupId>com.google.code.maven-replacer-plugin</groupId> 
     <artifactId>replacer</artifactId> 
     <version>1.5.1</version> 
     <executions> 
      <execution> 
       <id>scss-replacement</id> <phase>prepare-package</phase> <goals> 
       <goal>replace</goal> 
       </goals> <configuration> 
       <file>WebContent?/css/style.scss</file> 
       <!-- My local file(WebContent?/css/style.scss) have a param 
       $url: "http://localhost:8080/interface"; 
       --> <!-- regex with match to $url: "http://localhost:8080/interface"; --> 
       <token>\$url:.</token> 
       <!-- Replace to --> 
       <value>\$url: "www.myapplication.com.br/css/style.css";</value> 
       <outputFile>target/app/css/style.scss</outputFile> 

       </configuration> 
      </execution> 
    <executions> 
<plugin> 

आउटपुट फ़ाइल फ़ाइल को ओवरराइट नहीं करती है, इसलिए मैंने फ़ाइल style.scss को बाहर करने के लिए कॉन्फ़िगरेशन मेवेन-वॉर-प्लगइन डाला है। अलविदा!

2

मुझसे एक और समाधान, पार्टी के लिए देर हो जाने के लिए खेद है लेकिन अभी भी कुछ लोगों के लिए उपयोगी हो सकता है। ऊपर दिए गए समाधान ने मेरे लिए काम नहीं किया क्योंकि मेरे पास जगह पर ओवरले थे और इसलिए मुख्य स्रोत में replacer प्लगइन का उपयोग करना मुश्किल था। इसलिए, मैंने तैयार-पैकेज चरण में मेरे लिए अस्थायी निर्देशिका उत्पन्न करने के लिए मैवेन-वॉर-प्लगइन का उपयोग किया और इसके प्रतिलिपि बनाने के लिए प्रतिलिपि प्लगइन है और उस निर्देशिका से युद्ध जारी कर दिया है ताकि कुछ और इसके साथ ओवरराइड न हो।

 <plugin> 
    <artifactId>maven-war-plugin</artifactId> 
    <executions> 
     <execution> 
     <id>prepare</id> 
     <phase>prepare-package</phase> 
     <goals> 
      <goal>exploded</goal> 
     </goals> 
     <configuration> 
      <webappDirectory>${project.build.directory}/${project.build.finalName}-patched/</webappDirectory> 
     </configuration> 
     </execution> 
     <execution> 
     <id>default-war</id> 
     <phase>package</phase> 
     <goals> 
      <goal>war</goal> 
     </goals> 
     <configuration> 
      <useCache>true</useCache> 
      <warSourceDirectory>${project.build.directory}/${project.build.finalName}-patched/</warSourceDirectory> 
     </configuration> 
     </execution> 
    </executions> 
    </plugin> 
    <plugin> 
    <groupId>com.google.code.maven-replacer-plugin</groupId> 
    <artifactId>replacer</artifactId> 
    <executions> 
     <execution> 
     <phase>prepare-package</phase> 
     <goals> 
      <goal>replace</goal> 
     </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <file>${project.build.directory}/${project.build.finalName}-patched/fileToBeChanged.txt</file> 
     <token>ValueToChange</token> 
     <value>ValueToReplace</value> 
    </configuration> 
    </plugin> 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^