这种问题已经困扰了我一段时间,所以我很好奇你的方法如何处理以下情况:
想象一下,我在同一个工作区中有两个不同的eclipse项目,名为ProjectA和ProjectB。 ProjectB在其根目录中包含一个.exe文件,该文件通过以下方式从ProjectA调用:
Process p = Runtime.getRuntime().exec( "../ProjectB/ProjectB.exe" );
现在的问题是,在部署之后,结构略有变化:ProjectA现在是.jar。这个jar旁边现在是一个带有ProjectB的文件夹,其中包含带有.exe,.jars等的ProjectB。现在正确的调用必须如下所示:
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() );
这似乎很有希望,但不幸的是,只要我的路径没有破折号(“”),因为这个appraoch似乎将每个破折号转换为“%20”,运行执行者似乎并不喜欢。当然,之后我可以将每个“%20”替换为“”,但这对我来说似乎有些苛刻。
另一个要求是,两个应用程序都必须在不同的JVM中运行,这就是我通过Runtimeexecution调用.exe文件的原因。所以我的最后一个问题是:有没有办法让ProjectB调用干净而没有任何解决方法?
答案 0 :(得分:1)
干净的方法是定义一个搜索路径(指向不同目录的几个File
个实例)。将exe的名称附加到每个路径,并检查生成的File
是否存在,并使用该路径执行它。
例外来自Windows的安全层:它不允许从网络路径运行未知的exe文件。请参阅您的系统管理员以获取解决方案。
请注意,您无法始终从类路径加载exe。例如,如果它们位于JAR内部,则无法工作。 Windows的启动程序不知道如何处理JAR文件。这里的解决方案是将资源解压缩到临时文件并从那里开始。