2012-04-05 10:46 5376人阅读 评论(4) 收藏 举报
 分类:
Java(14)  Ant

版权声明:本文为博主原创文章,未经博主允许不得转载。

发布 JavaScript 的时候,无论从代码保护还是提高性能角度,都应该对代码进行压缩,去除重叠的空白分隔符,混淆变量。雅虎交互(YUI)提供了非常强大的压缩工具,对 .js 文件和 .css 文件都有效。这里所说明的情况,是用 Ant 直接启动压缩任务。

首先,需要准备二个 .jar 文件,分别是 YUIAnt.jar 和 yuicompressor-2.4.x.jar 。本帖发表日期是 2012-4-5 周四,最新版是 yuicompressor-2.4.7 。
YUIAnt.jar  下载地址 http://www.ubik-ingenierie.com/miscellanous/YUIAnt/
yuicompressor-2.4.x.jar 下载地址 http://www.julienlecomte.net/yuicompressor/

在 Ant 的构建过程描述文件(build.xml)中,可以参考如下例子来引入。

  1. <property name="dir.lib.yuicompress" value="lib"/><!-- 存放 YUI Compress 二个 .jar 文件的目录 -->
  2. <property name="dir.build.js" value="dist/webapp/js"/><!-- 存放压缩过的 JavaScript 文件目录 -->
  3. <property name="dir.build.css" value="dist/webapp/css"/><!-- 存放压缩过的 CSS 文件目录 -->
  4. <property name="dir.src.js" value="web/js"/><!-- JavaScript 源文件目录 -->
  5. <property name="dir.src.css" value="web/css"/><!-- CSS 源文件目录 -->
  6. <path id="path.build.classpath.yuicompress">
  7. <fileset dir="${dir.lib.yuicompress}">
  8. <include name="yuicompressor-2.4.2.jar"/>
  9. <include name="YUIAnt.jar"/>
  10. </fileset>
  11. </path>
  12. <target name="compres-js-css" description="压缩 .js 和 .css 文件">
  13. <taskdef name="compress" classname="com.yahoo.platform.yui.compressor.YUICompressTask">
  14. <classpath refid="path.build.classpath.yuicompress"/>
  15. </taskdef>
  16. <compress linebreak="150" warn="false" munge="yes"
  17. preserveallsemicolons="true" outputfolder="${dir.build.js}">
  18. <fileset dir="${dir.src.js}">
  19. <include name="**/*.js"/>
  20. </fileset>
  21. </compress>
  22. <compress linebreak="150" warn="false" munge="yes" charset="UTF-8"
  23. preserveallsemicolons="true" outputfolder="${dir.build.css}">
  24. <fileset dir="${dir.src.css}">
  25. <include name="**/*.css"/>
  26. </fileset>
  27. </compress>
  28. </target>

其中 <compress> 标签的 charset 参数的含义是指定输出文件的字符编码集。原版存在无法以指定字符编码集读取源文件的问题。所以我对此(com.yahoo.platform.yui.compressor.YUICompressTask)进行了改造。此改造方法为原创,经测试无误。

其实,原先的设计根本就没有考虑到源文件字符编码集的问题。首先我们为 <compress> 标签增加 encoding 这个属性,用来指定源文件的字符编码集。然后在读取文件的时候,用这个 Ant 构建文件中指定的 encoding 来打开文件输入流。所有改造都只针对 com/yahoo/platform/yui/compressor/YUICompressTask.Java 这一个文件。看了源文件,发现雅虎源代码的水平真是太不考究了……空格和 Tab 混用,行尾多余空白也不消除,空行也没有规范,注释也不指名调用顺序……不感叹了,下面是改写方法。

首先,要改变最开始的 import 部分。
原先的程序:

  1. import java.io.FileOutputStream;
  2. import java.io.FileReader;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.OutputStream;

改为无误:

  1. import java.io.FileOutputStream;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.InputStreamReader;
  5. import java.io.OutputStream;

第二,属性确认方法要增加对 encoding 未指定的支持,并根据 YUI 官方的提议,修改 charset 默认值得逻辑。在 validate() 方法中修改。
原先的程序:

  1. /**
  2. *
  3. */
  4. private void validate() {
  5. if(charset==null)
  6. {
  7. charset = System.getProperty("file.encoding");
  8. if(charset == null)
  9. {
  10. charset = "UTF-8";
  11. }
  12. }
  13. this.munge = (this.munge != null) ? munge : Boolean.FALSE;
  14. this.lineBreak = (this.lineBreak==null) ? new Integer(-1) : this.lineBreak;
  15. }

