Ant 执行 YUICompressor

Ant 执行 YUICompressorAnt执行YUICompressor任务压缩JavaScript和CSS文件,解决中文乱码问题,增加源文件字符编码集设定标签:javascriptantcss任务encodingnull2012-04-0510:465376人阅读评论(4)收藏举报分类:Java(14)Ant版权声明:本文为博主原创文章,未经博主允许…

大家好,又见面了,我是你们的朋友全栈君。

 

Ant 执行 YUICompressor 任务压缩 JavaScript 和 CSS 文件,解决中文乱码问题,增加源文件字符编码集设定

标签: javascriptantcss任务encodingnull

Ant 执行 YUICompressor 分类:
Java(14) 
Ant 执行 YUICompressor 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)中,可以参考如下例子来引入。

[html] 
view plain  
copy

 

 
print
?

  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.   
  7. <path id=“path.build.classpath.yuicompress”>  
  8.     <fileset dir=“${dir.lib.yuicompress}”>  
  9.         <include name=“yuicompressor-2.4.2.jar”/>  
  10.         <include name=“YUIAnt.jar”/>  
  11.     </fileset>  
  12. </path>  
  13.   
  14. <target name=“compres-js-css” description=“压缩 .js 和 .css 文件”>    
  15.     <taskdef name=“compress” classname=“com.yahoo.platform.yui.compressor.YUICompressTask”>  
  16.         <classpath refid=“path.build.classpath.yuicompress”/>  
  17.     </taskdef>  
  18.     <compress linebreak=“150” warn=“false” munge=“yes”  
  19.             preserveallsemicolons=“true” outputfolder=“${dir.build.js}”>  
  20.         <fileset dir=“${dir.src.js}”>  
  21.             <include name=“**/*.js”/>  
  22.         </fileset>  
  23.     </compress>  
  24.     <compress linebreak=“150” warn=“false” munge=“yes” charset=“UTF-8”  
  25.             preserveallsemicolons=“true” outputfolder=“${dir.build.css}”>  
  26.         <fileset dir=“${dir.src.css}”>  
  27.             <include name=“**/*.css”/>  
  28.         </fileset>  
  29.     </compress>  
  30. </target>  

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

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

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

[java] 
view plain  
copy

 

 
print
?

  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;  

改为无误:

[java] 
view plain  
copy

 

 
print
?

  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() 方法中修改。
原先的程序:

[java] 
view plain  
copy

 

 
print
?

  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.   
  14.     this.munge = (this.munge != null) ? munge : Boolean.FALSE;  
  15.     this.lineBreak = (this.lineBreak==null) ? new Integer(-1) : this.lineBreak;       
  16. }  

改为:

[java] 
view plain  
copy

 

 
print
?

  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 行是打开源文件以读取,原来是这么写的:

[java] 
view plain  
copy

 

 
print
?

  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. }  

改为:

[java] 
view plain  
copy

 

 
print
?

  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 不提供用指定字符编码集读取,所以要换成别的打开方式。

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

[java] 
view plain  
copy

 

 
print
?

  1. private String encoding;  

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

[java] 
view plain  
copy

 

 
print
?

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

然后就可以了,编译一下,将编译出来的主 .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

转载于:https://www.cnblogs.com/developer-ios/p/6047262.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/161202.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月18日 下午1:46
下一篇 2022年7月18日 下午1:46


相关推荐

  • linux下tomcat8安装详解(附图解步骤)

    linux下tomcat8安装详解(附图解步骤)Linux下Tomcat8的安装配置安装tomcat前首先要安装对应的jdk并配置Java环境。一、环境准备jdk版本:1.8工具:xShell5xftp5说明:本文是通过Xshell5工具远程连接Linux操作,原理一样.二、安装步骤1、下载安装包官网下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downlo…

    2022年6月2日
    38
  • 基本字符串压缩

    基本字符串压缩题目 利用字符重复出现的次数 编写一个方法 实现基本的字符串压缩功能 比如 字符串 aabcccccaaa 经压缩会变成 a2b1c5a3 若压缩后的字符串没有变短 则返回原先的字符串 给定一个 stringiniStr 为待压缩的串 长度小于等于 3000 保证串内字符均由大小写英文字母组成 返回一个 string 为所求的压缩后或未变化的串 思路 咋一分析 题目还是很简单的

    2025年7月17日
    6
  • [Vue warn]: Do not use built-in or reserved HTML elements as component id: content「建议收藏」

    [Vue warn]: Do not use built-in or reserved HTML elements as component id: content「建议收藏」一、错误在Vue中引入组件报错:[Vue warn]: Do not use built-in or reserved HTML elements as component id: content二:原因在vue里面不允许用特殊的标签来做自定义的标签比如你不能用a来接收一个组件的注册然后在以自定义标签的方式引用会被限制三、结果方法将冲突的content替换成‘v-content…

    2022年6月13日
    43
  • display:flex属性

    display:flex属性我眼中的弹性盒子 display flex 意思是弹性布局 弹性布局简直不要太好用 今天就来和大家具体讲讲它的属性和用法吧 flex 的属性 以下五个属性语法都是加在父元素身上的 一 1 flex direction row 布局的排列方向 主轴排列方向 row 默认值 显示为行 方向为当前文档水平流方向 默认情况下是从左往右 row reverse

    2026年3月16日
    1
  • 联合体(union)的使用方法及其本质

    联合体(union)的使用方法及其本质有些基础知识快淡忘了,所以有必要复习一遍,在不借助课本死知识的前提下做些推理判断,温故知新。1.联合体union的基本特性——和struct的同与不同union,中文名“联合体、共用体”,在某种程度上类似结构体struct的一种数据结构,共用体(union)和结构体(struct)同样可以包含很多种数据类型和变量。不过区别也挺明显:结构体(struct)中所有变量是“共存”的…

    2022年6月2日
    41
  • RegisterStartupScript 用法

    RegisterStartupScript 用法ClientScript.RegisterStartupScript方法有3个重载:1:RegisterStartupScript(Page,String,String)向ScriptManager控件注册一个启动脚本块并将该脚本块添加到页面中。需要向第三个参数添加脚本标签。第一个参数为页面Page。第二个脚本函数的名字,随便起。第三个是形式的脚本内容。2:RegisterS

    2022年7月20日
    14

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号