Развертывание аплетов, приложений и выполняемых Java-файлов

С

Борщик архивов Archive Builder — это мастер среды JBuilder, который упрощает процесс развертывания за счет объединения всех требуемых файлов в один JAR-файл (т. е. Java-архив). Кроме того, вы имеете возможность создать JAR-файлы в режиме командной строки с помощью утилиты Jar, Входящей в состав инструмен­тального набора JDK. Создание JAR-файлов из командной строки будет кратко рас­смотрено в этой главе.

Для демонстрации процесса создания JAR-файлов будет использоваться очень простое приложение. В нем для настройки внешнего вида Jbuilder-кнопки будет ис­пользоваться изображение. Это достаточно важный пример, поскольку в реальных приложениях часто приходится связывать ресурсы и файлы классов Вообще говоря, JAR-файл объединяет все файлы классов и ресурсы, используемые аплетом или при­ложением, в один файл.

В JBuilder имеется возможность создавать JAR-файл или исполняемый файл. Исполняемый файл фактически представляет собой JAR-файл, содержащий испол­няемый файл операционной системы Windows, Linux или Solaris, который автома­тически запускает JAR-файл. C точки зрения пользователя этот файл ничем не бу­дет отличаться от обычного исполняемого файла. Ниже в этой главе будет приведе­но описание процесса создания исполняемого файла.

Создание ресурса

Настоящая глава начинается с короткого описания примера создания изображе­ния для кнопки, которое будет использоваться в качестве ресурса программы. В конце концов, если вы хотите использовать ресурсы, вы должны знать, как их созда­вать. Если в вашей компании работает художник, который создает для вас изобра­жения, можете пропустить этот раздел и перейти к разделу "Создание приложе­ния".

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

Многие программы, предназначенные для работы с графикой, позволяют очень легко создать изображения для кнопок. Изображение, которое будет использовать­ся в данной книге, было создано с помощью приложения Paint Shop Pro — недорого­го графического редактора, распространяемого как условно-бесплатное и доступно­го для свободной выгрузки из Internet. Для тех разработчиков, которые работают под управлением операционной системы Linux, в этой главе будет приведены инст­рукции для создания размещаемых на кнопках изображений в приложении GIMP. Программа GIMP — это программа с открытым исходным кодом, доступная для бес­платной выгрузки в Internet. Создание своих собственных кнопок — относительно простой процесс, с помощью которого вы получите более полный контроль над вне­шний видом конечного графического интерфейса.

Создание изображения для кнопки в Paint Shop Pro

Выберите в меню упомянутого редактора File ∣ New. На экране появится диалого­вое окно New Image (Новое изображение). Установите параметр Width (Ширина) рав­ным 79, а параметр Height (Высота) — 27, поле чего убедитесь, что в поле справа от полей ширины и высоты выбрано значение Pixels (Пиксели). Размеры 79 на 27 пик­селей соответствуют размерам по умолчанию для кнопок в JBuilder. Щелкните на кнопке OK.

В левой части экрана должна быть видна палитра инструментов, известная под названием Tool Palette. Если она отсутствует, выберите в меню View ∣ Toolbars ∣ Tool Palette (Вид | Панели инструментов | Палитра инструментов). В панели Tool Palette найдите пиктограмму с изображением наклоненного ведерка с краской, переливаю­щейся через край. Это инструмент Flood Fill (Заливка). Когда вы подведете указатель мыши к этой пиктограмме, на экране появится всплывающая подсказка с названи­ем инструмента. Для выбора инструмента Flood Fill щелкните на его пиктограмме.

В правой части экрана должна находится панель Color Palette (Палитра цветов). Если она отсутствует, выберите в меню View ∣ Toolbars ∣ Color Palette (Вид | Панели ин­струментов I Палитра цветов). Вы увидите прямоугольное окно, заполненное различ­ными цветами, которое называется Available Colors Panel (Панель доступных цве­тов). Под ним расположены два поля. Верхнее поле содержит цвет переднего пла­на, а нижнее — цвет фона. Щелкните на верхнем поле и выберите понравившийся цвет. Щелкните на кнопке OK, а затем щелкните на изображении. Изображение бу­дет залито выбранным цветом.

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

Найдите на панели Tool Palette пиктограмму с изображением пипетки. Она, ско­рее всего, находится в верхней части панели. Выберите пиктограмму Dropper (Пи­петка) и для выбора цвета, который вы хотите установить для верхней части кнопки, щелкните на изображении. Для верхней части кнопки желательно выбрать всего один цвет, поэтому щелкните в области, окружающий одноцветную область в цент­ре изображения.

Следуют» шаг заключается в выборе пиктограммы Paint Brush (Кисть), которая находится непосредственно под пиктограммой Dropper. После ее выбора проведите указателем мыши над закрашенной областью изображения и закрасьте ее цветом, выбранным с помощью пипетки. После выполнения этой операции кнопка готова для ddjlf текста. Щелкните в панели Tool Palette на пиктограмме, изображающей большую букву А. Это инструмент Text (Текст). Затем щелкните на изображении кнопки. На экране появится диалоговое окно, которое позволяет установить пара­метры текста. Для нашего примера кнопки должен неплохо выглядеть текст разме­ром 16 пунктов полужирного начертания. Обратите внимание, что вы имеете воз­можность выбрать цвет шрифта и цвет заливки. Щелкните на кнопке OK. Щелкните на изображении и переместите текст в нужное место в пределах изображения кноп­ки. После правильного расположения текста щелкните на пиктограмме Object Selector (Выбор объекта), которая находится в самом низу панели Tool Palette. Щел­кните на изображении вне текста. Если полученный результаты вам не нравится, для удаления текста нажмите комбинацию клавиш Ctrl+X или отмените действие с по­мощью комбинации клавиш Ctrl+Z. После создания удобоваримого изображения вы­берите в меню пункт File ∣ Save As и сохраните полученное изображение на диске.

Создание кнопки в приложении GIMP

Выберите в главном меню приложения пункт File ∣ New. На экране появится диа­логовое окно New Image (Новое изображение). Установите в поле Height размер в 27 пикселей, а в поле Width — в 79 пикселей, а в качестве типа заполнения выберите Background (Фон). Для создания нового изображения щелкните на кнопке OK. В нижней части панели инструментов приложения GIMP находятся два квадрата. Для открытия диалогового окна Color Selection (Выбор цвета) выполните двойной щел­чок на одном из квадратов. В появившемся окне вы увидите большой квадрат с раз­личными оттенками цветов. Справа от квадрата находится узкий прямоугольник с множеством цветов. Для выбора цвета щелкните на прямоугольнике, а для выбора оттенка цвета — на квадрате. После выбора цвета и его оттенка закройте диалоговое окно. Аналогичным способом выберите цвета фона и переднего плана.

