Мой вопрос - это «злой близнец» из мой другой вопрос , на этот раз сосредоточенный на Java аспектах.
Мое приложение Java 8 может сохранять состояния программы в формате XML (который я назвал skktx). Чтобы приложение могло открывать файлы, передаваемые MacOS, я реализовал интерфейс Apple OpenFilesHandler.
import java.io.File;
import java.util.List;
import com.apple.eawt.AppEvent.OpenFilesEvent;
import com.apple.eawt.Application;
import com.apple.eawt.OpenFilesHandler;
import javax.swing.JOptionPane;
public class MacOpenFileHandler implements OpenFilesHandler {
static final MacOpenFileHandler MAC_FILES_HANDLER = new MacOpenFileHandler();
@Override
public void openFiles(OpenFilesEvent ofe) {
List<File> files = ofe.getFiles();
if (files == null || files.isEmpty()) {
return;
}
JOptionPane.showMessageDialog(null, "openFiles: " + files.get(0));
// more lines to run the actual import routines for xml
}
public static void setFileHandler() {
System.out.println("setFileHandler");
try {
Application.getApplication().setOpenFileHandler(MAC_FILES_HANDLER);
} catch (NoClassDefFoundError e) {
System.err.println("error setting MacOpenFileHandler");
}
}
}
MacOpenFileHandler # setFileHandler вызывается при запуске (вместе с другими прослушивателями Ma c Speci c), когда приложение обнаруживает, что оно работает на MacOS. Это работает, строка "setFileHandler" печатается при запуске.
Поскольку я использую JAXB, который недоступен в Java VM> 1.8 без параметров, для запуска архива jar Java8 на Mac с более высокой версией Java я упаковал jar в комплект приложения ( .app) вместе с bash -скриптом, который вызывает JVM с необходимыми аргументами, давайте назовем это вещи. sh:
#!/bin/bash
VM_ARGS_A="--add-modules=java.xml.bind"
# Set the working directory
DIR=$(cd "$(dirname "$0")"; pwd)
APP_JAR="some-java-stuff.jar"
APP_NAME="Some Java Stuff"
APP_ICNS="stuff.icns"
#test: set command line args
STUFF_TITLE="Launching $APP_NAME"
STUFF_ARGS="$1"
ARGS_MSG="command line args: $STUFF_ARGS"
osascript \
-e "set question to display dialog \"$ARGS_MSG\" with title \"$STUFF_TITLE\" buttons {\"Cancel\"} default button 1"
#end test
exec $_java $VM_ARGS_A -Dapple.laf.useScreenMenuBar=true -Dcom.apple.macos.use-file-dialog-packages=true -Xdock:name="$APP_NAME" -Xdock:icon="$DIR/../Resources/$APP_ICNS" -jar "$DIR/$APP_JAR"
И с этим Info.plist
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>skktx</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>stuff.icns</string>
<key>CFBundleTypeName</key>
<string>Java Stuff calculation</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>LSHandlerRank</key>
<string>Owner</string>
</dict>
</array>
<key>CFBundleExecutable</key>
<string>stuff.sh</string>
Но когда я открываю файл skktx с моим stuff.app, MacOpenFileHandler # openFiles не вызывается. Диалог сообщения не отображается.
Что с ним не так?