改为:

  1. /**
  2. * Set attribute default value.
  3. * Modified by Shane Loo Li at 2012-4-4 Wednesday
  4. */
  5. private void validate() {
  6. if (this.charset == null)
  7. {
  8. //this.charset = System.getProperty("file.encoding");
  9. /*
  10. * Modified by Shane Loo Li at 2012-4-5 Thursday.
  11. * In YUI Compressor 2.4.7, The development team think that 'UTF-8' is better than local
  12. * charset for the output file.
  13. */
  14. this.charset = this.charset != null ? this.charset : "UTF-8";
  15. }
  16. if (this.encoding == null)
  17. {
  18. this.encoding = System.getProperty("file.encoding");
  19. this.encoding = this.encoding != null ? this.encoding : "UTF-8";
  20. }
  21. this.munge = (this.munge != null) ? munge : Boolean.FALSE;
  22. this.lineBreak = (this.lineBreak==null) ? new Integer(-1) : this.lineBreak;
  23. }

其中三目运算符优先级低于比较运算,高于赋值运算,刚好不用加括号。

第三,源文件 185 行是打开源文件以读取,原来是这么写的:

  1. if(inputFile.getAbsolutePath().equals(outputFile.getAbsolutePath()))
  2. {
  3. log("Input and Output file are the same, creating a copy");
  4. tempFile = File.createTempFile("temp",
  5. inputFile.getName().substring(inputFile.getName().lastIndexOf(".")));
  6. log("Copying "+inputFile.getAbsolutePath() + " to " + tempFile.getAbsolutePath());
  7. copy(inputFile, tempFile);
  8. reader = new BufferedReader(new FileReader(tempFile));
  9. }
  10. else
  11. {
  12. reader = new BufferedReader(new FileReader(inputFile));
  13. }

改为:

  1. if(inputFile.getAbsolutePath().equals(outputFile.getAbsolutePath()))
  2. {
  3. log("Input and Output file are the same, creating a copy");
  4. tempFile = File.createTempFile("temp",
  5. inputFile.getName().substring(inputFile.getName().lastIndexOf(".")));
  6. log("Copying "+inputFile.getAbsolutePath() + " to " + tempFile.getAbsolutePath());
  7. copy(inputFile, tempFile);
  8. // Modified by Shane Loo Li a 2012-4-4 Wednesday to support different source file charset.
  9. reader = new BufferedReader(new InputStreamReader(new FileInputStream(tempFile), this.encoding));
  10. //reader = new BufferedReader(new FileReader(tempFile));
  11. }
  12. else
  13. {
  14. // Modified by Shane Loo Li a 2012-4-4 Wednesday to support different source file charset.
  15. reader = new BufferedReader(new InputStreamReader(new FileInputStream(inputFile), this.encoding));
  16. //reader = new BufferedReader(new FileReader(tempFile));
  17. }

这么更改是因为 FileReader 不提供用指定字符编码集读取,所以要换成别的打开方式。

第四,在文件前边有对象成员变量声明,增加

  1. private String encoding;

在文件后边有一组 getter 和 setter ,增加

  1. /**
  2. * @return the encoding
  3. */
  4. public String getEncoding() {
  5. return this.encoding;
  6. }
  7. /**
  8. * @param set the source file encoding
  9. */
  10. public void setEncoding(String encoding) {
  11. this.encoding = encoding;
  12. }

然后就可以了,编译一下,将编译出来的主 .class 替换掉原来 .jar 包中的 .class 文件,就可以用了。

以下提供源代码、.class 和 .jar 都改动了的合集。通过 CSDN 下载站上传。
http://download.csdn.net/detail/shanelooli/4200449

参考资料
用 Ant 调用 YUI Compressor : http://www.iteye.com/topic/368724
源文件字符集写死成 UTF-8 改造: http://moly.iteye.com/blog/718122