В панели инструментов выберите инструмент Bucket Fill (Полная заливка), выг­лядящий как ведерко, и для закрашивания переднего плана изображения щелкните на изображении. Если вы решили, что изображение необходимо залить цветом, кото­рый был выбран в качестве цвета фона, щелкните на двунаправленной изогнутой стрел­ке, которая позволяет переключаться между цветом фона и цветом переднего плана.

Выполните двойной щелчок на инструменте Blend (Gradient) Fill (Градиентная за­ливка), который, скорее всего, находится справа от инструмента Bucket Fill. Двойной щелчок на инструменте Blend Fill приводит к открытию диалогового окна Tool Options (Опции инструмента). В этом окне в качестве значения параметра Blend выберите FG to BG(RGB), а в качестве значения параметра Gradient — Shapeburst(SphericaI). Закройте диалоговое окно. Щелкните на левой части изобра­жения и, удерживая нажатой кнопку мыши, перетащите указатель на правую часть изображения. Эта операция создаст эффект для кнопки.

Для добавления текста выполните двойной щелчок на пиктограмме С Заглавной буквой Т. Откроется диалоговое окно Tool Options для инструмента ʃəvi К открыв­шемся окне установите флажок Use Dynamic Text (Использовать динн — рский текст) и закройте окно. Щелкните на изображении. Откроется диалоюм* юзволя-

Ющее установить цвет, размер, стиль и другие атрибуты шрифта. По^ н пыоора всех необходимых параметров текста щелкните на кнопке OK Теперь на кнопке должен появиться текст. Если вам не нравится расположение текста, для его удаления или
переноса в другое место воспользуйтесь комбинациями клавиш CtrRX и CtrRV. Переместите текст в требуемую позицию, щелкните правой кнопкой мыши на изображении, и для группировки текста с изображением выберите в контекстном меню пункт Layers ∣ Anchor Layers (Уровни, Привязать уровни). При необходимости внесения изменений нажмите комбинацию клавиш CtrRZ, а затем снова сгруппи­руйте текст с изображением. Для сохранения изображения снова выполните щелчок правой кнопкой мыши и выберите в контекстном меню пункт File ∣ Save As.

Создание приложения

Для начала давайте-ка создадим стандартное приложение, четко следуя шагам, описанным в главе 3. Назовем проект ExitApplication и поместим его в пакет с именем ExitApplication.

примечаниеДля перехода в режим конструирования выберите вкладку Design (Конструирование). В панели структуры щелкните на элементе ContentPane. В окне инспектора измените свойство layout элемента ContentPane на FIowLayout. В панели компонентов щелкните на элементе JButton, а затем на форме для помещения на нее кнопки (см. рис. 28.1).

Поскольку в конструкторе пользовательского интерфейса задейство­ван только один компонент, можно изменить размеры панели COntentPane. Для измене­ния размеров щелкните на this в панели структуры. На элементе COntentPane появятся манипуляторы, позволяющие изменять размеры. При запуске приложения форма будет Иметь те размеры, которые были установлены в режиме конструирования.

Перейдите в режим редактирования исходного кода и введите следующий важ­ный оператор:

