使用Google Closure" compiler.jar"在Google App Engine中

时间:2012-03-27 08:20:02

标签: javascript google-app-engine gwt google-closure-compiler

我正在尝试使用我的Java代码中的Google Closure Compiler API。函数compile()接收原始源代码,并以String形式返回已编译的源代码。

此代码将在Google App Engine中运行,但是当我部署并运行它时,我收到“服务器错误”。如果没有调用下面的函数,我不会有任何错误。在编译时,我收到警告“在服务器的类路径上将无法使用compiler.jar”。 Compiler.jar是我从Closure Compiler项目网站下载的库。

有关如何解决此问题的任何想法?

万分感谢,

import com.google.javascript.jscomp.*;

public static String compile(String code)
{
    com.google.javascript.jscomp.Compiler.setLoggingLevel(Level.INFO);
    com.google.javascript.jscomp.Compiler compiler = new com.google.javascript.jscomp.Compiler();

    CompilerOptions options = new CompilerOptions();
    CompilationLevel.SIMPLE_OPTIMIZATIONS.setOptionsForCompilationLevel(options);

    JSSourceFile js = JSSourceFile.fromCode("input.js", code);

    WarningLevel.QUIET.setOptionsForWarningLevel(options);      
    compiler.compile(null, js, options);

    return compiler.toSource();
}

3 个答案:

答案 0 :(得分:2)

  

在编译时,我收到警告“在服务器的类路径上将无法使用compiler.jar”。

您可能需要将compiler.jar移动到WEB-INF/lib

这可能是500的原因:如果你没有将compiler.jar部署为你的webapp的一部分,你的servlet(或其他)将失败并带有NoClassDefFoundError

答案 1 :(得分:2)

如果您还没有这样做,则需要在编译器中禁用线程以在app引擎上运行:请参阅Compiler.java中的“disableThreads”

http://code.google.com/p/closure-compiler/source/search?q=Compiler.java&origq=Compiler.java&btnG=Search+Trunk

通常,编译器会生成一个新线程,以确保它具有大于标准的堆栈。

答案 2 :(得分:2)

试试这个:

import com.google.javascript.jscomp.*;

public static String compile(String code)
{
    com.google.javascript.jscomp.Compiler.setLoggingLevel(Level.INFO);
    com.google.javascript.jscomp.Compiler compiler = new 
    com.google.javascript.jscomp.Compiler();

    CompilerOptions options = new CompilerOptions();
    CompilationLevel.SIMPLE_OPTIMIZATIONS.setOptionsForCompilationLevel(options);

    JSSourceFile js = JSSourceFile.fromCode("input.js", code);
    List<SourceFile> list = new ArrayList<SourceFile>();
    list.add(js);

    WarningLevel.QUIET.setOptionsForWarningLevel(options);      
    compiler.compile(new ArrayList<SourceFile>(), list, options);

    return compiler.toSource();
 }