对于不使用Java-Stub,而是使用Shellscript(通过Info.plist注册)的Java应用程序,我有一个OSX应用程序捆绑包。我也注册在我的Info.plist文件扩展名:使用JavaStub的OSX for Java应用程序捆绑软件的文件关联
…
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeName</key>
<string>My File Type Name</string>
<key>LSHandlerRank</key>
<string>Owner</string>
<key>CFBundleTypeExtensions</key>
<array>
<string>ext1</string>
<string>ext2</string>
</array>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/ext1</string>
<string>application/ext2</string>
</array>
</dict>
</array>
…
这是需要什么有LaunchService认识我的文件和关联到我的计划。
就我所了解的Apple Devel文档而言,我现在需要在Java中注册文件open Handler以通过将文件拖到App-Icon上(如Java 6 update 3)来打开文件:
Application.getApplication().setOpenFileHandler(new OpenFilesHandler() {
@Override
public void openFiles(OpenFilesEvent arg0) {
Debug.debug("Opening a bunch of files on osx.");
for(File file : arg0.getFiles()) {
Debug.debug("Opening: " + file.getAbsolutePath());
// Custom open action
FileActions.openFile(file);
}
}
});
我的第一个问题是:这个处理程序永远不会被打 - 没有调试消息,文件将无法打开。
第二个问题可能是相关的:我可以双击关联的文件,如果没有运行,应用程序将打开。由于我正在使用自定义外壳脚本来启动应用程序,因此我想我必须添加某种参数。首先,这是我startscript:
#!/bin/bash
BASEDIR=$(dirname "$0")
cd "$BASEDIR/../Resources/Java/"
java -Xdock:icon="../ico.icns" -Xmx256m -jar "core/myjar.jar"
出于测试目的,我加了“$ 1”到我的参数列表 - $ 1是从系统的PSN ......我怎么会连文件打开到PSN的事件 - 或者是有另一种方式来做到这一点(使用自定义shell脚本)。
但是,这并不解决/解释拖动文件到文件图标上的问题。 – gamma 2011-03-31 09:20:30
当Finder想告诉应用程序打开某些文件时,无论是通过拖拽,双击,还是向应用程序发送一个AppleEvent(IPC的一种形式)。你的情况下的应用程序是shell脚本,但它不知道如何接收AppleEvents,所以他们只是坐在那里未处理。您需要一个知道如何接收它们并将它们传递给Java程序进行处理的可执行文件,可能是某种“Java存根”。 – LaC 2011-03-31 09:49:18
好吧,我设法实现了JavaApplicationStub而不是shell脚本 - 将不得不做更多的改变,直到它的工作,但总体方向接缝没问题。 – gamma 2011-03-31 11:33:51