Java,如何启动多个使用 1 个 VM 的 jar
Java, how to start several jars that use 1 VM?
我想在python的许多javascript文件上运行google闭包编译器。
我使用这个:
subprocess.Popen('/usr/bin/java -jar /var/www/compiler.jar --js "%s" --js_output_file "%s"' % (fullname, dest_filename),shell=True);
但据我了解,它为每个进程创建 java VM。
所以这会吃掉所有的内存。我只能在使用交换时听到我的硬盘破裂的声音。系统几乎挂起。我可以以某种方式告诉 java 对所有启动的进程仅使用 1 个 vm 吗?
可能是我写错了什么。那是因为我完全不了解Java。对不起,对不起
可能的答案 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,并传入适当的参数来模拟正常的命令行调用。 这里有一些快速而肮脏的东西可以解决问题(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
- ng选项-用vm替换$scope
- jar文件的后台进程,如何在进程结束时异步通知我
- 在Spoon(Pentaho-Kettle)中执行.jar文件
- 使用JavaScript中的参数运行.jar文件
- 节点VM-require()在第一级正常,在第二级失败
- JQuery中的$.ajax调用相同的VM
- Knockout.js多个外部模板&多VM切换失败
- 角控制器作为vm继承
- Aurelia:从子VM中访问父VM方法
- 控制器为vm,点击ng
- IONIC是否支持用Java开发的多线程和调用jar库
- Node.js 中意外的 vm.runInThisContext 控制流
- 电话间隙 - 是否可以运行外部 *.jar 文件
- angularjs:vm 是未定义的,当在指令中使用 contronllerAs 语法时
- 使用 vm 在 angularjs 中重定向
- 使用 javascript 和 jssc.jar 将数据发送到串行端口
- 如何从iOS UI Automation JavaScript对外部jar文件进行API调用
- 使用 $scope.$apply 在 TypeScript 中使用控制器作为 vm 语法时
- Java,如何启动多个使用 1 个 VM 的 jar
- Nodejs VM.设置内存限制