是否可以从另一个Java程序启动Java程序,就像我使用其他Java命令启动它一样?从另一个程序直接调用程序的main()
方法时, Java上下文对于这两个执行都是通用的。我正在尝试为每个线程创建一个 Java上下文。
插图:
的src / COM /项目/ 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 /项目/ 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.
}
}
我尝试在另一个线程/ runnable中启动main
方法,但ProjectLauncher仍然初始化了记录器。
答案 0 :(得分:2)
当你启动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
等编译它。 / p>