...
...

Затачиваем свое Java-приложение под Mac OS X. Часть третья

Затачиваем свое Java-приложение под Mac OS X. Часть третья

Продолжение. Начало в КГ №№ 4, 21 (2003)

Благодаря двум предыдущим статьям вы смогли увидеть, как можно переделать ваше Java-приложение, чтобы оно выглядело и работало почти как родное Macintosh-приложение. При этом работать таким образом оно будет лишь тогда, когда будет запущено на платформе Mac OS X. В случае с другой операционной платформой работа и внешний вид приложения меняться не будут. Комбинация изменений в исходном коде и некоторых специфичных для Mac OS X runtime-свойств делает очень многое для этой цели. Однако следует отметить, что пользователи Mac OS X делятся на две категории. Большинство UNIX-программистов, конечно, могут (и во многих случаях так и происходит) открыть окно терминала, написать свой Java-код с помощью текстового процессора vi, после чего скомпилировать и запустить полученное приложение из командной строки. Однако существуют и другие, более традиционные пользователи Mac, которым нравится и которые привыкли работать с дружественным пользовательским интерфейсом, следующим директивам Apple Human Interface.
В этой статье мы рассмотрим возможность разворачивания вашего Java-приложения. Технические маньяки, может быть, и рады запускать Java-приложения, вызывая классы с методом main() из командной строки, но более широкие массы пользователей больше ожидают увидеть иконку, на которую можно два раза кликнуть мышкой и которая выглядит и действует, как любое другое родное Mac-приложение. В этой статье мы начнем свой путь от удовлетворения потребностей менее распространенного сообщества пользователей к удовлетворению потребностей другой — более расширенной базы потенциальных пользователей вашего приложения. Хотя было бы очень полезно протестировать ваше приложение на всех самых популярных платформах, все же ваш компьютер не обязательно должен быть из Mac-серии. К счастью, как вы дальше сможете убедиться, обычное Macintosh-приложение — это всего-навсего директория с некоторым особенным содержимым и именем, которое заканчивается на .app. Даже работая в среде Windows вы без особых проблем сможете модифицировать свой build-скрипт для упаковки Mac-версии вашего приложения.

