6

I am using YUI Compressor to compress the JS files in my web app.

I have configured the plugin as indicated on the plugin's site.

This is the POM plugin conf:

   <plugin>
    <groupId>net.sf.alchim</groupId>
    <artifactId>yuicompressor-maven-plugin</artifactId>
    <version>0.7.1</version>  
    <executions>
      <execution>
     <phase>compile</phase>
        <goals>
         <goal>jslint</goal>
          <goal>compress</goal>
        </goals>
      </execution>
    </executions>        
    <configuration>
    <failOnWarning>true</failOnWarning>
      <nosuffix>true</nosuffix>
      <force>true</force>
      <aggregations>
       <aggregation>
          <!-- remove files after aggregation (default: false) -->
          <removeIncluded>false</removeIncluded>
          <!-- insert new line after each concatenation (default: false) -->
          <insertNewLine>false</insertNewLine>
          <output>${project.basedir}/${webcontent.dir}/js/compressedAll.js</output>
          <!-- files to include, path relative to output's directory or absolute path-->
          <!--inputDir>base directory for non absolute includes, default to parent dir of output</inputDir-->
          <includes>                
            <include>**/autocomplete.js</include>
            <include>**/calendar.js</include>
            <include>**/dialogs.js</include>
            <include>**/download.js</include>
            <include>**/folding.js</include>
            <include>**/jquery-1.4.2.min.js</include>
            <include>**/jquery.bgiframe.min.js</include>
            <include>**/jquery.loadmask.js</include>
            <include>**/jquery.printelement-1.1.js</include>
            <include>**/jquery.tablesorter.mod.js</include>
            <include>**/jquery.tablesorter.pager.js</include>
            <include>**/jquery.dialogs.plugin.js</include>
            <include>**/jquery.ui.autocomplete.js</include>                
            <include>**/jquery.validate.js</include>  
            <include>**/jquery-ui-1.8.custom.min.js</include>
            <include>**/languageDropdown.js</include>
            <include>**/messages.js</include>
            <include>**/print.js</include>
            <include>**/tables.js</include>
            <include>**/tabs.js</include>
            <include>**/uwTooltip.js</include>
          </includes>
          <!-- files to exclude, path relative to output's directory-->

        </aggregation>
      </aggregations>
    </configuration>
    <dependencies>
         <dependency> 
 <groupId>rhino</groupId>  
  <artifactId>js</artifactId>       
  <scope>compile</scope>  
  <version>1.6R5</version> 
</dependency>  
<dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-plugin-api</artifactId>
        <version>2.0.7</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-project</artifactId>
        <version>2.0.7</version>
        <scope>provided</scope>
    </dependency><dependency>
        <groupId>net.sf.retrotranslator</groupId>
        <artifactId>retrotranslator-runtime</artifactId>
        <version>1.2.9</version>
        <scope>runtime</scope>
    </dependency>

    </dependencies>
  </plugin>

And here is the log at compress time:

These will use the artifact files already in the core ClassRealm instead, to allow them to be included in PluginDescriptor.getArtifacts().


