0

是否可以从另一个 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 初始化。

4

1 回答 1

2

那么当你启动一个 Java 进程时,它就是一个新的 JVM 实例。如果您希望启动另一个 JVM 实例,则需要启动它的单独进程。

IE

    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代替javaProjectLauncher.java代替ProjectLauncher等。

于 2013-07-24T07:39:32.763 回答