是否可以从另一个 Java 程序启动 Java 程序,就像我使用另一个 Java 命令启动它一样?当直接从另一个程序调用一个程序的 main()
方法时,Java 上下文对于这两个执行是通用的。我试图为每个线程拥有一个Java 上下文。
插图:
src/com/project/ProjectLauncher.java
public class ProjectLauncher {
static {
PropertyConfigurator.configure("log4j.properties");
}
public static void main(String[] args) {
Logger.getLogger(ProjectLauncher.class).info("started!");
// Logs well as expected.
}
}
测试/com/project/TestProject.java
public class TestProject extends TestCase {
public void testProject() {
ProjectLauncher.main(null);
Logger.getLogger(TestProject.class).info("tested!");
// The above line logs well, while log4j has been initialized in ProjectLauncher.
// I would like it to need its own initialization in this class.
}
}
我尝试在另一个线程/可运行中启动 main
方法,但记录器仍由 ProjectLauncher 初始化。
最佳答案
当你启动一个 Java 进程时,它是一个新的 JVM 实例。如果您希望启动另一个 JVM 实例,那么您需要启动它的单独进程。
即
List<String> command = new ArrayList<String>();
command.add("java");
command.add("ProjectLauncher");
ProcessBuilder builder = new ProcessBuilder(command);
builder.redirectErrorStream(true);
final Process process = builder.start();
try {
process.waitFor();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
//if you wish to read the output of it then below code else you can omit it.
InputStream is = process.getErrorStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
Logger.getLogger(MyClass.class.getName()).severe(line);
}
上面我们最终开始了一个新的进程,它实际上是java ProjectLauncher
。如果该类尚未编译,那么您必须与上面类似地编译它,但使用 javac
而不是 java
和 ProjectLauncher.java
而不是 ProjectLauncher
等
关于java - 每个线程一个 "Java context"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17827911/