2011-05-20 8 views
14

मेरे पास एक जावास्क्रिप्ट फ़ाइल है जिसका उपयोग Google Analytics का उपयोग करके ईवेंट ट्रैक करने के लिए किया जाता है। मैंने स्टेजिंग और उत्पादन पर्यावरण के लिए अलग-अलग खाते बनाए हैं। जीए कोड का आह्वान करने के लिए स्क्रिप्ट में मेरे खाता आईडी के लिए एक प्लेसहोल्डर है। खाता आईडी को फ़िल्टर फ़ाइलों में निर्दिष्ट किया गया है। मेवेन-युद्ध प्लगइन में वेब स्रोत स्रोत का उपयोग करके, हम अंतिम WAR फ़ाइल में संपत्ति को सफलतापूर्वक प्रतिस्थापित करने में सक्षम हैं।मैवेन का उपयोग करके फ़िल्टर की गई जावास्क्रिप्ट फ़ाइल को कैसे छोटा करें?

अब, हम अपने सभी जावास्क्रिप्ट फ़ाइलों को कम करने और एकत्रित करने के लिए मेवेन-युइकोम्प्रेसर प्लगइन का भी उपयोग कर रहे हैं। समस्या यह है कि यदि मैं संकुल चरण में न्यूनतम लक्ष्य के निष्पादन को संलग्न करता हूं, तो जावास्क्रिप्ट को कम करने से पहले WAR बनाया गया है। यदि मैं पहले कुछ भी न्यूनतम लक्ष्य को संलग्न करता हूं, तो फ़िल्टर को अमान्य फ़ाइल बनाने के खनन के समय तक लागू नहीं किया गया है।

तो, मैं फ़िल्टर किए गए जेएस फ़ाइलों की प्रतिलिपि बनाने और WAR फ़ाइल बनाने के लिए WAR प्लगइन के बीच न्यूनतम लक्ष्य चलाने के लिए एक तरीका ढूंढ रहा हूं।

  <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>2.1.1</version> 
      <configuration> 
       <webResources> 
       <resource> 
        <directory>src/main/webapp/js</directory> 
        <targetPath>js</targetPath> 
        <filtering>true</filtering> 
       </resource> 
       </webResources> 
      </configuration> 
      </plugin> 
      <plugin> 
      <groupId>net.alchim31.maven</groupId> 
      <artifactId>yuicompressor-maven-plugin</artifactId> 
      <version>1.1</version> 
      <executions> 
       <execution> 
       <goals> 
        <goal>compress</goal> 
       </goals> 
       <phase>package</phase> 
       </execution> 
      </executions> 
      <configuration> 
       <linebreakpos>-1</linebreakpos> 
       <nosuffix>true</nosuffix> 
       <force>true</force> 
       <aggregations> 
       <aggregation> 
        <output>${project.build.directory}/${project.build.finalName}/js/mysite-min.js</output> 
        <inputDir>${project.build.directory}/${project.build.finalName}/js</inputDir> 
        <includes> 
        <include>jquery-1.4.2.js</include> 
        <include>jquery-ui.min.js</include> 
        <include>ga-invoker.js</include> 
        </includes> 
       </aggregation> 
       </aggregations> 
      </configuration> 
      </plugin> 
+0

इसे 'तैयार-पैकेज' से बांध सकते हैं? –

+0

जैसा कि मैंने पहले उल्लेख किया था, पैकेज चरण से पहले कुछ भी जोड़ना काम नहीं कर रहा है क्योंकि तब तक फ़िल्टर लागू नहीं किया गया है। युद्ध प्लगइन वेब संसाधनों की प्रतिलिपि बनाता है और पैकेज चरण के हिस्से के रूप में फ़िल्टर को लागू करता है। – Chandranshu

उत्तर

6