import java.net.url;,rte ettt searcn view project run team w⅛ardβ tools wιnαow help,i - ∖ i '^∖ '' ? ½ ■? ~ .-4i' * ʌ,
jk efe framei ∣
pfs? swto )swta0<¼nmwej aswinfl ∣ moreaswtne! aswiriflmote^ jɪd
« (Γ3ft∙-χwhi *⅛sfsr∣ {τ] pji⅛ 11 -h э )
,⅜∣ exitapplicationjpx ffi tφ «project source» ffi 't> bxitapplication i⅛, exitapplication java i⅛ frame1 java,jbjttonl,□ control,exitapplicatlon.f rame1
s-jui
;, в am
й sb contentpane (flow j b aowlayoutl l⅛~ jbuttonl
% -j menu i t „j data access i .j other
,font ⅜, ⅜ foreground lconlmape,-default»,∣⅝ properties 1 evs ∏⅛1 —ι ^--" - ■ ■ ■■ —~,sourcaj design ∣ beanj umu ∣ doc ∣ histoiyj,pontentpane (fiowlayoi,tjjbuiider 7 * gz∕⅛rc∕srcjav∂∕allυ∩tιtleds/ exit applicatιo∩∕src∕eχ∣tappbratmn∕fτame t.∣∂va,рис. 28.1. компонент jbutton в конструкторе пользовательского интерфейса. в панели структуры выбран this, а инструменты изменения размеров видны

Пролистайте несколько строк, и после объявления кнопки jButtoni поместите следующий код:

URL location = this. getClass().getResource("exit. png");

ImageIcon exitlcon = new ImageIcon(location, "Foo");

Код, который можно видеть на рис. 28.2, устанавливает URL-адрес изображения и создает новый компонент ImageIcon.

Встраивание ресурса в приложение

Файл изображения необходимо поместить в каталог src∕e×itapplication про­екта. Это тот же каталог, в котором находятся файлы applicationl. java и framel. java. Во время компиляции проекта JBuilder поместит копию файла изоб­ражения в каталог classes∕eχitapplication проекта. Именно из этого каталога изображение будет загружаться при запуске проекта.

Дабы понять, что происходит, давайте рассмотрим следующую строку кода, ко­торая была введена в предыдущем разделе главы:

URL location = this. getClass().getResource("exit. png”);

.l□l×)ssss ½ss∙ й 1rt⅛⅛⅛⅛⅛f⅜ ⅞jsi ⅝*at¾1⅝l⅝∣y⅛:
package exltapplication,
inptirt jave. avt. ∙: i∣φort java.avt.event. * l∣t,jrt javax.swing.*;
1∏port java. net. url;
jpanel contentpane;
flovlayout clovlayoutl ■ век flovlayouto;
jbutton jbuttonl - new jbuttont);
url location ■ thia.getclass() .getresource("exxt.png,' iaageicon exltlcon - aev iaagelcontlocatlon, "Γc∣o~j;
Здесь "exit. png" представляет собой имя файла изображения. Обратите внима­ние, что в приведенном коде содержится ссылка на this, что в данном случае соот­ветствует текущему экземпляру класса Framel. Текущий экземпляр класса Framel находится в каталоге src∕exitapplication и при развертывании приложения по­мещается в каталог classes∕eχitapplication. Именно поэтому ресурс для кнопки копируется в каталог src/exitapplication. Этот же вопрос можно рассмотреть с другой точки зрения. Вызов this. getClass() .getResource() явным образом про­сит объект Framel загрузить ресурс. Объект Framel выполнит загрузку, но он не сможет найти требуемый ресурс, если не указать путь к ресурсу относительно паке­та, в котором находится класс Framei. class. Проще всего, во избежание проблем, поместить ресурс в тот же пакет, в котором находится класс Framel. class.

Mutldcr 7 G: »rr/»ixM»d, OlhttArtleds TMrtAppBcatfmvsrt.’εxrtapρhcaUon,.’t∙t∙amel .

File Edtl Seerch View PrDjσ-∙ gun Tearr Wgardi [ooπt ⅛⅛noow κeιρ

^∏ exttapplicationjpx sr Φ «project source»
⅛ qi bxitapplicatlon
«4 exttappllcationjiiva
-⅛ frameijava

рис. 28.2. вот так выглядит редактор после добавления кодаN ⅛ ⅛^⅛ As ^~3 & ‰ ι i2

pvbllc class fraael extenda jfraae
h

æ ∙ .⅛ Imports J Frame1 , % JFrame P FrameIO г ProressWindowEvenU J — X ContentPane г V exltlcon i VflowLayoutl j" V Buttoni ;∙∙ V location — > IblnItO

Настройка конфигурации кнопки

Перейдите в режим конструирования, убедитесь, что конопка jButton1 выбрана, и в окне инспектора измените ряд свойств. Так, измените значение свойства border на RaisedBeveI, удалите значение свойства text и установите значение свойства focusPainted равным false. Откомпилируйте проект, а затем установите значение свойства icon равным exitlcon. После выполнения всех описанных операций на кнопке должно находится созданное вами изображение. Для создания обработчика события для кнопки выполните на ней двойной щелчок, и в шаблон обработчика событий введите следующую строку:

System. exit(0) ;

Для сохраниения изменений выберите в меню пункт File ∣ Save АН. Код должен выглядеть следующим образом:

Package exitapplication; import j ava. awt.*; Import java. awt. event.*; import j avax. swing.*; import j ava. net. URL; import javax. swing. border.*;

Public class Framel extends JFrame

{

JPanel ContentPane;

FlowLayout fIowLayoutl = new FlowLayoutO;

JButton j Buttonl = new JButton () ;

URL location = this. getClass().getResource("exit. png");

ImageIcon exitlcon = new ImageIcon(location, "Foo");

∕∕ Создание фрейма

Public Framel()

{

EnableEvents(AWTEvent. WINDOW_EVENT_MASK); try <

Jblnit () ;

}

Catch(Exception e)

{

E. printStackTrace();

)

)

∕∕ Инициализация компонент Private void jblnit() throws Exception {

ContentPane = (JPanel) this. getContentPane();

JButtonl. setBorder(BorderFactory-CreateRaisedBevelBorder()); jButtonl. SetFocusPainted(false); jButtonl. setlcon(exitlcon); jButtonl. SddActionListener(

New Framel_jButtonl_actionAdapter(this));

ContentPane. setLayout(fIowLayoutl); this. setSize(new Dimension(400, 300));

This. SetTitle("Frame Title"); ContentPane. add(jButtonlr null);

∕∕ Перекрыт, чтобы можно было выйти при закрытии окна Protected void ProcessWindowEvent (WindowEvent Е)

{

Super. processWindowEvent(е);

If .ge tID() == WindowEvent. WINDOW_CLOSING)

{

System. exit(О);

}

}

Void jButtonl_actionPerformed(ActionEvent e)

{

System. exit(O) ;

)

)

Class Framel_jButtonl_actionAdapter implements java. awt. event. ActionListener {

Framel adaptee;

{
this, adaptee = adaptee;
)
public void actionperformed (actionevent e)
{
adaptee.jbuttonl_actionperformed(e);
)
}
после запуска приложения его окно должно выглядеть примерно так, как показано на рис. 28.3.
развертывание приложения

рис. 28.3. так выглядит окно выполняющегося приложения

Framel_jButtonl_actionAdapter (Freunel adaptee)

Следующий шаг заключается в подготовке файлов приложения, включая файл Exit.Png, для развертывания. В меню JBuilder выберите Wizards ∣ Archive Builder. Первый из семи шагов мастера (см. рис. 28.4) позволяет выбрать тип создаваемого архива. В диалоговом окне находится выпадающий список, включающий, помимо других опций, Applet JAR, Applet zip и Application. При выборе каждого типа файлов в окне будет появляться его короткое описание. Выберите в списке Application и пе­рейдите к следующему шагу мастера.

Шаг 2 мастера Archive Builder (см. рис. 28.5) позволяет выбрать имя JAR-файла. В поле File введите имя ExitAppIication и убедитесь, что создаваемый JAR-файл будет назван ExitAppIicationjar. Кнопки в окне позволяют подтвердить введенное имя и выбрать каталог для размещения создаваемого JAR-файла. В большинстве случаев можно оставить параметры, предлагаемые по умолчанию. Кроме того, можно уста­новить флажок Compress the contents of the archive (Сжать содержимое архива). Так­же можно установить опцию, которая указывает JBuilder на необходимость созда­ния архива при каждой сборке проекта. Лично я предпочитаю отмечать опцию и снимать отметку с опции создания архива для каждой сборки.

На шаге 3 мастера (см. рис. 28.6) убедитесь, что установлен флажок Always include all classes and resources (Всегда включать все классы и ресурсы). Если он ус­тановлен, вам не потребуется вручную включать файл в файлы проекта Exit. png. Он будет включен в проект автоматически.

При необходимости создания JAR-файла небольшого размера можно поэкспери­ментировать с опциями на шагах 3 и 4 мастера Archive Builder. В частности, можно исключить из него файлы классов и ресурсов и посмотреть, насколько уменьшиться размер проекта без потери его функциональности.

Шаг 4 (см. рис. 28.7) позволяет принимать решения, касающиеся зависимостей в библиотеках. Этот шаг не имеет отношения к проекту. Поскольку в нашем проекте библиотеки не используются, здесь не нужно выбирать что-либо. Пропустите этот шаг. В части VIII книги вы научитесь создавать JAR-файлы, включающие содержи­мое других JAR-файлов. Краткое описание этого процесса будет приведено в конце главы 43.

R’ Λr chive Buiider * Step 1 of 7

рис. 28.4. шаг 1 мастера archive builderSolBCt wιarcMM ⅜φβ

The unique CharatteneScs ofthe selected archive type are displayed below.

Arehiyelype Ae-ItcaSon ИЫ

Description; , , i___________________ ……………..

AppiieaUon βrrħlvβs are similar to basic arcnwee bid include a ipeclal MaInClass manliest entry used by the Java — jar <Jwname command-line IatincherlbrJave applications Vdur application’s main class is automatically derived tom the main class SpecHIed In the oefauɪt runtime configuration.

¾⅜⅜⅛ I Next» )i Finish I Cancel j Heip j

