Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get maven to build a war with minified files using yuicompressor-maven-plugin

Tags:

java

maven

minify

So I'm trying something I thought would be rather simple, I basically want maven to minify all my js and css files for me before building a war. My plugins look like this:

         <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <extensions>true</extensions>
            <version>1.0.0</version>
            <configuration>
                <manifestLocation>META-INF</manifestLocation>
                <instructions>
                    <Export-Package>!test.impl,test*</Export-Package>
                    <Import-Package>*</Import-Package>
                    <!--
                       add ,plugin.xml if it's present i.e.
                       src/main/resources,plugin.xml
                    -->
                    <Include-Resource>src/main/resources</Include-Resource>
                </instructions>
            </configuration>
        </plugin>

        <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>
                <nosuffix>true</nosuffix>
            </configuration>
        </plugin>

The problem is that the YUI plugin does correctly minify the files, but just before the war is built it looks like it copies over all the files from my main source directory and thus wipes out the changes the YUI plugin had done.

I'm calling maven by the following: mvn compile war:war. I've been playing around for awhile with different settings, but so far I haven't found a way around this.

What I would like is for just after the war has copied over the files it needed from the src directory it would run the YUI plugin, but I tried all the permutations of phases on the YUI plugin, but that didn't seem to make any difference.

I've googled around, but pretty much everything I've read so far seems to indiciate that I should just need to drop the YUI plugin in there like I have and everything should magically work. So far I haven't seem to have found the magic.

like image 344
Zipper Avatar asked Nov 06 '13 22:11

Zipper


People also ask

How do I create a war file in Maven?

Using the mvn:war:exploded command, we can generate the exploded WAR as a directory inside the target directory. This is a normal directory, and all the files inside the WAR file are contained inside the exploded WAR directory.

Why is Maven war plugin used?

The WAR Plugin is responsible for collecting all artifact dependencies, classes and resources of the web application and packaging them into a web application archive.

What is war packaging in Maven?

war packaging articulates a directory structure for web application to be deployed to a Servlet container. The directory structure that makes up a .war file is as follows: /META-INF. -> Meta related files. /WEB-INF.


2 Answers

as stated above maven-war-plugin overwrites files created by minify plugin. it seems that this cannot be changed. however wanted behavior may be achieved by simply changing project structure.

here example what I did with my project. I'm using minify-maven-plugin and spring framework, static files are stored in static directory.

1) move static directory from src/main/webapp to src/main/resources

2) change minify plugin config in pom.xml. so source points to resources and target points to classes:

<webappSourceDir>src/main/resources</webappSourceDir>
<webappTargetDir>target/classes</webappTargetDir>
<jsSourceDir>static</jsSourceDir>
<cssSourceDir>static</cssSourceDir>

3) change spring config. so spring is serving static files from class path:

<mvc:resources location="classpath:/static/" mapping="/static/**"/>

and now

mvn clean && mvn package

produces correct war with minified files inside /WEB-INF/classes/static

like image 183
yuliskov Avatar answered Oct 16 '22 12:10

yuliskov


The accepted answer doesn't work.

Much better is this answer (as pointed out by koga in his comment): https://stackoverflow.com/a/11495021/11451

Here is what I ended up doing:

Step 1: minify the css and js

<plugin>
    <groupId>com.samaxes.maven</groupId>
    <artifactId>minify-maven-plugin</artifactId>
    <version>1.7.2</version>
    <executions>
        <execution>
            <phase>prepare-package</phase>
            <goals>
                <goal>minify</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <charset>UTF-8</charset>
        <skipMerge>true</skipMerge>
        <cssSourceDir>resources</cssSourceDir>
        <jsSourceDir>resources</jsSourceDir>
        <jsEngine>CLOSURE</jsEngine>
        <nosuffix>true</nosuffix>
        <webappTargetDir>${project.build.directory}/minify</webappTargetDir>
        <cssSourceIncludes>
            <cssSourceInclude>**/*.css</cssSourceInclude>
        </cssSourceIncludes>
        <cssSourceExcludes>
            <cssSourceExclude>**/*.min.css</cssSourceExclude>
        </cssSourceExcludes>
        <jsSourceIncludes>
            <jsSourceInclude>**/*.js</jsSourceInclude>
        </jsSourceIncludes>
        <jsSourceExcludes>
            <jsSourceExclude>**/*.min.js</jsSourceExclude>
        </jsSourceExcludes>
    </configuration>
</plugin>

Step 2: overwrite css and js in the war with minified files

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <webResources>
            <resource>
                <directory>${project.build.directory}/minify</directory>
            </resource>
        </webResources>
    </configuration>
</plugin>
like image 20
Kristof Neirynck Avatar answered Oct 16 '22 12:10

Kristof Neirynck