【问题标题】:Proper way to execute an executable file (.exe) in different situations在不同情况下执行可执行文件 (.exe) 的正确方法
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您抽出宝贵时间回答我的问题。使用搜索路径的想法很有趣。我仍然不喜欢,我首先必须确定 .exe 文件的真实位置,但它仍然是一个简单且令人满意的解决方案。我不知道为什么我自己没有想出它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 2010-11-04
    相关资源
    最近更新 更多