Примитивные дистрибутивы
Поскольку Mac OS X поставляется вместе с J2SE 1.4.1 и J2SE 1.3.1, вы можете распространять выше приложение в виде .class-файлов или .jar-архива, и теоретически ваш клиент сможет запустить ваше приложение из терминальной сессии (приложение Terminal). Мы начнем с такой модели и постепенно перейдем к выполняемым .jar-архивам и shell-скриптам. В качестве примера мы будем пользоваться приложением Java Sound Demo (http://java.sun.com/products/java-media/sound/samples/JavaSoundDemo/). Скачайте и распакуйте .zip-архив с этим приложением. После этого обратите внимание на содержимое этого архива. Внутри директории JavaSoundDemo вы обнаружите файлы исходников в директории src, .jar-файл, аудиофайлы и html-файлы, которые мы не будем использовать.

Файлы классов
Как разработчик вы долго не задумываетесь, когда нужно откомпилировать исходный код и запустить приложение из командной строки. При компиляции восьми файлов из директории src на выходе получается 15 .class-файлов. После этого, чтобы запустить приложение, достаточно набрать в командной строке следующее:
java JavaSound
После выполнения этой команды запустится приложение Java Sound Demo. Сейчас мы никак не переделывали приложение, поэтому меню появляется в верхней части объекта-формы JFrame, а не там, где его ожидает увидеть пользователь Macintosh. Приложение выглядит так, как показано на изображении:
Наверняка вы проделывали эти операции компиляции и запуска приложений уже столько раз, что для вас это не более чем повседневная рутина, которая не заставляет вас задумываться дважды. Вспомните нескольких своих технически подкованных знакомых и спросите, предпочли бы они следовать этим шагам для запуска вашего приложения или лучше воспользовались бы конкурирующим приложением, которое гораздо проще установить и запустить? Этот пример демонстрирует две разных области юзабилити (usability). Как только вы получите готовое приложение, которое хорошо работает и хорошо выглядит, вы вряд ли захотите распространять его пользователям таким образом. Вам нужно будет свернуть все эти 15 файлов-классов, чтоб их проще было загружать из сети и устанавливать на компьютер. Кроме того, вам нужно будет предоставить подробные инструкции о том, как ваше приложение можно запустить с помощью (в случае с Mac OS X) приложения Terminal (терминальной сессии).

Файлы Jar-архивов
Если вы собираетесь упаковать все файлы классов в один архив для дальнейшего распространения, то можете изготовить специальный JAR-файл. Причем целесообразно, чтобы этот ваш JAR-файл был еще и исполняемым. Т.е. чтобы пользователь мог без дополнительных усилий с помощью двойного щелчка по иконке этого файла запустить вашу программу. В случае с приложением Java Sound Demo файл JavaSoundDemo.jar уже исполняемый. А поскольку Mac OS X поставляется вместе с приложением Jar Launcher, конечному пользователю для того, чтобы запустить это приложение, достаточно всего лишь два раза кликнуть мышкой по этому файлу.
Для того чтобы сделать любой JAR-файл исполняемым, он должен содержать внутри себя специальный файл манифеста, в котором определен основной (исполняемый) класс программы. Распакуйте файл JavaSo-undDemo.jar командой jar xvj JavaSoundDemo.jar. Файл манифеста — META-INF/MANIFEST.MF. Его содержимое:

Manifest-Version: 1.0
Main-Class: JavaSound
Created-By: 1.3.0 (Sun Microsystems Inc.)

Системные скрипты и вспомогательные приложения
Для больших и более сложных приложений у вас, возможно, будет несколько JAR-файлов наряду с файлами ресурсов. Чтобы решить эту проблему, первое, что приходит в голову, — включить в дистрибутив системные скрипты и командные файлы для запуска на разных платформах. Например, выберите платформонезависимый дистрибутив NetBeans с его домашней страницы http://www.netbeans.org/ . Внутри поддиректории bin вы обнаружите скрипты для запуска NetBeans на различных платформах.
Системный скрипт runide.sh можно запустить из командной строки следующим образом:
sh runide.sh -jdkhome /Lib-rary/Java/Home
Интегрированная среда разработки NetBeans стартует с look&feel'ом определенно не для Mac OS X.



Вы, конечно, можете изменить этот скрипт, чтобы установить нужный look&feel, но разработчики NetBeans предпочли использовать другой подход к решению этой проблемы. Даже учитывая тот факт, что все пользователи NetBeans предположительно должны обладать достаточным объемом знаний, чтобы не иметь проблем с запуском этой IDE, разработчики предусмотрели дружественный способ это сделать. Они создали родное приложение для Mac OS X, которое называется NetBeans-Launcher.
Версия NetBeansLancher, которая включена в обычный дистрибутив NetBeans, — отличный пример следующего шага в построении вашего дистрибутива. Далее вы увидите, каким образом это было сделано командой разработчиков NetBeans. На компьютере с Mac OS X вы можете двойным щелчком кликнуть на файле macosx_ launcher.dmg внутри директории bin. Этот файл представляет собой образ диска. Перетащите NetBeansLaun-cher из раскрывшегося дискового образа обратно в директорию bin и двойным щелчком мыши запустите его. Файл ReadMe, который также находится в этом образе диска, содержит необходимую информацию по процессу запуска NetBeans.
В нашем случае при первом запуске пользователем приложения NetBeansLauncher ему необходимо найти и выбрать директорию netbeans, в которой находится установленное приложение. А уже после этого при следующих запусках NetBeansLauncher будет запускать среду разработки Net-Beans, как будто это родное Mac OS X приложение.

Первоклассное приложение Mac OS X
Если вы скачаете образ диска для Mac OS X из дистрибутива NetBeans и смонтируете его, то сможете удивиться той простоте, с которой он реализован. Вместо сложных визуальных структур директорий, которые мы видим в других дистрибутивах, здесь есть всего 5 файлов с документацией и одним приложением. Чтобы произвести установку, необходимо всего лишь переместить NetBeansLa-uncher в любое место на вашем жестком диске. А двойным щелчком по этому приложению вы запускаете среду разработки. Все предельно просто и понятно.

Пакеты в Mac OS X
Посмотрим на одно из предложений из инструкции по запуску NetBeans, в котором говорится про определение местонахождении корневой директории для NetBeans: "Сперва приложение проверяет, является ли корневой директорией NetBeansLauncher.app". Это значит, что NetBeansLauncher — это директория с именем NetBeansLauncher.app. В окне смонтированного образа диска щелкните правой кнопкой мыши (либо левой кнопкой, но удерживая клавишу Ctrl) на иконке приложения NetBeans-Launcher и из выпадающего списка меню выберите пункт Show Package Contents.
Структура одинакова для всех приложений Mac OS X. Существует директория Con-tents с XML-файлом info.plist, текстовым файлом PkgInfo и директориями MacOS и Resources. Если у вас нет собственного кода разработчика, зарегистрированного в Apple, то текстовый файл PkgInfo будет содержать лишь одну строчку:
AAPL????
Если у вас есть код разработчика, то вы можете записать его вместо знаков вопроса. Директория MacOS обычно содержит небольшой файл, который служит для запуска виртуальной Java-машины. В нашем случае команда разработчиков NetBeans написала свое собственное приложение для этих целей. В следующей части статьи мы подробнее рассмотрим файл — список свойств. А пока обратите внимание на содержимое директории Resources, которое представлено на следующем изображении:



Как вы видите, внутри директории Resources находится папка, содержимое которой и представляет собой непосредственно файлы, необходимые для работы среды разработки Net-Beans. Эта папка, как вы могли заметить, называется netbeans. Такая структура является ключевым моментом в разворачивании своих приложений на Mac OS X. Просто добавьте необходимые файлы и свяжите их в ваш обычный дистрибутив в подходящем месте. Если необходимо, вы можете также убрать из этого дистрибутива ненужные файлы и оставить только то, что нужно на платформе Mac OS X. Если вам интересно получить более подробную информацию о структуре приложений Mac OS X, вы можете почитать специальный документ, опубликованный компанией Apple: "Anatomy of a Bundle" (http://developer.apple. com/documentation/MacOSX/Conceptual/SystemOverview/ Bundles/index.html).

Создание родных Java-приложений на Mac OS X
Если вы работаете и разрабатываете приложения непосредственно на платформе Mac OS X, то можете воспользоваться приложением Jar Builder для создания приложений Mac OS X из набора jar-фалов. Приложение Jar Builder распространяется вместе с другими инструментами разработчика и располагается в Developer/Applications/.
Запустите его. После этого выбирайте закладку Classpath and Files и добавляйте в список файл JavaSoundDemo.jar. После этого выбирайте закладку Build Information. В качестве главного класса (Main Class) снова выбирайте файл JavaSoundDemo.jar и после этого из выпадающего списка выбирайте класс JavaSound. Этот список формируется из всех доступных классов вашего приложения, которые содержат метод main(). Принимайте все параметры по умолчанию в качестве опций. Далее вы можете выбрать иконку для вашего приложения. Это может быть либо иконка, принимаемая по умолчанию для всех Java-приложений, либо иконка, созданная вами лично либо позаимствованная из другого источника. Иконку, которую вы видите ниже на изображении, — это часть рабочей области приложения Java Sound Demo. Она была получена путем преобразования этого изображения в иконку с помощью приложения IconComposer, которое также доступно как часть инструментов разработчика.
После этого нажимайте кнопку Create Application и вводите "JavaSoundDemo" в качестве имени приложения. Все, на этом этап создания приложения Mac OS X завершен. Вы можете посмотреть содержимое пакета созданного вами приложения, как мы делали это раньше. Вы также можете просмотреть список свойств с помощью приложения Property List Editor от Apple или же любого другого текстового редактора. Этот список, как уже упоминалось, представляет собой обычный XML-файл с хранимыми в нем необходимыми свойствами в виде пар имя=значение. Java-свойства определяют местонахождение jar-файла, имя основного класса приложения, версию JRE (Java Runtime Environment), которые будут использоваться. Другие свойства включают в себя указатель на файл иконки и на родной исполняемый файл для запуска приложения.

Создание Java-приложения для Mac OS X на других платформах
Обратите внимание на содержимое пакета, который был создан приложением Jar Builder на Mac OS X.
При работе на других платформах вам будет необходимо повторить эту структуру. Для того чтобы создать приложение с именем JavaSoundDemo на, скажем, Windows-машине, начните с того, что создайте директорию с именем Java-Sound-Demo.app. Далее создайте поддиректорию Contents. Внутри нее вам нужно создать директорию MacOS, в которой будет находиться программная заглушка JavaApplicationStub. Далее нужно создать текстовый файл PkgInfo и ваш Info.plist. Эти файлы вам также придется создавать вручную. В нашем случае Info.plist должен содержать следующий XML-код:



Далее вам нужно создать директорию Resources, которая будет содержать поддиректорию Java. В этой поддиректории размещайте файл JavaSoundDemo.jar. Другими словами, за исключением JavaApplicationStub и файла music.icns, все может быть создано на платформах, отличных от Mac OS X (например, Windows и Linux).
Если вы используете в своей работе Ant, то легко можете создать дополнительный пункт в конфигурационном файле (bu-ild.xml), по которому Ant возьмет все ваши jar-файлы, изображения и прочие ресурсы и свяжет их в одно целое Mac OS X приложение, которое будет включать plist-файл и программную заглушку в соответствующих директориях. Итак, каждый раз, когда вы собираете новую версию своего приложения, вы также получаете рабочую версию для платформы Mac OS X. Вы также можете найти огромное количество задач — примеров конфигурации Ant, которые бы автоматизировали некоторые шаги, рассмотренные нами в этой статье.

Резюме
Когда приходит момент для разворачивания вашего Java-приложения, с особым вниманием отнеситесь к простоте использования вашего дистрибутива для потенциальных пользователей. Даже разработчики ценят возможность запуска среды разработки NetBeans по двойному щелчку мыши. Создание Java-приложений, которые выглядят и работают, как родные приложения для заданной операционной системы, не требует слишком много дополнительной работы. Кроме того, вы можете интегрировать эту возможность в процесс построения приложения даже если вы работаете на машине с другой ОС.

По материалам Daniel H. Steinberg
Алексей Литвинюк, litvinuke@tut.by



© Компьютерная газета

полезные ссылки
Оффшорные банковские счета