Java 在不同情况下执行可执行文件(.exe)的正确方法

Java 在不同情况下执行可执行文件(.exe)的正确方法,java,process,runtime,classpath,execution,Java,Process,Runtime,Classpath,Execution,这类问题已经困扰了我一段时间,因此我很好奇您如何处理以下情况: 假设我在同一个工作区中有两个不同的eclipse项目,分别称为ProjectA和ProjectB。ProjectB在其根目录中包含一个.exe文件,通过以下方式从ProjectA调用该文件: Process p = Runtime.getRuntime().exec( "../ProjectB/ProjectB.exe" ); 现在的问题是,在部署之后,结构略有变化:ProjectA现在是一个.jar。现在,jar旁边是一个带有P

这类问题已经困扰了我一段时间,因此我很好奇您如何处理以下情况:

假设我在同一个工作区中有两个不同的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" );
URL url= Thread.currentThread().getContextClassLoader().getResource( "ProjectB.exe" );
File file = new File( url.getFile() );
Process p = Runtime.getRuntime().exec( file.getAbsolutePath() );
由于我需要这些结构保持原样,并且我不希望在我的应用程序中为每种情况调用两个不同的.exec,因此我尝试了几种方法来解决这种情况:

1) 将ProjectB作为类文件夹添加到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)
这似乎很有希望,但不幸的是,只要我的路径没有破折号(“”),因为这种方法似乎将每个破折号都转换为“%20”,而runtimeexecutor似乎并不喜欢它。当然,我可以在以后将每个“%20”替换为“”,但这对我来说似乎有点不方便


另一个要求是,两个应用程序必须在不同的JVM中运行,这就是为什么我通过Runtimeexecution调用.exe文件。因此,我的最后一个问题是:有没有办法在没有任何解决办法的情况下清除ProjectB调用?

清除方法是定义一个搜索路径(几个指向不同目录的
文件
实例)。将exe的名称附加到每个路径,检查生成的
文件是否存在,并使用该路径执行它

Windows的安全层有一个例外:它不允许从网络路径运行未知的exe文件。请向系统管理员咨询解决方案


请注意,您不能总是从类路径加载exe。例如,如果它们在一个罐子里,它就不会工作。Windows的启动器不知道如何处理JAR文件。这里的解决方案是将资源解包到一个临时文件中,然后从那里开始。

感谢您抽出时间来解答我的问题。使用搜索路径的想法很有趣。我仍然不喜欢首先必须确定.exe文件的真实位置,但这仍然是一个简单而令人满意的解决方案。我不知道为什么我自己没想到。