Java:复制exe文件并在之后启动失败

时间:2010-05-20 14:52:43

标签: java process copy windows-vista launch

我想将现有的.exe文件从一个目录复制到另一个目录,然后用Java启动它。像这样:

FileIO.copy( new File( sourceFile ), new File( targetFile ) );
System.out.println( "Existing: " + new File( targetFile ).exists() );
System.out.println( "Launching " + targetFile );
String cmd[] = { targetFile };
Process p = Runtime.getRuntime().exec( cmd );
p.waitFor();
System.out.println( "Result: " + p.exitValue() );

输出如下:

Existing: true
Launching C:\test\Launcher.new.exe
Result: 2

所以Java说该文件是有效且存在的,但Windows无法启动该进程,因为它认为该文件不存在。 pathes是绝对的,带有反斜杠。我对文件也拥有所有权限,因此我可以执行它们。 Launcher.new.exe是由Launch4j生成的,因此它或多或少是独立的。至少它不依赖于同一文件夹中的DLL。但很奇怪:当我复制并启动notepad.exe时,它会起作用。

还有一件奇怪的事情:如果我不是通过Java手动复制文件,那么启动也会因同样的错误而失败。

操作系统是带SP1的Vista。

有任何线索吗?

4 个答案:

答案 0 :(得分:0)

嗯......我想知道这可能是Vista的精彩用户访问控制......

你在Program Files中工作吗?如果是这样,将所有内容移到一个单独的文件夹(c:\ CopyTest)中,然后再试一次 - 看看是否有帮助......

答案 1 :(得分:0)

如果您的路径包含正斜杠,您可能希望在exec之前尝试将它们更改为反斜杠。此外,您应该尝试使路径绝对,包括驱动器号和冒号(例如C:\test\myprog.exe)。请注意,如果您在Java String中编写路径,则需要加倍反斜杠......

一旦你开始工作,你就可以缓解这些限制,直到你弄清楚你的尝试是什么。


编辑1:this article中提到了exec()的一些常见陷阱。我认为这些都不适用,但您可能希望使用上一个示例中的编码在CMD.EXE内运行.EXE以获得合适的路径解析,错误处理等。


编辑2:您的可执行文件名需要解释为长文件名。我不肯定API可以/将处理这个问题。请尝试给.EXE一个简短的名称(仅用于测试),如NEWPROG.EXE(名称中没有第二个点!)但首先肯定先试试CMD.EXE。


编辑3:从阅读评论到另一个答案:您的程序是否可能正在运行,并且本身返回状态2,因为无法找到文件?有没有办法验证程序的运行,可能是从你从Java程序运行的.CMD批处理脚本中调用它,并让它将输出重定向到文件?

答案 2 :(得分:0)

没有更多细节,很难给出具体答案。检查您对c:\ test目录的权限以及您尝试执行的目标文件的权限。

答案 3 :(得分:0)

也许您可能遇到的问题是没有在目录中捆绑更多。 Launch4j 可能会将您的程序转换为 exe,但 jre 只有一个本地目录。该文件夹包含任何现有 Java jre 的 bin 和 lib 文件。 也许它有帮助...

更新 似乎有些人很难理解我说的话。没问题,我会解释的。

举个例子,我用 Java 创建了一个简单的客户端聊天应用程序,并将它导出到一个可运行的 .../ClientChatApp.jar 文件中。然而,它仍然没有运行文件的依赖项,并且需要在桌面上安装 Java 才能这样做。例如这里,.../ClientChatApp.jar 仍然需要 javax.swing.*java.net.*java.io.* 的依赖项。因此,它将从它应该使用的 JDK/JRE 中定位那些依赖项。

现在,当涉及到从 .../ClientChatApp.jar 转换为 .../ClientChatApp.exe 时,它会按预期工作,前提是桌面安装了 Java,以便它可以从那里收集依赖项。这对用户不友好,因为任何未安装 Java 的用户都必须先安装它才能使用您的应用。

这是 Launch4j 的帮助之处。当您使用此程序从 jar 转换为 exe 时,它​​有助于重定向 exe 在本地文件夹中查找依赖项的位置,通常在 sam 目录中为 .../jre/... 文件的 .../ClientChatApp.exe。快速提示:要真正做到这一点,请转到与您要保存 exe 文件相同的目录,在那里创建一个名为 jre 的文件夹。现在转到 C:/Program Files/Java/<<your JDK or JRE folder>>/,然后选择并复制 binlib 文件夹并复制它们。然后转到您创建 jre 文件夹的目录并将两个文件夹粘贴到文件夹中。

许多用户可能已经这样做了,但为什么我解释上述所有内容是为了清楚地了解 jre 文件夹的作用,因此来到重点,您还必须发送jre 文件夹中的 exe 文件给用户,否则执行时会出现故障点。 您可以将它们发送到 .zip 文件中或使用 Inno Setup 创建安装程序 exe。如果您想使用 Inno Setup,我建议您进行更多研究。

就是这样。谢谢! (请给我点赞,这是我的第一个回答)