Ant 执行 YUICompressor的更多相关文章

  1. 使用Ant和YUICompressor链接合并压缩你的JS和CSS代码

    JS代码和CSS代码在上线前要压缩大家应该都是知道的了.记得之前做项目的时候,最后要交差的时候是找了个网站,将JS代码的文件一个一个地复制,粘贴,复制,粘贴. 当时就在想:TMD有没有好一点的方法,劳 ...

  2. Mac上使用jenkins+ant执行第一个程序

    本文旨在让同学们明白如何让jenkis在mac笔记本上运行,以模拟实际工作中在linux上搭建jenkins服务平台首先按照笔者的习惯先说一下如何安装jenkis和tomcat,先安装tomcat,在 ...

  3. Jenkins+Jmeter持续集成笔记(二:ANT执行Jmeter脚本)

    Jmeter接口测试脚本运行后生成的是jtl(xml)格式的文件,这些文件不具备可读性,所以我们要把他转化为可以阅读的html格式报告. Ant是一个功能强大的打包编译工具.我们使用他的目的是将xml ...

  4. 配置Ant执行Jmeter脚本

    1.将 jmeter下extras目录中ant-jmeter-1.1.1.jar包拷贝至ant安装目录下的lib目录中,否则会报错ant-jmeter-1.1.1不存在 2.在jmeter根目录下创建 ...

  5. 利用ant 执行jmeter用例生成html格式报告

    1.安装ant 2.准备jmeter 及用例文件.jmx 3.编辑ant 执行文件build.xml <?xml version="1.0" encoding="G ...

  6. 配置 Ant 执行 Jmeter 脚本

    1.将  Jmeter 下 extras 目录中 ant-jmeter-1.1.1.jar 包拷贝至 ant 安装目录下的lib目录中,否则会报错 ant-jmeter-1.1.1 不存在 2.创建 ...

  7. Ant执行一个含有main方法的class文件

    目前需要使用ant来执行一个含有main方法的class文件,并且需要通过命令来行传两个参数(start和end)到main方法. <target name="gsp" de ...

  8. ant 执行jmeter脚本

    环境准备 1.jdk版本:java version "1.8.0_201" 2.jmeter版本:5.0 3.ant版本:Apache Ant(TM) version 1.10.5 ...

  9. Ant执行Jmeter工程模版

    <?xml version="1.0" encoding="GB2312"?><project name="ant-jmeter-t ...

随机推荐

  1. 重要选择器querySelector和querySelectorAll

    他们的作用是根据 CSS 选择器规范,便捷定位文档中指定元素. 目前几乎主流浏览器均支持了他们.包括 IE8(含) 以上版本. Firefox. Chrome.Safari.Opera. queryS ...

  2. Mysql中的存储过程

    什么是存储过程 简单的说,就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法: ps:存储过程跟触发器有点类似,都是一组SQL集,但是存储过程是主动调用的,且功 ...

  3. 测试管理_下属谈话[持续更新ing]

    作为测试部门的管理者,在工作绩效评定.工作安排.工作问题提出等时候,都需要与下属进行面对面谈话,怎么进行有效的谈话,这是一个值得思考和锻炼的问题. 谈话的内容: 谈近阶段工作的回顾 谈工作中的困难(是 ...

  4. 异常处理——毕向东Java基础教程学习笔记

    1.异常:就是程序运行过程中出现的不正常情况. 异常的由来:问题本身也是日常生活中一个具体的事物,也可以通过java类的形式进行描述,并封装成对象.                        其实 ...

  5. JavaScript Patterns 2.11 Writing Comments

    Document all functions, their arguments and return values, and also any interesting or unusual algor ...

  6. mysql,sql server,oracle 唯一索引字段是否允许出现多个 null 值?

    最近一个项目,涉及到sql server 2008,因为业务需求,希望建立一个唯一索引,但是发现在sql server中,唯一索引字段不能出现多个null值,下面是报错信息: CREATE UNIQU ...

  7. 深入PHP内核之in_array

    无意中看到一段代码 1.a.php <?php $y="12"; $x = array(); for($j=0;$j<50000;$j++){ $x[]= " ...

  8. spring+mybatis多数据源切换

    在实际的公司项目中,很可能会遇到一个问题就是,一个java项目,但是项目中涉及两个数据库,这两个数据库还在不同IP的机子上. 遇到这种情况的时候,我们有两个选择 1.不走spring的aop方式,直接 ...

  9. ThinkPHP 获取get post参数与I方法

    传统方式获取变量 $id = $_GET['id']; // 获取get变量 $name = $_POST['name']; // 获取post变量 $value = $_SESSION['var'] ...

  10. cocos2d-x之物理引擎初试

    发现问题:监听代码部分不能在onEnter()段书写 bool HelloWorld::init() { if ( !Layer::init() ) { return false; } visible ...