从另一个Java应用程序启动Java应用程序

我正在做一个Java Record / Replay工具,我需要从我的主Java应用程序启动Java应用程序。 我需要访问EventDispatchThread以拦截事件并记录它们,所以我通过reflection启动应用程序(简化代码片段):

Class app = Class.forName(mainClass); Method m = app.getMethod("main", new Class[] { String[].class }); m.invoke(null, new Object[] { new String[] {} }); 

我以前动态地将所有jar加载到类路径,并且应用程序几乎完美地启动。

当应用程序需要访问任何文件并使用相对路径执行此操作时,会发生此问题。 因为应用程序是通过我的应用程序启动的,所以路径与从其正常路径启动的路径不同,并且找不到文件。

我该怎么做才能解决这个问题? 动态改变执行环境? 有任何想法吗?

我建议在启动目标应用程序时将代码加载为“Java代理”。

(使用您的方法,您还会发现系统类加载器是错误的。)

一般来说,没有办法做到这一点。

http://bugs.sun.com/bugdatabase/view_bug.do;jsessionid=30b24551130ee4ffffffffc17df8d7ce8a9c3?bug_id=4117557

您可以尝试System.setProperty("user.dir", "C:\\Some\\Location"); 但它可能不适用于所有情况,并会给你奇怪的行为。

对于依赖于启动它的目录的应用来说,这是一个非常糟糕的设计。

我能给你的最好的建议是从行为不端的应用程序预期启动的目录启动你的应用程序(假设你知道那个目录是什么)。

否则,地狱,将数据文件复制/符号链接到您的目录中,以便客户端应用程序可以找到它们…