gpt4 book ai didi

Java,如何启动几个使用 1 个 VM 的 jar?

转载 作者:行者123 更新时间:2023-11-30 11:44:32 25 4
gpt4 key购买 nike

我要运行 google closure compiler在来自 python 的许多 javascript 文件上。
我用这个:

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 个虚拟机吗?

可能是我写错了什么。那是因为我完全不懂java。对不起

最佳答案

可能的答案1:

Google 闭包编译器确实接受具有如下语法的多个输入文件:

java -jar compiler.jar --js=in1.js --js=in2.js ... --js_output_file=out.js

这将只生成一个输出文件,该文件是所有输入的组合。但如果您尝试单独编译每个文件,这可能不是您想要的。


可能的答案2:

编写一个接受成对参数的小型包装脚本(使用 bashpython 或您最喜欢的脚本语言)并不难,例如

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

关于Java,如何启动几个使用 1 个 VM 的 jar?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10759013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com