入口函数在CommandLineRunner里面,其中调用了MyCheckUnreachableCode_tijiao的MyCheckUnreachableCode方法,来检查一些不可达代码,程序在eclipse中配置好参数运行正常。但是将源码打包后(打包工具用的这个开源项目自身写好的一个build.xml文件,直接用ant build而成),如果不加参数会提示usge()的内容,但是一旦加了一个参数就会报:D:\my coder\closure-compiler\build>java -jar compiler.jar test.js
test.js
Exception in thread "main" java.lang.RuntimeException: INTERNAL COMPILER ERROR.
Please report this problem.
null
        at com.google.common.base.Preconditions.checkState(Preconditions.java:129)
        at com.google.javascript.jscomp.NodeTraversal.pushScope(NodeTraversal.java:523)
        at com.google.javascript.jscomp.NodeTraversal.traverse(NodeTraversal.java:248)
        at com.google.javascript.jscomp.NodeTraversal.traverse(NodeTraversal.java:422)
        at com.google.javascript.jscomp.MyCheckUnreachableCode_tijiao.MyCheckUnreachableCode(MyCheckUnreachableCode_tijiao.java:37)
        at com.google.javascript.jscomp.CommandLineRunner.main(CommandLineRunner.java:206)
Caused by: java.lang.IllegalStateException
        ... 6 more其中com.google.common.base.Preconditions.checkState是源码中的一个jar包,完全没有更改过,并且打完后的jar包中也有这个class;com.google.javascript.jscomp.NodeTraversal.pushScope和com.google.javascript.jscomp.NodeTraversal.traverse是MyCheckUnreachableCode中间接用到的方法。
想不通为什么在eclipse下面可运行而打包后会报这个错误,还请大家多多提宝贵意见!~
(两个主要类如下:)
public class CommandLineRunner  {
    public static String                 inputJSFileName;
    
    private static List<String> processArgs(String[] args) {
        // Args4j has a different format that the old command-line parser.
        // So we use some voodoo to get the args into the format that args4j
        // expects.
        Pattern argPattern = Pattern.compile("(--[a-zA-Z_]+)=(.*)");
        Pattern quotesPattern = Pattern.compile("^['\"](.*)['\"]$");
        List<String> processedArgs = Lists.newArrayList();        for (String arg : args) {
            Matcher matcher = argPattern.matcher(arg);
            if (matcher.matches()) {
                processedArgs.add(matcher.group(1));                String value = matcher.group(2);
                Matcher quotesMatcher = quotesPattern.matcher(value);
                if (quotesMatcher.matches()) {
                    processedArgs.add(quotesMatcher.group(1));
                } else {
                    processedArgs.add(value);
                }
            } else {
                processedArgs.add(arg);
            }
        }
        return processedArgs;
    }    /**
     * Runs the Compiler. Exits cleanly in the event of an error.
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        if(args.length <= 0){
            usge();
        }
        List<String> processedArgs = processArgs(args);
        for(String argList: processedArgs){
            System.out.println(argList);
            inputJSFileName=argList;
           MyCheckUnreachableCode_tijiao CheckUnreachableCode_tijiao = new MyCheckUnreachableCode_tijiao();
            String message = CheckUnreachableCode_tijiao.MyCheckUnreachableCode("test2.js");//这里出现了问题!
            System.out.print(message);
        }
    }    private static void usge() {
        // TODO Auto-generated method stub
        System.out.print("The command format shoule be: filename.js");
    }
}public class MyCheckUnreachableCode_tijiao {    public static String                 inputJSFileName;
    private static final CompilerOptions options        = new CompilerOptions();
    private static int                   num            = 0;    MyCheckUnreachableCode_tijiao(){
    }    public String MyCheckUnreachableCode(String JSFileName) throws IOException {
        inputJSFileName = JSFileName;
        StringBuffer warningMessage = new StringBuffer();
        Compiler compiler = new Compiler();
        Node rootNode = compiler.parse(JSSourceFile.fromFile(inputJSFileName));
        options.checkUnreachableCode = CheckLevel.WARNING;
        options.checkMissingReturn = CheckLevel.WARNING;
        NodeTraversal.traverse(compiler, rootNode, new CheckUnreachableCode(compiler, options.checkUnreachableCode));
        NodeTraversal.traverse(compiler, rootNode, new CheckMissingReturn(compiler, options.checkMissingReturn));
        for (JSError message : compiler.getWarnings()) {
            warningMessage = warningMessage.append(message.toString()+ "\n");
        }
        String Message = warningMessage.toString();
        return Message;
    }
}