आप src में फ़िल्टर js फ़ाइलें रख सकते हैं/मुख्य/संसाधन/फ़िल्टर्ड-js, जो process-resources को बांधता प्लगइन बजाय संसाधनों, का उपयोग करें, तो बात: यहाँ मेरी pom.xml के प्रासंगिक हिस्सों के साथ target/classes/filtered-js पर maven-war-plugin की webresources कॉन्फ़िगरेशन?

+1

आपने मुझे जवाब पोस्ट करने के लिए पीटा है। मैंने कल कुछ ऐसा किया था। मैंने yuicompressor प्लगइन प्रक्रिया-संसाधन चरण से जुड़ा हुआ है जो डिफ़ॉल्ट है लेकिन लक्ष्य/जेएस पर जाने के लिए इसके आउटपुट को कॉन्फ़िगर किया गया है। तब मैंने इस निर्देशिका की सामग्री को फ़िल्टर करने के लिए मैवेन-वॉर प्लगइन के वेब रेसॉर्ड्स कॉन्फ़िगरेशन का उपयोग किया और उन्हें लक्ष्य//js में रखा। अभी भी अपने उत्तर को सही के रूप में चिह्नित करना होगा। कैश-बस्टिंग के लिए – Chandranshu

9

महान प्रश्न, artbristol द्वारा महान anwser, जिसे मैंने वोट दिया। इसने मेरी बहुत मदद की। भविष्य में संदर्भ के लिए मैं पोस्ट एक पूर्ण समाधान:

  • src/main/resources/js में अपने जावास्क्रिप्ट फ़ाइलों रखो (या जो भी अपनी आवश्यकताओं फिट बैठता है)
  • संसाधन प्लगइन है src/main/resources/css में अपने सीएसएस फ़ाइलों रखो (या जो भी अपनी आवश्यकताओं फिट बैठता है) target/classes/js/
  • Yui करने के लिए अपने जावास्क्रिप्ट संसाधनों और उन्हें प्रतियां छानने src/main/webapp
  • को लक्ष्य/वर्गों/js पर फ़ाइलों उठा/और एकत्रित करता है जिसकी उन्हें आपसाथ अपने स्थापना का परीक्षण कर सकते। जेट्टी पैकेज चरण में src/main/webapp
  • युद्ध प्लगइन में संकुचित और एकत्रित फ़ाइलों उठा src/main/webapp के तहत अपनी फ़ाइलें उठा
  • वैकल्पिक .svnignore या src/main/webapp में .cvsignore फाइल की तरह एक फ़ाइल एससीएम उपेक्षा डाल अपने पसंदीदा एससीएम उपकरण से all.js बाहर करने के लिए ।

स्रोत/मुख्य/संसाधनों और src/main/webapp में कुछ भी संपीड़ित करने से बचने के लिए खंड को आवश्यक है। Yui बस एकीकरण के लिए पहले से ही फ़िल्टर की गई पिकअप चाहिए।

