Maven无法将YUICompressor插件压缩后的js/css文件放到输出文件夹
YUI Compressor Maven插件可以压缩/合并js或css文件,经常用在Maven项目中,但最近发现在wabapp中执行了 mvn install 命令进行发布之后,终端中显示插件已经执行了压缩的动作,但在输出文件夹或者war包中js和css文件都还是未压缩的原始文件。
项目./pom.xml文件相关内容如下:
代码如下 | |
<project> <!-- 定义全局的变量 --> <properties> <!-- 编译编码设定 --> <build.source.encoding>UTF-8</build.source.encoding> <!-- webapp source dir --> <webapp.src.dir>${basedir}/src/main/webapp</webapp.src.dir> <!-- 默认的js&css输出总目录 --> <yuicompressor.output.dir>${project.build.directory}/${project.build.finalName}</yuicompressor.output.dir> </properties> <build> <plugins> <plugin> <groupId>net.alchim31.maven</groupId> <artifactId>yuicompressor-maven-plugin</artifactId> <version>1.1</version> <!-- 对该插件整体的配置信息 --> <configuration> <!-- 设定编码 --> <encoding>${build.source.encoding}</encoding> <!-- 输出主目录 where to put the generate files --> <outputDirectory>${yuicompressor.output.dir}</outputDirectory> <!-- 待处理文件目录 directory where source files will be pulled from --> <sourceDirectory>${webapp.src.dir}</sourceDirectory> <webappDirectory>${yuicompressor.output.dir}</webappDirectory> <!-- 无前缀名,默认为min- --> <nosuffix>true</nosuffix> <!-- 强制压缩 defalut is false --> <force>true</force> <!-- [js only] Minify only, do not obfuscate. --> <nomunge>false</nomunge> <jswarn>false</jswarn> <failOnWarning>false</failOnWarning> <!-- 将不需要压缩的js或css文件放在packs文件夹下 --> <excludes> <exclude>**/all.js</exclude> <exclude>**/all.css</exclude> </excludes> <aggregations> <aggregation> <!-- insert new line after each concatenation (default: false) --> <insertNewLine>true</insertNewLine> </aggregation> </aggregations> </configuration> <!-- js compressor --> <executions> <execution> <id>jsfiles</id> <!-- Maven 3.x之后必须指定phase,默认为process-resources --> <phase>process-resources</phase> <goals> <goal>compress</goal> </goals> <configuration> <aggregations> <aggregation> <!-- the ultimate javascript file that is served up to the browser --> <output>${webapp.src.dir}/scripts/all.js</output> <!-- files to include, path relative to output's directory or absolute path --> <includes> <!-- 压缩的js列表 --> <include>scripts/a.js</include> <include>scripts/b.js</include> </includes> </aggregation> </aggregations> </configuration> </execution> <!-- css --> <execution> <id>cssfiles</id> <!-- Maven 3.x之后必须指定phase,默认为process-resources --> <phase>process-resources</phase> <goals> <goal>compress</goal> </goals> <configuration> <aggregations> <aggregation> <!-- the ultimate css file that is served up to the browser --> <output>${webapp.src.dir}/styles/all.css</output> <!-- files to include, path relative to output's directory or absolute path --> <includes> <include>styles/a.css</include> <include>styles/b.css</include> </includes> </aggregation> </aggregations> </configuration> </execution> </executions> </plugin> <!-- war --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.6</version> <configuration> <warSourceDirectory>${webapp.src.dir}</warSourceDirectory> <encoding>${build.source.encoding}</encoding> </configuration> </plugin> </plugins> </build> </project> |
这样执行 mvn install 命令之后发现虽然执行了压缩任务,但是在目标目录下和war包中的js和css文件都是未经过压缩的文件。经过分析应该是执行顺序的问题,即yuicompress是在process-resources阶段首先执行的,然后是war命令拷贝原始的资源文件到目标目录,这个时候就将前面压缩过的文件覆盖了。
于是将yuicompressor-maven-plugin中execution的phase修改为install,再执行 mvn install 命令之后发现最终目标目录中的js和css文件已经是压缩过的了,但是war包里面的还是未压缩的。顺便说一句,在maven 2.x不需要显示地指定phase的,3.x之后必须指定。将phase修改为install是将压缩的执行顺序放到最后阶段,也就是说复制资源文件在前,压缩在后,但在war包生成之后,因此war包中的js和css文件是未经过压缩的。
最终将yuicompressor-maven-plugin中execution的phase依然设置为process-resources,然后在maven-war-plugin中将js和css文件排除掉即可,即maven-war-plugin的配置修如下:
代码如下 | |
<!-- war --> |