0

別の Java コマンドを使用して Java プログラムを起動するのと同じように、別の Java プログラムから Java プログラムを起動することはできますか? main()プログラムのメソッドを別のプログラムから直接呼び出す場合、 Java コンテキストはこれら両方の実行に共通です。スレッドごとに 1 つの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.
    }

}

test/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 インスタンスを開始する場合は、別のプロセスを開始する必要があります。

すなわち

    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などを使用します。

于 2013-07-24T07:39:32.763 に答える