<build> 
    <resources> 
     <resource> 
      <directory>src/main/resources</directory> 
      <filtering>true</filtering> 
     </resource> 
    </resources> 
    <plugins> 
     <plugin> 
      <groupId>net.alchim31.maven</groupId> 
      <artifactId>yuicompressor-maven-plugin</artifactId> 
      <version>1.1</version> 
      <executions> 
       <execution> 
        <goals> 
         <goal>compress</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
       <excludes> 
        <exclude>*/*</exclude> 
       </excludes> 
       <force>true</force> 
       <nosuffix>true</nosuffix> 
       <removeIncluded>true</removeIncluded> 
       <aggregations> 
        <aggregation> 
         <insertNewLine>true</insertNewLine> 
         <output>${project.basedir}/src/main/webapp/js/all.js</output> 
         <includes> 
          <include>${project.build.directory}/classes/js/file1.js</include> 
          <include>${project.build.directory}/classes/js/file2.js</include> 
        </aggregation> 
        <aggregation> 
         <insertNewLine>true</insertNewLine> 
         <output>${project.basedir}/src/main/webapp/css/all.css</output> 
         <includes> 
          <include>${project.build.directory}/classes/css/file1.css</include> 
          <include>${project.build.directory}/classes/css/file2.css</include> 
        </aggregation> 
       </aggregations> 
      </configuration> 
     </plugin> 

आप सीएसएस फ़ाइलों को फ़िल्टर करना क्यों चाहते हैं?

मैं इसका इस्तेमाल इस

div.header { 
    background-image: url(/img/background.${project.version}.png) 
} 

मेरी सीएसएस फ़ाइलों में Maven अपने प्रोजेक्ट संस्करण फिल्टर की तरह अपनी छवियों संदर्भ के लिए।हमारे imageserver पर कोई भेजे अनुरोध इस

protected void doHttpFilter (HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException 
{ 
    String uri = request.getRequestURI(); 
    if (isStaticRequest(uri)) 
    { 
     String uriWithoutVersion = stripVersionString(uri); 
     String versionRequested = getVersionString(uri); 
     if (version.equals(versionRequested)) 
     { 
      response.setHeader(CACHE_CONTROL_HEADER_NAME, CACHE_CONTROL_HEADER_VALUE); 
      response.setHeader(EXPIRES_HEADER_NAME, EXPIRES_HEADER_VALUE); 
     } 
     RequestDispatcher dispatcher = request.getRequestDispatcher(uriOhneVersionsnummer); 
     dispatcher.forward(request, response); 
    } else { 
     chain.doFilter(request, response); 
     return; 
    } 
} 

इस तरह ब्राउज़र हमेशा के लिए प्रत्येक फ़ाइल कैश तरह फ़िल्टर किया जाता है। लेकिन जब मैं एक नया संस्करण अपलोड करता हूं तो सभी फ़ाइल संदर्भ में एक नया संस्करण संख्या होती है, इसलिए ब्राउज़र फिर से छवि या सीएसएस ला रहा है। इससे हमें यातायात को कम करने में बहुत मदद मिली।

2

मैं जावास्क्रिप्ट और सीएसएस फ़ाइलों को संपीड़ित करने के लिए मेवेन मिनीफ़ाई प्लगइन का उपयोग कर रहा हूं। यह भी विलीन हो जाती है एक ही file.This में इन फ़ाइलों को एक ब्राउज़र कैश solution.This के रूप में इन फाइल करने के लिए एक unque प्रत्यय डाल करने के लिए ठीक

मैं का इस्तेमाल किया है Maven-टाइमस्टैम्प प्लगइन काम कर रहा है भी ठीक

बात काम कर रहा है मैं अटक गया हूं कि निर्माण निष्पादन समय पर बनाए गए नए लोगों के साथ जेएस और सीएसएस के सभी संदर्भों को कैसे बदला जाए।

मैं इसके लिए मैवेन-प्रतिस्थापन-प्लगइन में देख रहा हूं। यह सभी उदाहरणों को हटा सकता है। यह नए मानों के साथ प्रतिस्थापित कर सकता है। लेकिन मुझे नए मर्ज किए गए-मिनीफाइड जेएस और सीएसएस के एक उदाहरण को रखने की जरूरत है।

<plugins> 
    <plugin> 
    <groupId>com.keyboardsamurais.maven</groupId> 
    <artifactId>maven-timestamp-plugin</artifactId> 
    <version>1.0</version> 
    <configuration> 
    <propertyName>timestamp</propertyName> 
    <timestampPattern>ddMMyyyyHHmm</timestampPattern> 
    </configuration> 
    <executions> 
    <execution> 
     <goals> 
     <goal>create</goal> 
     </goals> 
    </execution> 
    </executions> 
    </plugin> 
    <plugin> 
    <artifactId>maven-resources-plugin</artifactId> 
    <version>2.5</version> 
    <executions> 
    <execution> 
     <id>copy-resources</id> 
     <!-- here the phase you need --> 
     <phase>validate</phase> 
     <goals> 
     <goal>copy-resources</goal> 
     </goals> 
     <configuration> 
     <outputDirectory>${basedir}/target/resources/themes</outputDirectory> 
     <resources> 
     <resource> 
     <includes> 
      <include>**/*.vm</include> 
     </includes> 
     <directory>${basedir}/src/main/resources/themes</directory> 
     <filtering>true</filtering> 
     </resource> 
     </resources> 
     </configuration> 
    </execution> 
    </executions> 
    </plugin> 
    <plugin> 
    <groupId>com.samaxes.maven</groupId> 
    <artifactId>maven-minify-plugin</artifactId> 
    <version>1.3.5</version> 
    <executions> 
    <execution> 
     <id>default-minify</id> 
     <phase>process-resources</phase> 
     <configuration> 
     <cssSourceDir>../resources/themes/XXXX/default/template-resources/stylesheet</cssSourceDir> 
     <cssSourceIncludes> 
     <cssSourceInclude>**/*.css</cssSourceInclude> 
     </cssSourceIncludes> 
     <cssFinalFile>style.css</cssFinalFile> 
     <jsSourceDir>../resources/themes/XXXX/default/template-resources/js</jsSourceDir> 
     <jsSourceIncludes> 
     <jsSourceInclude>*.js</jsSourceInclude> 
     </jsSourceIncludes> 
     <jsSourceFiles> 
     <jsSourceFile>/libs/json.js</jsSourceFile> 
     </jsSourceFiles> 
     <jsFinalFile>script.js</jsFinalFile> 
     <suffix>-${timestamp}</suffix> 
     </configuration> 
     <goals> 
     <goal>minify</goal> 
     </goals> 
    </execution> 
    </executions> 
    </plugin> 
    <plugin> 
    <groupId>com.google.code.maven-replacer-plugin</groupId> 
    <artifactId>replacer</artifactId> 
    <version>1.5.0</version> 
    <executions> 
    <execution> 
     <phase>prepare-package</phase> 
     <goals> 
     <goal>replace</goal> 
     </goals> 
    </execution> 
    </executions> 
    <configuration> 
    <includes> 
     <include>target/resources/themes/XXXX/default/templates/velocity/**/*.vm</include> 
    </includes> 
    <replacements> 
     <replacement> 
     <token><![CDATA[<link rel="stylesheet" href="/storefront/template-resources/stylesheet/]]>([a-zA-Z0-9\-\_]*.css)<![CDATA[" type="text/css"/>]]>([])</token>  
     <value></value> 
     </replacement> 
     <replacement> 
     <token><![CDATA[<link rel="stylesheet" href="/storefront/template-resources/stylesheet/powerreviews]]>([a-zA-Z0-9\-\_]*.css)<![CDATA[" type="text/css"/>]]></token>  
     <value></value> 
     </replacement> 

     <replacement> 
     <token><![CDATA[<script type="text/javascript" src="/storefront/template-resources/js/]]>([a-zA-Z0-9\-\_\.]*.js)<![CDATA["></script>]]></token> 
     <value></value> 
     </replacement> 
     <replacement> 
     <token><![CDATA[<script type="text/javascript" src="/storefront/template-resources/js/libs/]]>([a-zA-Z0-9\-\_\.]*.js)<![CDATA["></script>]]></token> 
     <value></value> 
     </replacement> 
    </replacements> 
    </configuration> 
    </plugin> 
    <plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <executions> 
    <execution> 
     <id>dist</id> 
     <goals> 
     <goal>single</goal> 
     </goals> 
     <phase>package</phase> 
     <configuration> 
     <descriptors> 
     <descriptor>src/main/assembly/assembly.xml</descriptor> 
     </descriptors> 
     </configuration> 
    </execution> 
    </executions> 
    </plugin> 
    </plugins> 
+0

, आप टाइमस्टैम्प की बजाय एमडी 5 चेकसम का उपयोग करना चाह सकते हैं। टाइमस्टैम्प के साथ, जब भी आप जेएस और सीएसएस बदलते हैं, भले ही आप किसी भी समय बिल्ड करते हैं तो आपका कैश अमान्य हो जाएगा। – Chandranshu

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

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