Ассоциация файлов в OSX для пакета приложений Java без использования JavaStub

У меня есть OSX App-Bundle для Java-приложения, которое использует не Java-Stub, а Shellscript (зарегистрированный через Info.plist). Я также зарегистрировал расширение своего файла в Info.plist:

…
<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, чтобы файлы открывались путем перетаскивания их на значок приложения (начиная с обновления Java 6 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 );
                }
            }
        } );

Моя первая проблема: этот обработчик никогда не попадает - нет сообщения об отладке, и файлы не открываются.

Вторая проблема может быть связана: я могу дважды щелкнуть связанный файл, и приложение откроется, если оно не запущено. Поскольку я использую собственный сценарий оболочки для запуска приложения, я подумал, что мне придется добавить какой-то параметр или около того. Сначала это мой стартовый скрипт:

#!/bin/bash
BASEDIR=$(dirname "$0")
cd "$BASEDIR/../Resources/Java/"
java -Xdock:icon="../ico.icns" -Xmx256m -jar "core/myjar.jar"

В целях тестирования я добавил «$ 1» в свой список аргументов — $ 1 — это PSN из системы… Как мне связать событие открытия файла с PSN — или есть другой способ сделать это (используя пользовательский сценарий оболочки) .


person gamma    schedule 31.03.2011    source источник


Ответы (1)


Вы не можете использовать сценарий оболочки для этого, AFAIK. Открытые файлы отправляются с помощью AppleEvents, и у bash нет возможности их получить.

person LaC    schedule 31.03.2011
comment
Однако это не решает/объясняет проблему перетаскивания файла на значок файла. - person gamma; 31.03.2011
comment
Когда Finder хочет сказать приложению открыть некоторые файлы, будь то перетаскивание, двойной щелчок или что-то еще, он отправляет приложению AppleEvent (форма IPC). Приложением в вашем случае является шелл-скрипт, но он не умеет получать AppleEvents, поэтому они просто лежат без обработки. Вам нужен исполняемый файл, который знает, как их получать и передавать вашей Java-программе для обработки, возможно, что-то вроде Java-заглушки. - person LaC; 31.03.2011
comment
Хорошо, мне удалось реализовать JavaApplicationStub вместо сценария оболочки - придется внести еще некоторые изменения, пока он не заработает, но общее направление, похоже, в порядке. - person gamma; 31.03.2011