// Run a java app in a separate system process
Process proc = Runtime.getRuntime().exec("java -jar A.jar");
// Then retreive the process output
InputStream in = proc.getInputStream();
InputStream err = proc.getErrorStream();
注意,这将使从属 jar 与 jar 共享内存空间和类路径,并可能导致所有干扰。如果你不想那些东西被污染,你还有其他选择,就像上面提到的那样——即:
创建一个包含 jar 的新 ClassLoader。这样更安全; 如果您知道将要使用外来的 jar,那么您至少可以将新 jar 的知识与核心类加载器隔离开来。我们的插件系统就是这么做的; 主应用程序是一个带有 ClassLoader 工厂的小外壳,一个 API 的副本,并且知道真正的应用程序是第一个应该构建 ClassLoader 的插件。插件是一对压缩在一起的 jar ——接口和实现。ClassLoader 都共享所有接口,而每个 ClassLoader 只知道自己的实现。堆栈有点复杂,但它通过了所有测试,工作得很好。