arcb∙ve builder st. p 2 o( 7*1туре appfleatfannarnetlexttapphcaiiop
fhe ⅛g∣s.. . avaʃa ∣ trt h t.-hpf aiionzexitappii
j/ compress bw contents ofthearetɪwe
«jgack i next» ∣jΓ¾n⅝sh ∣ cancel 1 h⅝⅛i1∣lРис. 28.5. Шаг 2 Мастера Archive Builder

Тем не менее, очень важно, чтобы вы понимали, каким образом JBuilder работает с используемыми в проекте JAR-файлами. Если на шаге 4 в архив будет добавлен JAR-файл, то в создаваемый JAR-файл будут внесены некоторые или все файлы классов из добавляемого JAR-файла. Этот процесс полностью автоматизирован. Все, что требуется от вас — это указать JAR-файл как зависимость от библиотеки, и его содержимое будет автоматически внесено в создаваемый JAR-файл. За кулисами JAR-файл библиотеки будет распакован и содержащиеся в нем классы будет перене­сены в новый JAR-файл.

ПРИМЕЧАНИЕ

JAR-фаилы должны добавляться в проект до запуска мастера Archive Builder. Для добавления JAR-файлов в проект воспользуйтесь диалоговым окном Project Properties И следуйте инструкциям, приведенным в предыдущей главе.

Рис. 28.6. Шаг 3 Мастера Archive Builder

,ri> Archive Builder — Step 4 of 7

Рис. 28.7. Шаг 4Мастера Archive Builder

; Library settings -∙∙-"

; C ∣⅛i>v? ⅛⅛⅛ιρ⅛rκ’rf⅛⅛⅛⅛ ⅛e∣eet⅛⅛⅛s

J S.∙ ~. — ‘

J C! ,i C 4.jj∣r fs l√9. ɪ" ^> , ʧ . r’ i,

I Γ’⅛et∣3dL⅛qδ⅛⅛ ⅛H⅛⅛⅛an>? ⅛!∣>⅛s⅛ λ‰ i C r∙⅛s⅛ys‰ε∣d3e ан classes ⅛ ιe⅛o⅛⅛⅛{

Determine Whatto do wMι Ibrary dependencies

The libraries used by this project are listed below Select the

Appropriate deployment StrategytOr each one.

1.

>≈gack I Γ¾⅛’> 11 ⅞ Finish I Cancel J Help

рис. 28.8. zz/ог 5 мастера archive builderfj, archive buiwer * step 5 of 7

К этому моменту вы, наверное, начинаете осознавать, почему в нижней части ди­алогового окна мастера Archive Builder на шаге 4 содержится так много опций. Если вы хотите распространять один конкретный JAR-файл отдельно от всего проекта, выберите первую опцию. Две средние опции дают возможность внедрить в проект отдельную часть JAR-файла. Например, в JAR-файл проекта можно включить толь­ко разделы SAX большого файла Xerxes.Jar, который находится на Web-сайте Www. apache. org. Если же файл Xerxes. jar Нужно включить в JAR-файл проекта полностью, выберите последнюю опцию. В конце концов, чтобы определить, на­сколько можно уменьшить размер JAR-файла без нарушения функциональности приложения, вам следует просто поэкспериментировать и протестировать получае­мый JAR-файл.

Очевидно, что для некоторых проектов шаг 4 мастера Archive Builder является наиболее важной возможностью, которую может предложить среда JBuilder. C по­мощью двух средних опций шага 4 вы можете попросить JBuilder определить зави­симости проекта от конкретного JAR-файла. После этого JBuilder автоматически включит в проект все необходимые файлы классов. Это позволяет максимально уменьшить размер получаемого JAR-файла и помогает сэкономить часы или даже дни усердной работы.

Шаг 5 (см. рис. 28.8) уделяет внимание манифесту проекта. Оставьте все опции, установленные по умолчанию (Include a manifest in the archive и Create a manifest). Более подробно мы поговорим о значимости этого шага после завершения шага 6.

Шаг 6 (см. рис. 28.9) позволяет выбирать главный класс. Оставьте значение, ус­тановленное по умолчанию, т. е. переключатель Determine main class from runtime configurations (Определять главный класс на основе конфигурации времени выполнения).

Манифесты представляют собой небольшие текстовые файлы, вставляемые в JAR-файлы с целью автоматизации некоторых задач, связанных с использовани-

Set ItrcMwemanrestofXiQns

Most ofthe time the automatic manifest creation process will be sufficient, butyou may wish to select to save a copy ofthe generated manifest Only advanced users will ever have a need to override the manifest contents.

F include a manifest in the archive

■ Manifest settNgδ∙xi,-i~~ii’*~^^ —^^~ •

.. .

" fp Create a manifest

C Create a manifest and save a copy in the Specffied file

1 : > .

C Override the manifest with the specified file Pafe. I

. ` ^ ∙. ‘ ∙ . ■ . ∙∙ ‘

1 Next» 1

1 finish I

Cancel I

Help I

«Back

Ем JAR-файлов. Так, например, JAR-файл, содержащий проект, совершенно бес­полезен, если вы не знаете, в каком классе находится главный метод приложе­ния. В нашем случае главным классом будет eχitappiication. Applicationl либо exitapplication. ExitApplication, в зависимости от того, каким образом созда­валось приложение. (В проекте содержатся два файла, один из которых носит имя Framel. java, а второй является главным файлом приложения.)

Если вы правильно выполнили все описанные выше шаги, файл манифеста дол­жен выглядеть следующим образом:

Manifest-Version: 1.0

Main-Class: exitapplication. ExitApplication

В первой его строке указывается версия манифеста, а во второй — основной класс приложения. Поскольку имя главного класса хранится в JAR-файле, при его ис­пользовании другому программисту не потребуется явно указывать главный класс. Как результат, для запуска приложения из созданного JAR-файла в Windows доста­точно ввести следующую команду:

Javaw — jar ExitApplication. jar

Команда javaw при ее использовании с аргументом — jar находит манифест и автоматически запускает приложение. Под управлением операционной системы Linux необходимо пользоваться командой java, а не javaw.

Однако мы опережаем время. Для получения более подробной информации о процессе создания JAR-файлов внимательно прочитайте следующий раздел.

рис. 28.9. шаг 6
мастера archive builder
select a method for <meπnmnβ me appβcatωn,s main class
the archive builder normally attempts to use an application runtime configuration to determine the mein class. tyou would like to choose a specltic class. selectthe second option.
,Γ usetheclassspecifleclbeiow class: i,∣θ archive builder step 6 of 7

Создание JAR-файла

На данном этапе вам доступны две альтернативы:

■ В мастере Archive Builder щелкнуть на кнопке Finish и создать JAR-файл.

■ Продолжить выполнение мастера вплоть до последнего шага, и создать JAR- файл и выполняемый файл. (Фактически это решение не является оконча­тельным. В любой момент времени вы можете отредактировать архив и выб­рать опцию создания выполняемого файла, даже если она не была выбрана при первом создании JAR-файла.)

Предположим, что из мастера необходимо выйти без создания исполняемого файла. Другими словами, вы пропустили последний шаг мастера Archive Builder и щелкнули на кнопке Finish, выполняя шаг 6.

После нажатия кнопки Finish в панели проекта появится новый элемент с име­нем ExitApplication. Тем не менее, в данный момент времени JAR-файл еще не создан. Если у вас возникли сомнения, просмотрите содержимое корневого катало­га проекта.

Для создания JAR-файла выполните щелчок правой кнопкой мыши на новом файле ExitApplication, Появившемся в панели проекта, и выберите в контекстном меню пункт Маке. Затем перейдите в режим командной строки и сделайте текущим каталог ExitApplication, В котором находятся все файлы проекта. Введите команду:

Java w — jar ExitApplication. jar

Очень скоро вы увидите, что приложение выполняется. Это говорит о том, что у вас есть все необходимое для запуска приложения из JAR-файла.

Просмотр созданного архива

примечаниеC первого раза не все созданные JAR-файлы будут выполняться правильно. Это вызвано отнюдь не недостатками мастера Archive Builder, а тем, что вы, возможно, позабыли включить в JAR-файл все файлы и ресурсы, необходимые для правильного его функционирования. В частности, вы должны иметь возможность скопировать JAR-файл на другую машину, предпочтительно на ту, которая не используется для разработки, и запустить файл. При этом он должен выполняться без ошибок. Если файл не запускается, скорее всего, вы не включили в архив все требуемые файлы. В таком случае придется открыть архив и просмотреть его содержимое.

Практически любой архив, созданный на основе функционирующего проекта, будет выполняться правильно, если он находится в корневом каталоге проекта. Из корневого каталога JAR-файл может получить доступ к ресурсам и файлам классов проекта и будет выполняться независимо от того, находятся ли в архиве все необходи­мые файлы. Как результат, для тестирования архива нужно пользоваться другими ката­логом и диском, и предпочтительно выполнять тестирование на машине, которая не ис­Пользовалась для создания проекта.

Если выполнить двойной щелчок на узле архива в панели проекта, в панели структуры можно будет просмотреть содержание архива, как показано на рис. 28.10.

Рис. 28.10. Неполный архив, отображаемый в панели структуры

Рисунок 28.10 приведен в книге только для примера, поскольку архив, который там изображен, является неполным. В частности, его можно сравнить с рис. 28.11, на котором показан пакет exitapplication, содержащий файлы Fcamel. class и ExitAppiication. class. Обратите внимание, что в архиве находится ресурсный файл exit. png.

Если вы закончили работу и получили архив, показанный на рис. 28.10, вы мо­жете явным образом включить требуемые файлы в архив, выбрав их в мастере Archive Builder. В частности, можно выполнить щелчок правой кнопкой мыши на узле ар-

Рис. 28.11. Завершенный архив, в котором можно заметить пакет Exitapplication

рис. 28.13. выбор пакета, который необходимо добавить в архивaddclassef ,

рис. 28.12. панель contentmacmepaarchive builder с явным запросом на включение в архив целого пакета exitapplication

Хива в панели проекта, в появившемся контекстном меню выбрать пункт Properties и перейти на страницу Content (Содержание), как показано на рис. 28.12.

На рис. 28.12 видно, что на странице Content присутствуют опции для явного вклю­чения класса или файла в список требуемых классов, пакетов и ресурсов. В приведен­ном диалоговом окне недостаточно места для кнопки для размещения списка пакетов и классов. Тем не менее, поверьте, что вы имеете возможность с помощью кнопки Add Classes добавлять в архив не только классы, но и целые пакеты. Просто щелкните на этой кнопке и найдите пакет, который требуется добавить в архив (см. рис. 28.13).

Еще один способ определить, в чем заключается проблема с архивом — запустить его в режиме вывода расширенных результатов:

Java — jar — verbose ExitApplication. jar

Эта опция позволяет при запуске архива получить весьма подробный отчет. В некоторых случаях такой отчет помогает найти причину ошибки.

Создание исполняемого файла

Создание исполняемого файла в среде JBuilder — это очень простой процесс. Простой перейдите на последнюю страницу мастера Archive Builder, показанную на рис. 28.14, и выберите создание выполняемого файла для одной или нескольких следующих платформ:

■ для графического интерфейса пользователя Windows,

■ для Windows-консоли,

■ для Linux,

■ для Solaris,

■ для Мае.

C FroBertiei forTxttApDlication’

Archive Content I Depndenciet WSrefestl Wsin Executables : Project classes ano rβf wives -■■■

I ri include required classes and ⅛ιowr. re source» j include rβqulrβd clasp*»» an∙, all resources ⅛j S⅛-. ⅛t*aγe Include all classes ano resoɪireee

*⅛qi∣⅛βd m ∙* ιnHgp∙ and resource®

; Sxltapplicatlon.* Pa-Kage

рис. 28.14.
использование мастера archive builder для создания приложения

Если при первом выполнении мастера Archive Builder вы пропустили этот шаг, к нему можно вернуться, выполнив щелчок правой кнопкой мыши на узле архива в панели проекта и выбрав в контекстном меню пункт Properties. После этого вы получи­те доступ к большинству страниц мастера. Перейдите на последнюю страницу и выбе­рите опцию создания выполняемого файла для одной или нескольких платформ.

Исполняемые файлы JBuiIder

Давайте-ка посвятим несколько минут рассмотрению создаваемого выполняе­мого файла. Как вам, скорее всего, известно, JAR-файлы используют формат zip. Этот формат сжатия файлов используется в Windows, Linux и во многих других платформах.

Кроме того, вы, наверное, сталкивались с zip-файлами, распространяемыми в форме исполняемых файлов. В некоторых программах имеется опция создания zip — файлов подобного рода. Вы просто указываете, что создаваемый архив должен иметь не расширение zip, а представлять собой исполняемый файл. При запуске испол­няемого файла архив самостоятельно распаковывается, как если бы он открывался с ПОМОЩЬЮ приложений Wi∏Zip, UnZip, PKZIPC или любого другого приложения для работы с архивами.

Этот принцип — всего лишь уловка. В начало архива помещается небольшой ис­полняемый код. При запуске программы он открывает архив, присоединенный к концу исполняемого файла.

То же происходит и с выполняемым файлом JBuilder. Фактически вы получаете простой JAR-файл с присоединенным к нему исполняемым файлом для платформы Solaris, Windows, Linux или Mac. Если вы хотите в этом убедиться, откройте один из таких файлов в приложении WinZip. Он может выдавать предупреждения и ошибки, тем не менее, вы сможете увидеть, что к исполняемому файлу приложен JAR-файл.

Создание JAR-файла в режиме командной строки

Если вы не располагаете редакциями SE или Enterprise, JAR-файлы придется со­здавать в режиме командной строки. Даже в редакциях SE и Enterprise некоторые разработчики предпочитают создавать архивы из командной строки, поскольку этот процесс легко поддается автоматизации.

Для создания JAR-файла в командной строке используется следующая команда. Запустите ее из корневого каталога проекта:

Jar cvfm ExitApplication. jar MANIFEST. MF — C classes

B приведенной команде предполагается, что в корневом каталоге находится при­веденный ниже файл, имеющий имя MANIFEST. MF:

Manifest-Version: 1.0

Main-Class: exitapplication. ExitApplication

Утилита Jar Входит в состав JDK. На платформе Windows она хранится в катало­ге X:\JBuiider\jdki.3.i\bin В виде файла с именем Jar. eχe. На платформе Linux Она называется ∕home∕userDir∕JBuilder/jdkl.3.l∕bin∕jar.

Утилита jar принимает целый набор параметров. В приведенном случае переда­ются параметры cvfm:

С Означает создание JAR-файла,

V Обеспечивает вывод расширенного отчета о процессе создания JAR-файла,

■ f указывает, что после нее будет указано имя создаваемого файла,

■ m говорит о том, что вы предоставите свой собственный файл манифеста.

Опция Classes Указывает, что утилита jar перед архивацией файлов должна перейти в каталог Classes.

Даже если в процессе создания JAR-файла в него не был включен файл манифес­та, архив не будет считаться ошибочным. Тем не менее, при запуске JAR-файла вам придется указывать имя главного класса архива:

Java — classpath ExitApplication. jar exitapplication. ExitApplication

В приведенной команде указывается, что путь классов ссылается на файл ExitAppiication. jar, и устанавливается имя основного класса, который должен запускаться при запуске архива.

Для проверки содержимого JAR-файла выполните следующую команду: Jar ft ExitApplication. jar

В результате выполнении указанной команды вы получите вид, аналогичный приведенному на рисунках 28.10 и 28.11, с той лишь разницей, что на экране ото­бражается результаты команды, выполненной в режиме командной строки:

[g:SrcjavaJbbookDeploymentExitapplicationClasses]jar ft

ExitApplication. jar

META-INF/

META-INF∕MANIFEST. MF exitapplication/ exitapplication/exit. png exitapplication∕ExxtApplication. class

Exitapplication∕Framel. class

Exitapplication/Framel_jButtonl_actionAdapter. class package cache/

Package cache∕exitapplication. dep2

Как видите, архив включает не только файлы проекта, но и файлы JBuilder, нахо­дящиеся в каталоге кэша пакета. Эта дополнительная информация всего лишь уве­личивает размер выходного файла, но не приносит ему никакого вреда. Вы можете создать сценарий, который будет удалять эти каталоги перед созданием архива. Кроме того, их можно удалить прямо из архива после его создания. Ненужные файлы из архива можно удалить с помощью такого приложения, как, например, winzip.

Создание архива с помощью утилиты Ant

Вы, возможно, обратили внимание на большое количество файлов Build. xml, Входящих в состав сопровождающих книгу материалов. Это файлы, используемые утилитой Ant — программой с открытым исходным кодом. Проект Apache Jakarta Ant — это средство, дублирующее и превышающее функциональные возможности утилиты Make, Популярной среди многих программистов на языках C и C++.

Если вы знакомы с Ant, Для создания JAR-файла вы можете добавить в Ant-файл следующие узлы.

<target name=,’init,,>

<!— set global properties for this build —>

<property name="build" value="classes"∕>

<property name=’,dist" value=’’lib" ∕>

<•— In the ideal situation, you should only have to edit these —> <property name= "small-name" value="exitapplication"∕>

<property name="camel-name" value="exitApplication"∕>

<property name="caps-name" Value=nExitApplication"∕>

<!— End edit section —>

<property name="project-jar" value="${dist}\${small-name}.jar"∕> <echo message="project jar = ${project-jar}"∕>

</target>

<target name="dist" depends="compile">

<!— Create the distribution directory —>

<mkdir dir="${dist}"∕>

<jar jarfile="${project-jar}" basedir="${build}"∕>

</target>

Команда Jar, Находящаяся в конце приведенного файла, создаст JAR архив с именем lrb∖eχitapplication. jar Для создания манифеста команду Jar Необхо­димо расширить следующим образом:

<target name="dist" depends="compile">

<•— Create the distribution directory —>

<mkdir dir="${dist}"∕>

<jar jarfile="${project-jar}" basedir="${build}">

<manifest>

<attribute name="Built-By" value="${user. name}"∕>

<attribute name="Mam-Class"

Value="exitapρlication∕ExitApplication"∕>

<attribute name="Date-Built" value="${TODAY}" ∕>

<∕manifest>

<∕jar>

<∕target>

Полученный манифест будет выглядеть так:

Manifest-Version: 1.0

Built-By: Charlie

Main-Class: exitapplication∕ExitApplication

Created-By: Ant 1.4.1

Date-Built: May 26 2002

Эта дополнительная информация в JAR-файле приносит определенную пользу, не нанося архиву никакого вреда.

Помещение аплета в JAR-файл

Поместить аплет в JAR-файл так же просто, как и поместить в JAR-файл прило­жение, а может быть даже проще.

Нужно отметить, что аплеты должны вставляться в JAR-файлы, особенно если они состоят из нескольких классов. При получении доступа к аплету должен пере­даваться каждый класс, являющийся частью приложения. Проще и быстрее всего, если передача всех классов происходит одновременно, а не за счет выполнения пос­ледовательности транзакций через Internet. Если не все классы используются одно­временно, их можно разместить в нескольких файлах: в первом JAR-файле будут на­ходиться классы, используемые в первую очередь, а остальные классы помещаются в другие архивы, которые передаются по мере необходимости.

В состав сопровождающих книгу материалов входит Java-аплет ExitApplet. Этот проект можно использовать в качестве примера помещения аплетов в JAR-файл. Аплет ExitApplet, Который заимствует часть кода из демонстрационных примеров JDK, показан на рис. 28.15.

В этой главе мы не будем касаться процесса создания аплета, поскольку его со­держимое фактически не имеет отношения к рассматриваемой теме. То же самое можно показать на примере элементарного аплета JBuilder, создание которого было описано в главе 3. Созданный аплет можно упаковать в JAR-файл, как будет рас-

рис. 28.15. аплет exitapplet демонстрирует некоторые советы касательно воспроизведения гладкой анимации в окне аплета

Смотрено в следующем разделе. Тем не менее, аплет ExitAppiet, содержащийся в сопровождающих материалах, гораздо интереснее элементарного аплета, однако интерес к нему, в основном, вызван демонстрацией возможностей Java2D. Возмож­но, это несколько выходит за рамки ваших нынешних знаний о JBuilder.

Создание JAR-файла для аплета

Код аплета ExitApplet Содержится в двух файлах. Главный файл, ExitApplet. java, Содержит компонент, производный от JAppiet, Который является истинным серд­цем программы. Второй файл, BezierAnim. Java, представляет собой измененную версию файла из JDK. При создании JAR-файла для этой программы в него потре­буется включить оба файла Поскольку оба они находятся в одном и том же пакете, это совершенно несложно.

Фактически создание JAR-файла для рассматриваемого проекта даже не требует особенной работы мысли. В меню JBuilder выберите пункт Wizards ∣ Archive Builder. На первой странице мастера в качестве значения параметра Archive Туре (Тип архива) выберите из списка Applet JAR (JAR-архив для аплета), как показано на рис. 28.16

На всех остальных страницах мастера Archive Builder можно оставить значения, предложенные по умолчанию. После завершения работы мастера в проекте должен появиться новый узел. Этот узел представляет созданный архив. Выполнив двойной щелчок на архиве, можно просмотреть его содержание (см. рис. 28.17).

Как видите, манифест этого файла не содержит данных о главном классе. При работе с аплетами такие данные не нужны. Тем не менее, необходимо создать HTML-файл, содержащий дескрипторы, необходимые для правильного запуска ап­лета

рис. 28.16. первая страница мастера archive builder позволяет определить тип создаваемого архива xt archive builder - step 1 of 5,archive type: яммн11няййвянйиввл] description:
^applet archives ere compressed by default and typically include ail requ red classes from imported libraries
,select <tn archive type,the unique characteristics of the selected archive type are displayed below
рис. 28.17.
завершенный архив для простого java- аплета. в панели проекта легко заметить новый узел, а в панели структуры выводится содержание архива

Использование архива в браузере

Перед использованием созданного архива в HTML-файл, автоматически сгене­рированный JBuilder, потребуется внести незначительные изменения. В листинге 28.1 показан код созданного HTML-файла.

Листинг 28.1. При необходимости запуска аплета из архива в HTML-файл добавьте дескриптор archive

<html>

<head>

<title>

Тестовая HTML-Страница

<∕title>

<∕head>

<body>

Oxitapplet-ExitApplet Должен быть выведен ниже в браузере, воспринимающем Java.<br>

<applet

Codebaβe

1« n

Code

=

NExitapplet. ExitApplet. class

Name

=

"TestAppletn

Archive

=

NExitApplet. jar"

Width

=

"400"

Height

SS

..3oon

Hspace

SS

"0n

Vspace

=

"0n

Align

=

"middle"

>

<∕applet>

<∕body>

<∕html>

Ключевой строкой в приведенном листинге является строка, содержащая ссылку на созданный JAR-файл:

Archive = nExitApplet. jar"

C помощью этой строки среда JRE будет знать, что JAR-файл имеет имя ExitApplet. Jar. Затем в коде содержится строка, указывающая, какой класс необ­ходимо запускать:

Code = ,,exitapplet. ExitApplet. class"

примечаниеПри тестировании кода убедитесь, что HTML- и JAR-файлы скопированы в дру­гой каталог или, еще лучше, на другую машину, которая не использовалась во время разработки. Вам следует проверить, что в JAR-файл включены все необходимые файлы. При работе с аплетами, как правило, проще всего изолировать аплет, что по­зволяет гарантировать, что он не содержит ссылок ни на какие файлы, путь к кото­рым присутствует в пути классов.

Если проект состоит из нескольких JAR-файлов, все их можно указать в одной строке, разделяя отдельные файлы с помощью точки с запятой: Archive = "certify. jar,*version∕pod. jar"

Аплет ExitAppIet

Несмотря на то что основа аплета ExitAppiet была взята из демонстрационных файлов JDK, он может показаться вам достаточно интересным, поскольку приводит пример создания анимации с использованием Java2D. В частности, код основного файла практически соответствует шаблону любого аплета, используемого для созда­ния анимации. Код основного файла аплета можно найти в листинге 28.2. Второй файл аплета взят из JDK. Он используется для рисования графики, над которой вы­полняется анимация. Тем не менее, в этом разделе основное внимание будет уделе­но коду, выполняющему анимацию, а не коду анимируемых изображений.

smoothanimate smoothanimate;Листинг 28.2. Код создания анимации в аплете JBuiIder

Package exitapplet;

Import

Java. awt.*;

Import

J ava. awt. event.*;

Import

J ava. applet.* ;

Import

J avax. swing.*;

Import

Java. awt. image. BufferedImage;

∕**

* <p>Title: </р>

* <p>Description: </р>

* <p>Copyright: Copyright (с) 2002<∕p>

* <p>Company: </р>

* @author unascribed

* @version 1.О */

Public class ExitApplet extends JApplet {

// Получение информации об аплете

Public String getAppletlnfo()

{

Return "Applet Information";

}

∕∕ Получение информации о параметрах

Public String!] [] getParameterlnfo()

{

Return null;

)

∕∕ Инициализация аплета

Public void init()

{

Try

{

Jblnit () ;

}

Catch(Exception e)

{

E. printStackTrace();

]

}

∕∕ Инициализация компонент

Private void jblnit() throws Exception

{

GetContentPane().add(SmoothAnimate = new SmoothAnimateO);

}

Public void start()

(

SmoothAnimate. start();

}

Public void stop()

{

SmoothAnimate. stop();

)

Static class SmoothAnimate extends JPanel implements Runnable {

BufferedImage backSurface; int xPos = O; int newSize = 2; boolean ClearDemo = false;

BezierAnim bezierAnim = new BezierAnimO ; private Thread thread;

11 Создание аплета Public SmoothAnimateO {

}

Public Graphics2D createGraphics2D(int w, int h)

(

Graphics2D g2 = null;

If (backSurface ≈ null ∣∣ backSurface. getWidth () != w ∣∣

BackSurface. getHeightO ! = h)

{

BackSurface = (BufferedImage) CreateImage(w, h) ;

backsurface.creategraphics ();)

G2 =

If (ClearDemo)

<

G2.SetBackground(getBackground()); G2.clearRect(О, Or w, h) ;

}

Return g2;

}

Public void paint(Graphics g)

{

Super. paint(g);

ClearDemo = true;

d.height);Dimension d = getSize(); bezierAnim. step(d. width, d. height);

Graphics2D g2 = createGraphics2D(d. width, bezierAnim. render(d. width, d. height, g2); g2 .drawString("Hello", xPos + 10, 100); g2.dispose();

G. drawɪmage(backSurface, O, O, this); if(xPos > d. width — 30)

{

NewSize = -2;

)

If(xPos < O)

{

NewSize = 2;

)

XPos += newSize;

)

Public void start()

<

Thread = new Thread(this);

Thread. SetPriority(Thread. MIN_PRIORITY); thread. start();

>

Public synchronized void stop()

{

Thread ɪ null;

}

Public void run ()

(

Thread me = Thread. CurrentThread(); while(thread = me)

{

Repaint () ; try {

Thread. sleep(10);

)

Catch(InterruptedException e)

{

Break;

}

)

Thread = null;

Класс, производный от JAppiet, который используется в коде листинга 28.2, не выполняет никаких функций рисования. Он всего лишь создает класс SmoothAnimate, производный от JPanel. Именно этот класс, выполняемый в пото­ке, выполняет рисование. Основной цикл потока выглядит следующим образом:

Public void run()

{

Thread me = Thread. CurrentThread(); while (thread ≈ me)

{

Repaint () ; try {

Thread. sleep(10);

}

Catch(InterruptedException e)

{

Break;

}

}

Thread = null;

}

Как видите, код потока вызывает метод repaint, делает паузу, снова вызывает метод repaint и т. д

Таким образом, ключевым элементом программы является метод repaint класса SmoothAnimation. Он, В СВОЮ Очередь, вызывает метод CreateGraphics2D, который создает буферизированное изображение:

BackSurface = (BufferedIroage) CreateImage(w, h);

Изображение backSurface используется в схеме двойной буферизации Все ри­сование выполняется на фоновой поверхности, а затем, когда наступает время выве­сти его на экран, изображение backSurface копируется на экран с помощью следу­ющего вызова в методе repaint:

G. drawlmage(backSurface, О, О, this);

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

Вспомните об аниматорах студии Уолта Диснея, создавших, например, такой мульт­фильм, как "Белоснежка". Они нарисовали для мультфильма серию картинок. Каждая картинка в окончательной версии мультфильма была помещена в отдельный кадр на кинопленке. При просмотре кинопленки со скоростью 24 кадра в секунду картинки не кажутся отдельными кадрами, а превращаются в постоянно меняющийся мир.

Нечто аналогичное происходит и в нашем случае. Рисование выполняется на по­верхности backSurface. После того как картинка готова, она демонстрируется пользователю. Далее для рисования создается новая поверхность backSurface. Как только будет подготовлен новый рисунок, он снова будет выведен для пользователя. Несмотря на все достоинства аниматоров студии Уолта Диснея, они не могли рисо­вать картинки в реальном масштабе времени, как это делается в нашем примере.

Приложения Web Start

В версии JBuilder Enterprise имеется возможность создавать приложения Web Start. Технология Web Start позволяет запускать любое приложение или аплет за счет простого перехода на определенную Web-страницу. Приложение, аплет и среда JRE могут отсутствовать в системе пользователя, когда он открывает Web-страницу. Все необходимые файлы будет загружены в систему пользователя автоматически, если там установлена технология Web Start и пользователь открыл нужную страницу.

Я просто-таки восхищен этой технологией, тем не менее, достаточно мало ис­пользую ее в своей работе. Именно поэтому она и не будет рассматриваться в книге.

Для создания исполняемых файлов с помощью мастера Archive Builder советую воспользоваться технологией, предоставляемой компанией Borland. Я считаю, что это наиболее простой способ развертывания Java-программ. Во многих случаях можно использовать и простые JAR-файлы.

Трудности

Самая большая трудность, с которой довелось мне столкнуться при развертыва­нии Java-приложений, заключается не в создании JAR-файлов или исполняемых файлов. Проблема связана с несоответствием создаваемых приложений и JRE или JDK на машинах, на которых эти приложения будут использоваться. Честно говоря, компания Sun была недостаточно внимательной в вопросе обеспечения обратной совместимости версий JDK. Так, например, даже Java-программы, написанные спе­циалистами из самой компании Sun для Java 1.2, не всегда работают под Java 1.4.

Как результат, иногда возникает необходимость в проверке версии Java, на кото­рой выполняется программа:

Public static final String version =

System. getProperty("java. version");

Эту информацию можно получить с помощью класса System или констант, хра­нящихся В файле com. elvenware. codebox. FileBox. java.

Резюме

В этой главе вы научились создавать JAR-файлы и исполняемые файлы из исход­ного кода программ. Описание получилось несколько затянутым, но на практике мастер Archive Builder представляет собой чрезвычайно простое в средство. Во мно­гих случаях с его помощью мне удавалось создать архив или исполняемый файл за каких-нибудь несколько секунд.

JAR-файлы также будут рассматриваться в частях VII и VlII книги. Кроме того, вы обнаружите, что большинство приложений, входящих в состав сопровождающих книгу материалов, для создания JAR-файлов используют Ant-сценарии В тех же со­провождающих материалах можно найти и архивы для многих примеров, присут­ствующих в книге.

Часть Vl

Тестирование, отладка
и сопровождение

В этой части

29 Отладчик

30 Тестирование блоков с помощью JUnit

31 Корректировка связей и UML

32 Введение в OpenTooIs API

Чарли Калверт

Глава 29

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *