【发布时间】:2011-10-31 14:45:45
【问题描述】:
这种问题已经困扰我一段时间了,所以我很好奇你的方法是如何处理以下情况的:
想象一下,我在同一个工作区中有两个不同的 Eclipse 项目,分别称为 ProjectA 和 ProjectB。 ProjectB 在其根目录中包含一个 .exe 文件,该文件通过以下方式从 ProjectA 中调用:
Process p = Runtime.getRuntime().exec( "../ProjectB/ProjectB.exe" );
现在的问题是,部署后结构略有变化:ProjectA 现在是一个 .jar。现在,该 jar 旁边是一个带有 ProjectB 的文件夹,其中包含 ProjectB 及其 .exe、.jars 等。现在正确的调用必须如下所示:
Process p = Runtime.getRuntime().exec( "ProjectB/ProjectB.exe" );
由于我需要这些结构保持原样,并且我不想在我的应用程序中针对每种情况进行两个不同的 .exec 调用,因此我尝试了几种方法来解决这种情况:
1) 将 ProjectB 作为 ClassFolder 添加到 ProjectA 并让 ContextClassLoader 找出在哪里可以找到 ProjectB.exe,如下所示:
URL url= Thread.currentThread().getContextClassLoader().getResource( "ProjectB.exe" );
file = new File( url.toURI() );
Process p = Runtime.getRuntime().exec( file.getAbsolutePath() );
在我尝试将我的应用程序部署在网络驱动器上之前,此解决方案运行良好。
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: URI has an authority component
at java.io.File.<init>(Unknown Source)
2) 由于不允许我为每个客户端创建网络驱动器,因此我尝试解决此问题并执行以下操作:
URL url= Thread.currentThread().getContextClassLoader().getResource( "ProjectB.exe" );
File file = new File( url.getFile() );
Process p = Runtime.getRuntime().exec( file.getAbsolutePath() );
这似乎很有希望,但不幸的是,只要我的路径没有破折号(“”),因为这种方法似乎将每个破折号转换为“%20”,运行时执行器似乎并不喜欢。当然,之后我可以将每个 "%20" 替换为 " ",但这对我来说似乎有点 hacky。
另一个要求是,两个应用程序都必须在不同的 JVM 中运行,这就是我通过 Runtimeexecution 调用 .exe 文件的原因。所以我的最后一个问题是:有没有什么办法可以在没有任何变通方法的情况下让 ProjectB 调用干净?
【问题讨论】:
标签: java process runtime classpath execution