[DEBUG] Configuring mojo 'net.sf.alchim:yuicompressor-maven-plugin:0.7.1:jslint' 
[DEBUG]   (f) failOnWarning = true
[DEBUG]   (f) jswarn = true
[DEBUG]   (f) outputDirectory = C:\test\target\classes
[DEBUG]   (f) project = MavenProject: com.test.test1:test2:19-SNAPSHOT @ C:\test\pom.xml
[DEBUG]   (f) resources = [Resource {targetPath: null, filtering: false, FileSet {directory: C:\test\src,
 PatternSet [includes: {}, excludes: {**/*.class, **/*.java, site/*}]}}]
[DEBUG]   (f) sourceDirectory = C:\test\src\..\js
[DEBUG]   (f) warSourceDirectory = C:\test\src\main\webapp
[DEBUG]   (f) webappDirectory = C:\test\target\test2-19-SNAPSHOT
[DEBUG] -- end configuration --
[INFO] [yuicompressor:jslint {execution: default}]
[INFO] nb warnings: 0, nb errors: 0
[DEBUG] Configuring mojo 'net.sf.alchim:yuicompressor-maven-plugin:0.7.1:compress' -->
[DEBUG]   (f) removeIncluded = false
[DEBUG]   (f) insertNewLine = false
[DEBUG]   (f) output = C:\test\WebContent\js\compressedAll.js
[DEBUG]   (f) includes = [**/autocomplete.js, **/calendar.js, **/dialogs.js, **/download.js, **/folding.js, **/jquery-1.4.2.min.js, **/jquery.bgifram
e.min.js, **/jquery.loadmask.js, **/jquery.printelement-1.1.js, **/jquery.tablesorter.mod.js, **/jquery.tablesorter.pager.js, **/jquery.dialogs.p
lugin.js, **/jquery.ui.autocomplete.js, **/jquery.validate.js, **/jquery-ui-1.8.custom.min.js, **/languageDropdown.js, **/messages.js, **/print.js, *
*/tables.js, **/tabs.js, **/uwTooltip.js]
[DEBUG]   (f) aggregations = [net.sf.alchim.mojo.yuicompressor.Aggregation@65646564]
[DEBUG]   (f) disableOptimizations = false
[DEBUG]   (f) encoding = Cp1252
[DEBUG]   (f) failOnWarning = true
[DEBUG]   (f) force = true
[DEBUG]   (f) gzip = false
[DEBUG]   (f) jswarn = true
[DEBUG]   (f) linebreakpos = 0
[DEBUG]   (f) nomunge = false
[DEBUG]   (f) nosuffix = true
[DEBUG]   (f) outputDirectory = C:\test\target\classes
[DEBUG]   (f) preserveAllSemiColons = false
[DEBUG]   (f) project = MavenProject: com.test.test1:test2:19-SNAPSHOT @ C:\test\pom.xml
[DEBUG]   (f) resources = [Resource {targetPath: null, filtering: false, FileSet {directory: C:\test\src,
 PatternSet [includes: {}, excludes: {**/*.class, **/*.java, site/*}]}}]
[DEBUG]   (f) sourceDirectory = C:\test\src\..\js
[DEBUG]   (f) statistics = true
[DEBUG]   (f) suffix = -min
[DEBUG]   (f) warSourceDirectory = C:\test\src\main\webapp
[DEBUG]   (f) webappDirectory = C:\test\target\test2-19-SNAPSHOT
[DEBUG] -- end configuration --
[INFO] [yuicompressor:compress {execution: default}]
[INFO] generate aggregation : C:\test\WebContent\js\compressedAll.js
[INFO] compressedAll.js (407505b)
[INFO] nb warnings: 0, nb errors: 0
[DEBUG] Configuring mojo 'org.apache.maven.plugins:maven-resources-plugin:2.2:testResources' -->
[DEBUG]   (f) filters = []
[DEBUG]   (f) outputDirectory = C:\test\target\test-classes
[DEBUG]   (f) project = MavenProject: com.test.test1:test2:19-SNAPSHOT @ C:\test\pom.xml
[DEBUG]   (f) resources = [Resource {targetPath: null, filtering: false, FileSet {directory: C:\test\test
, PatternSet [includes: {}, excludes: {**/*.class, **/*.java}]}}]
[DEBUG] -- end configuration --

The problem is, although the files are getting aggregated into one file, it's happening without compression.

The link above uses version 1.1 and the plugin version I am using is 0.7.1. Is this going to make any difference?

Can someone tell what is wrong here?

PS: I have obfuscated some text in the log to follow the compliance rules of my firm, so you may find mismatches in some places.

SOLO
  • 868
  • 9
  • 19
hanumant
  • 1,091
  • 4
  • 15
  • 27
  • I'm having a similar issue. The"minified" files retain all their line breaks. Concatenation works, though. Very odd... – Benxamin Oct 03 '12 at 23:09
  • This case may have solution but the plugin version 1.5.1 has a bug because it cannot be configured for some simple cases. Say we want to configure webappDirectory and sourceDirectory. If sourceDirectory is configured different from the default then the plugin executes compression twice once with the configured value and then with the default value which defeats the purpose of sourceDirectory configuration. I haven't been able to compress from a directory that had to have changes made before compression. – user250343 Aug 22 '20 at 15:47

4 Answers4

5

From what I read, you don't configure the place from where js file should be checked or compressed (as you don't use the default configuration). You only configure the aggregation.

For quicker response used the issue tracker of yuicompressor-maven-plugin

The solution (copy/paste from project FAQ )

Because :

  • you set <nosuffix>true</nosuffix>

  • your script in under src/main/webapp and maven-war-plugin copy every files from src/main/webapp to target (regardless timestamp,...) and make the war (in the same execution).

Workarounds :

  • move your script dir out from webapp

    <plugin>
      <groupId>@project.groupId@</groupId>
      <artifactId>yuicompressor-maven-plugin</artifactId>
      ...
      <configuration>
        <!-- default ${project.build.sourceDirectory}/../js == src/main/js -->
        <sourceDirectory>src/main/javascript</sourceDirectory>
    
  • OR exclude "scripts" from the list of files to copy

    <!-- adapted from https://github.com/davidB/yuicompressor-maven-plugin/blob/master/src/it/demo01/pom.xml -->
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-war-plugin</artifactId>
      <configuration>
        <warSourceExcludes>scripts/**</warSourceExcludes>
      </configuration>
    </plugin>
    
jmventar
  • 687
  • 1
  • 11
  • 32
David Bernard
  • 1,560
  • 13
  • 15
2

I know this post is very old, but I came across the same thing and this is what I found. Hopefully this will help someone else as well.

This is tricky. This has to do with the nosuffix config option. If you remove the nosuffix option, the minification works as expected.

If you really have to have nosuffix then you need to change the execution phase to "package".

    <executions>
      <execution>
        <phase>package</phase>
          <goals>
    ......
    .....

Any phase before prepare-resources doesn't work because when the war is built, it picks up the js from the original source location and thereby overwrites the minified js (created during prepare-resources phase) in the target directory.

Minification works when you remove nosuffix because during package phase, the file names are different, so there is no over-writing of the files and you will see both the minified and non-minified js files in your target directory.

At least that's my understanding.

Inxsible
  • 700
  • 5
  • 27
  • 1
    In this case you have the minified in the webapp dir but not in the generated .war file (check the content, the war plugin run before (copy + archive in a single pass). You have to exclude file from the copy : see https://github.com/davidB/yuicompressor-maven-plugin/wiki/FAQ – David Bernard Mar 15 '13 at 15:41
  • 1
    you are right. I actually ended up fixing it by adding a in the yuicompressor plugin and then adding that same directory as a resource in the maven-war-plugin. ` true false ${project.build.directory}/min` – Inxsible Mar 15 '13 at 21:30
0

Can you try defining separate execution for jslint and compress and see if that works?

<executions>
    <execution>
        <goals>
            <goal>jslint</goal>         
        </goals>
        <configuration> ... </configuration>
    </execution>
    <execution>
        <goals>
            <goal>compress</goal>         
        </goals>
        <configuration> ... </configuration>
    </execution>
</executions>
Raghuram
  • 51,854
  • 11
  • 110
  • 122
  • Executed as two different executions. But no luck still the same situation. – hanumant Oct 01 '10 at 05:04
  • Removed jslint goal from pom and only executed compress to see if it works. Result is no, the compression is not working just aggregating. – hanumant Oct 01 '10 at 06:38
0

The YUI compressor (included as a dependency in this maven plugin) uses a "patched" version of Mozilla Rhino for:

  • interpreting javascript
  • compressing local variables names (the "patch")

By adding yourself the dependency to Rhino (in your previous question), I think these "patches" are overwritten, turning this maven plugin into something useless: the name-compressing, spaces-deleting behaviours are gone.

So remove rhino from your pom, and go back to solving your first problem!

Community
  • 1
  • 1
Brian Clozel
  • 56,583
  • 15
  • 167
  • 176