我想在python的许多javascript文件上运行google closure compiler 我用这个:
subprocess.Popen('/usr/bin/java -jar /var/www/compiler.jar --js "%s" --js_output_file "%s"' % (fullname, dest_filename),shell=True);
但据我所知,它为每个进程创建了java VM 所以这吃了所有的RAM。我只能在使用交换时听到我的硬盘破解。 系统几乎被绞死了。我可以告诉java以某种方式仅使用1 vm用于所有已启动的进程吗?
可能是我写错了。那是因为我完全不懂java。对不起,
答案 0 :(得分:1)
可能答案1:
Google闭包编译器接受多个输入文件,其语法如下:
java -jar compiler.jar --js=in1.js --js=in2.js ... --js_output_file=out.js
这将只生成一个输出文件,它是所有输入的组合。但如果您尝试单独编译每个文件,这可能不是您想要的。
可能的答案2:
编写一个接受参数对的小包装脚本(使用bash
,python
或您喜欢的脚本语言)并不难,例如
wrapper.sh in1.js out1.js in2.js out2.js ...
wrapper.sh
中的代码可以遍历(对)参数并重复调用java -jar --js=xxx --js_output_file=yyy
,等待每个参数在开始下一个之前完成。这样做的好处是不能并行启动每个进程,因此至少你不会(可能)同时运行许多JVM。虽然每次运行都需要重新启动JVM,但效率很低。
可能的答案3:
如果真的只想要一个JVM,那么在没有编写一些Java代码的情况下就没有办法做你所要求的(据我所知)。如果您熟悉Java,则可以复制CommandLineRunner.java的源代码并对其进行修改以满足您的需求。
或者甚至更简单,只需编写一个小型Java类,其main
函数只需多次调用CommandLineRunner
main,传入适当的参数即可模拟正常的命令行调用。这里有一些快速而又脏的东西(hat tip to VonC)
import com.google.javascript.jscomp.CommandLineRunner;
import java.security.Permission;
public class MyRunner {
public static void main(String [] args) {
// Necessary since the closure compiler calls System.exit(...).
System.setSecurityManager(new NoExitSecurityManager());
for (int i=0; i<args.length; i+=2) {
System.out.println("Compiling " + args[i] + " into " + args[i+1] + "...");
try {
CommandLineRunner.main(new String[] {
"--js=" + args[i],
"--js_output_file=" + args[i+1]
});
}
catch (ExitException ee) {
System.out.println("Finished with status: " + ee.getStatus());
}
}
}
private static class ExitException extends SecurityException {
private int status;
public ExitException(int status) { this.status = status; }
public int getStatus() { return status; }
}
private static class NoExitSecurityManager extends SecurityManager {
public void checkPermission(Permission p) { }
public void checkPermission(Permission p, Object context) { }
public void checkExit(int status) { throw new ExitException(status); }
}
}
用以下内容编译:
javac -classpath compiler.jar MyRunner.java
使用以下内容运行它:
java -classpath .:compiler.jar MyRunner in1.js out1.js in2.js out2.js ...
看到这样的输出:
Compiling in1.js into out1.js...
Finished with status: 0
Compiling in2.js into out2.js...
Finished with status: 0