原创

Java使用YUI Compressor压缩JS/CSS文件

首先介绍一下YUI Compressor,它是一个用来压缩JSCSS文件的工具,采用Java开发。JavaScript和CSS缩小的目标是始终保持代码的操作质量,同时减少其整体字节占用,YUI Compressor设计为100%安全的JavaScript分选程序,并且比大多数其他工具具有更高的压缩比。与JSMin相比,YUI Library 的测试节省了20%以上(HTTP压缩后为10%)。YUI Compressor还可以通过使用Isaac Schlueter的基于正则表达式的CSS minifier 的端口来压缩CSS文件。,下面为大家分享一下使用yuicompressor压缩js文件和压缩css文件。


YUI Compressor官方网址:http://yui.github.io/yuicompressor/

Maven repository中央仓库下载yuicompressor-2.4.8.jar最新版,利用yuicompressor-2.4.8.jar包通过命令的方法实现压缩Js和压缩CSS: 

//压缩JS文件

java -jar yuicompressor-2.4.8.jar --type js --charset utf-8 -v tmp.js > packed.js 

//压缩CSS文件 

java -jar yuicompressor-2.4.8.jar --type css --charset utf-8 -v tmp.css > packed.css 


Java中使用yuicompressor压缩js文件,(yuicompressor压缩css文件,比较简单此处省略,有问题可留言)具体实现代码如下:

public void jscompress(HttpServletResponse response,String content,String type) throws IOException {
    Reader in = new InputStreamReader(IOUtils.toInputStream(content));  
    JavaScriptCompressor compressor = new JavaScriptCompressor(in, new ErrorReporter() {  
        public void warning(String message, String sourceName,  
            int line, String lineSource, int lineOffset) {  
            if (line < 0) {  
                System.err.println("/n[WARNING] " + message);  
            } else {  
                System.err.println("/n[WARNING] " + line + ':' + lineOffset + ':' + message);  
            }  
        }  
        public void error(String message, String sourceName,  
          int line, String lineSource, int lineOffset) {  
            if (line < 0) {  
                System.err.println("/n[ERROR] " + message);  
            } else {  
                System.err.println("/n[ERROR] " + line + ':' + lineOffset + ':' + message);  
            }  
        }  
        public EvaluatorException runtimeError(String message, String sourceName,  
           int line, String lineSource, int lineOffset) {  
            error(message, sourceName, line, lineSource, lineOffset);  
            return new EvaluatorException(message);  
        }  
    });  
    if(type!=null && type.equals("yui")){
        compressor.compress(response.getWriter(), -1, true, false, false, false); 
    }else if(type!=null && type.equals("pack")){//普通压缩
        compressor.compress(response.getWriter(), 0, true, false, false, false); 
    }
}


在运行时抛出“java.lang.StringIndexOutOfBoundsException: String index out of range: 17”异常,具体日志如下:

java.lang.StringIndexOutOfBoundsException: String index out of range: 17
at java.lang.String.substring(String.java:1907)
at com.yahoo.platform.yui.compressor.JavaScriptCompressor.printSourceString(JavaScriptCompressor.java:269)
at com.yahoo.platform.yui.compressor.JavaScriptCompressor.parse(JavaScriptCompressor.java:333)
at com.yahoo.platform.yui.compressor.JavaScriptCompressor.<init>(JavaScriptCompressor.java:536)
at com.yoodb.tools.compress.CompressController.jscompress(CompressController.java:74)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)


解决方法:

pom.xml文件中增加如下内容,排除rhino依赖,用于解决“java.lang.StringIndexOutOfBoundsException”异常:

<dependency>
<groupId>com.yahoo.platform.yui</groupId>
<artifactId>yuicompressor</artifactId>
<version>2.4.8</version>
<exclusions>
<exclusion>
   <groupId>rhino</groupId>
   <artifactId>js</artifactId>
</exclusion>
  </exclusions>
</dependency>


注意:

避免js文件中出现中文,或者通过其他途径解决中文问题,否则抛出“org.mozilla.javascript.EvaluatorException”异常,具体日志如下:

org.mozilla.javascript.EvaluatorException: Compilation produced 1 syntax errors.
at com.yoodb.tools.compress.CompressController$1.runtimeError(CompressController.java:95)
at org.mozilla.javascript.Parser.parse(Parser.java:396)
at org.mozilla.javascript.Parser.parse(Parser.java:340)
at com.yahoo.platform.yui.compressor.JavaScriptCompressor.parse(JavaScriptCompressor.java:315)
at com.yahoo.platform.yui.compressor.JavaScriptCompressor.<init>(JavaScriptCompressor.java:536)
at com.yoodb.tools.compress.CompressController.jscompress(CompressController.java:75)

评论

  1. #1

    Jerry (2017/09/29 14:45:32)回复
    哈哈,没事多学学技术有助于提升技术水平,不要没事瞎玩。

  2. #2

    路人甲 (2017/09/29 17:41:25)回复
    YUI Compressor是一个用来压缩JS和CSS文件的工具,工具确实不错,建议大家感兴趣的看一看。

  3. #3

    (2017/09/29 10:38:39)回复
    很喜欢你的文章,开阔了我的眼界,对我很有帮助,希望以后多多发表!

分享:

支付宝

微信