我需要从我的JavaFX应用程序启动一个名为TeamViewer的外部应用程序。 所以我将TeamViewer.app文件复制到临时文件夹并使用以下命令启动它:
Runtime.getRuntime().exec("open /path/to/Teamviewer.app");
但是这会抛出Directory而不是IOException
我也尝试使用shell文件启动我写的" open /path/to/Teamviewer.app"命令到launch.sh并使用ProcessBuilder创建的进程启动launch.sh。
如果我从终端运行launch.sh,它的工作原理。但是从java程序,
抛出以下异常:
SEVERE: null
java.io.IOException: Cannot run program "sh" (in directory "/Applications/ColorDx.app/Contents/Java"): error=66, Directory not empty
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1047)
at com.sc.colordx.controller.ColorDxSupportController.executeCommand(ColorDxSupportController.java:288)
at com.sc.colordx.controller.ColorDxSupportController.launchSetup(ColorDxSupportController.java:126)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
目录不为空的原因可能是什么原因?它必须是非空的,因为我已经在那里复制了TeamViewer.app。
这可能是一个多线程的问题吗?意味着我先复制TeamViewer.app并立即启动它。复制完成之前是否有可能调用启动命令?
TIA
答案 0 :(得分:0)
正如我所怀疑的,运行时本身存在问题!还有一个JavaFX应用程序充当此应用程序的安装程序(具有运行时问题的应用程序)。为了安装这个应用程序,我使用以下代码来复制.app文件的内容:
public static final void copyFile( File source, File destination ) throws IOException {
FileChannel sourceChannel = new FileInputStream( source ).getChannel();
FileChannel targetChannel = new FileOutputStream( destination ).getChannel();
sourceChannel.transferTo(0, sourceChannel.size(), targetChannel);
sourceChannel.close();
targetChannel.close();
}
上面的代码在复制时没有保留文件属性。使用Files.copy选项用COPY_ATTRIBUTES替换上述方法解决了这个问题。