Статьи

install4j и AppleScript: создание пакета приложения Mac OS X для приложения Java

У нас в Neo есть несколько внутренних приложений, которые можно запустить с помощью java -jar, и я всегда забываю, где находятся файлы jar, поэтому я решил обернуть вокруг него пакет приложений Mac OS X, чтобы облегчить жизнь.

Мой любимый шаблон установки — тот, в котором при двойном щелчке по dmg отображается окно, в которое вы можете перетащить приложение в папку «Приложения», например:

2014 04 07 00 38 41

Я не фанат мастеров установки, и процесс установки здесь настолько прост, что мастер кажется излишним.

Я начал изучать  структуру пакета приложений,  которая хорошо описана в руководстве по программированию Apple Bundle. Затем я пробежался по видео, в котором рассказывается, как  связать файл JAR в приложении Mac .

Я подумал, что объединение JAR, вероятно, было решенной проблемой, и взглянул на  App BundlerJAR Bundler  и Iceberg,  прежде чем остановиться на  Install4j,  который мы использовали для  настольного компьютера Neo4j .

Я начал с создания установщика с использованием Install4j, а затем вручную скопировал созданный им модуль запуска в шаблон пакета приложений, но это было невероятно сложно, и в результате я получил множество неразборчивых сообщений в системном журнале ошибок.

В конце концов я понял, что мне не нужно создавать установщик, и что мне действительно нужен  архивный файл мультимедиа Mac OS X с одним пакетом .

После того, как я установил это для install4j, мне просто нужно было выяснить, как создать фоновое изображение, сообщающее пользователю перетащить приложение в папку «Приложения».

К счастью, я  наткнулся на этот пост StackOverflow,  который предоставил AppleScript для этой цели , и с небольшой доработкой я получил следующий сценарий оболочки, который, похоже, выполняет свою работу:

#!/bin/bash
 
rm target/DBench_macos_1_0_0.tgz
/Applications/install4j\ 5/bin/install4jc TestBench.install4j
 
title="DemoBench"
backgroundPictureName="graphs.png"
applicationName="DemoBench"
finalDMGName="DemoBench.dmg"
 
rm -rf target/dmg && mkdir -p target/dmg
tar -C target/dmg -xvf target/DBench_macos_1_0_0.tgz
cp -r src/packaging/.background target/dmg
ln -s /Applications target/dmg
 
cd target
rm "${finalDMGName}"
umount -f /Volumes/"${title}"
 
hdiutil create -volname ${title} -size 100m -srcfolder dmg/ -ov -format UDRW pack.temp.dmg
device=$(hdiutil attach -readwrite -noverify -noautoopen "pack.temp.dmg" | egrep '^/dev/' | sed 1q | awk '{print $1}')
 
sleep 5
 
echo '
   tell application "Finder"
     tell disk "'${title}'"
           open
           set current view of container window to icon view
           set toolbar visible of container window to false
           set statusbar visible of container window to false
           set the bounds of container window to {400, 100, 885, 430}
           set theViewOptions to the icon view options of container window
           set arrangement of theViewOptions to not arranged
           set icon size of theViewOptions to 72
           set background picture of theViewOptions to file ".background:'${backgroundPictureName}'"
           set position of item "'${applicationName}'" of container window to {100, 100}
           set position of item "Applications" of container window to {375, 100}
           update without registering applications
           delay 5
           eject
     end tell
   end tell
' | osascript
 
hdiutil detach ${device}
hdiutil convert "pack.temp.dmg" -format UDZO -imagekey zlib-level=9 -o "${finalDMGName}"
rm -f pack.temp.dmg
 
cd ..

Подводя итог, этот сценарий создает символическую ссылку на «Приложения», помещает фоновое изображение в каталог с именем «.background», устанавливает его в качестве фона окна и позиционирует символическую ссылку и приложение соответствующим образом.

И вуаля:

2014 04 07 00 59 56

Ребята из Firefox написали  пару  постов в блоге,  подробно рассказывающих об их опыте написания инсталлятора, который также был довольно интересным.