You are on page 1of 7

6. Розгортання додатків Java.

6.1. Архівні JAR-файли.


Додаток зазвичай упаковується для того, щоб надати в розпорядження
користувача єдиний файл, а не цілу структуру каталогів, заповнену файлами
класів. Спеціально для цієї мети був розроблений формат архівних файлів Java
Archive (JAR). Файл формату JAR (надалі просто JAR-файл) може містити, крім
файлів класів, файли інших типів, в тому числі файли зображень і звуку. Більш
того, JAR-файли ущільнюються по широко відомим алгоритмом стиснення даних в
форматі ZIP.
Створення JAR-файлів
Для створення JAR-файлів служить утиліта jar. (В JDK утиліта jar розташовується
в каталозі jdk/bin.) Новий JAR-файл створюється в командному рядку так:
jar cvf імяJAR-файлу Файл_1 Файл_2
Наприклад:
jar cvf CalculatorClasses.jar *.java icon.gif
Нижче наведена загальна форма команди jar.
jar параметри Файл_1 Файл_2
Параметри утиліти jar

У архівні JAR-файли можна упаковувати прикладні програми, програмні


компоненти (іноді звані beans, оскільки вони відносяться до розряду компонентів
JavaBeans), а також бібліотеки коду. Наприклад, бібліотека робочих програм JDK
міститься в дуже великому файлі rt.jar.
Файл маніфесту
Крім файлів класів, зображень та інших ресурсів, кожен архівний JAR- файл
містить також файл маніфесту, що описує особливі характеристики даного архіву.
Файл маніфесту називається MANIFEST.MF і знаходиться в спеціальному
підкаталозі архіву МЕТА-INF. Мінімально допустимий маніфест не дуже цікавий, як
показано нижче.
Manifest-Version: 1.0
Складні маніфести містять багато більше елементів опису, згрупованих за
розділами. Перший розділ маніфесту називається головним. Він відноситься до
всього JAR-файлу. Інші елементи опису відносяться до окремих файлів, пакетам
або URL. Ці елементи повинні починатися зі слова Name. Розділи
відокремлюються одна від одної порожніми рядками, як показано в наведеному
нижче прикладі.
Manifest-Version: 1.0
рядки опису даного архіву

Name: Woozle.class
рядки опису даного архіву

Name: com/mycompany/mypkg/
рядки опису даного архіву

Щоб відредагувати цей маніфест, досить ввести в нього потрібні рядки, зберігши їх
у звичайному текстовому файлі, а потім виконати наступну команду:
jar cfm імяJAR-файлу імяФайлаМаніфеста
Наприклад, для того щоб створити новий JAR-файл з маніфестом, потрібно
викликати утиліту jar з командного рядка таким чином:
jar cfm MyArchive.jar manifest.mf com/mycompany/mypkg/*.class
Щоб додати в маніфест існуючого JAR-файлу нові рядки, достатньо ввести і
зберегти їх в текстовому файлі, а потім виконати наступну команду:
jar ufm MyArchive.jar manfest-additions.mf
Виконувані JAR-файли
За допомогою параметра е утиліти jar можна вказати точку входу в прикладну
програму, тобто клас, який зазвичай вказується при запуску програми по команді
java, як показано нижче.
jar cvfe MyProgram.jar com.mycompany.mypkg.MainAppClass
доп.файли
З іншого боку, в маніфесті можна вказати головний клас прикладної програми,
включаючи оператор в такій формі:
Main-Class: com.mycompany.mypkg.MainAppClass
Не додавайте розширення .class до імені головного класу. Незалежно від способу
вказівки точки входу в прикладну програму її користувачі можуть запустити її на
виконання, ввівши таку команду:
java -jar MyProgram.jar
УВАГА! Останній рядок у маніфесті повинна закінчуватися символом перекладу рядка.
Інакше маніфест НЕ буде прочитаний правильно. Дуже поширена помилка, коли
створюється текстовий файл з єдиним рядком Main-Class, але без обмежувача рядка.
Залежно від конфігурації операційної системи додатки можна запускати подвійним
клацанням на піктограмі JAR-файлу. Нижче описуються особливості запуску
додатків з JAR-файлів в різних операційних системах.
• У Windows інсталятор виконуючої системи Java утворює зіставлення файлів з
розширенням .jar для запуску подібних файлів по команді javaw -jar. (На відміну
від команди java, команда javaw не відчиняє вікно командного оболонки.)
• У Solaris операційна система розпізнає "магічне число" (тобто системний код)
JAR-файлу і запускає його по команді java -jar.
• У Mac OS операційна система розпізнає розширення файл з розширенням .jar і
виконує програму на Java після подвійного клацання на JAR-файлі.
Ресурси
Класи, що застосовуються в додатках, часто асоціюються з файлами даних.
Нижче перераховані приклади таких файлів. Всі ці файли в Java називаються
ресурсами.
• Графічні та звукові файли.
• Текстові файли, що містять рядки повідомлень і мітки кнопок.
• Файли, що містять двійкові дані, наприклад, для опису розмітки карти.
Завантажувачу класів відомо, де знаходяться файли класів, якщо вони містяться в
каталогах, зазначених у змінній оточення CLASSPATH, в архіві або на веб-сервері.
Механізм ресурсів надає аналогічні зручності і при поводженні з файлами, які не є
файлами класів. Для цього необхідно виконати наступні дії.
1. Отримати об'єкт типу Class, який має ресурс.
2. Якщо ресурс являє собою графічний або звуковий файл, викликати метод
getResource(їм’я_файла), щоб визначити місцезнаходження ресурсу у вигляді
URL. Потім прочитати його безпосередньо за допомогою методу getlmage() або
getAudioClip().
3. Якщо ресурс не є графічним або звуковим файлом, викликати метод
getResourceAsStream(), щоб прочитати дані з файлу.
Справа в тому, що завантажувач класу пам'ятає, де розташовується клас, і може
виявити там же файли ресурсів. Наприклад, щоб створити піктограму, що
зберігається в файлі about.gif, слід скористатися наведеними нижче фрагментом
коду. Цей код, по суті, означає наступне: "шукати файл about.gif там же, де
знаходився файл ResourceTest.class".
URL url = ResourceTest.class.getResource("about.gif");
Image img = new Imagelcon(url).getlmage();
Щоб прочитати вміст файлу about.txt, потрібно написати наступний фрагмент
коду:
InputStream stream =
ResourceTest.class.getResourceAsStream("about.txt");
Scanner in = new Scanner(stream);
Ресурси зовсім не обов'язково розміщувати в одному каталозі з файлом класів.
Замість цього їх можна розмістити в підкаталозі. Ім'я ресурсу з урахуванням
ієрархії підкаталогів виглядає наступним чином:
data/text/about.txt
Це відносне ім'я ресурсу, тому завжди визначаються відповідними пакета, до якого
належить клас, що завантажує цей ресурс. Зверніть увагу на те, що в цьому імені
завжди потрібно використовувати роздільник /, незалежно від тих роздільників, які
застосовуються в операційній системі. Наприклад, на платформі Windows
завантажувач ресурсів автоматично перетворює знак / в роздільник \.
Ім'я ресурсу, що починається зі знака /, називається абсолютним. З цього імені
ресурс виявляється точно так же, як і клас. Наприклад, наведений нижче ресурс
знаходиться в каталозі corejava. Він може бути підкаталогом одного з каталогів,
зазначених у змінній оточення CLASSPATH, перебувати в JAR-файлі і т.д.
/corejava/title.txt
Приклад «Хорстманн. Java. Бібліотека професіонала, том 1. Основи. 10-е
видання », стор 699. (corejava10.zip\corejava\v1ch13\resource)
У прикладі демонструється порядок завантаження ресурсів. Скомпілюйте, зберіть
архівний JAR-файл і запустіть його на виконання, виконавши наступні команди:
javac resource/ResourceTest.java
jar cvfm ResourceTest.jar resource/ResourceTest.mf
resource/*.class resource/*.gif resource/*.txt
java -jar ResourceTest.jar
Перемістіть отриманий в результаті JAR-файл в інший каталог і запустіть його
знову, щоб переконатися, що програма прочитає все, що їй потрібно, з JAR-
файлу, а не з поточного каталогу.
JAR-файл і ресурси в eclipse
При компіляції проекту в eclipse потрібно створити папку для ресурсів (наприклад
res) і помістити в неї файли about.gif, about.txt.
Щоб додати папку res.
Властивості проекту (Project-Properties) → Шлях збірки (Java Build Path) →
вкладка Джерело (Source) → Додати папку (Add Folder) → Створити нову папку
(Create new Folder).
Щоб зробити в eclipse файл з розширенням .jar.
File → Export → Java → Runnable JAR file → Вибрати проект і шлях-ім'я для
JAR-файлу
JAR-файл і ресурси в IntelliJ IDEA
При компіляції проекту в IntelliJ IDEA потрібно створити папку для ресурсів (res) і
помістити в неї файли about.gif, about.txt.
Папка res створюється на одному рівні з scr. Клацнути правою кнопкою миші
папку, вибрати Відзначити каталог як (Mark Directory as) → корень ресурсов
(Resources Root)
Щоб зробити в IntelliJ файл з розширенням .jar.
File → Project structure → Artifacts → + → Jar → From modules with
dependencies. Вибираємо головний клас. ОК.
Далі створюємо файл Jar:
Build → Build Artifact
6.2. Збереження параметрів налаштування додатків.
Користувачі додатків зазвичай очікують, що бажані ними налаштування параметрів
будуть збережені, а при наступному запуску додатка відновлені.
Таблиця властивостей
Таблиця властивостей являє собою структуру даних, в якій зберігаються пари
"ключ-значення". Такі таблиці нерідко використовуються для зберігання
відомостей про параметри налаштування додатків і відрізняються трьома
характеристиками.
• Ключі та значення представлені символьними рядками.
• Всю структуру даних легко записати і прочитати з файлу.
• Є допоміжна таблиця для значень, що встановлюються за замовчуванням.
Таблиці властивостей реалізуються в класі Properties. Вони дуже зручні для
позначення різних варіантів настройки прикладних програм, як показано в
наведеному нижче прикладі коду.
Properties settings = new Properties();
settings.put("width","200");
settings.put("title","Hello, World!");
Для запису списку властивостей в файл служить метод store(). У наведеному
нижче прикладі коду таблиця властивостей просто виводиться в файл
program.properties. А в якості другого параметра при виклику методу store()
вказуються коментарі, які включаються в файл.
OutputStream out = new FileOutputStream("program.properties");
settings.store(out,"Program Properties");
В результаті виконання даного фрагмента коду будуть виведені наступні
властивості зі збереженими параметрами налаштування прикладної програми:
#Program Properties
#Mon Apr 30 7:22:52 2007
width = 200
title = Hello, World!
Для завантаження цих властивостей з файлу служить наведений нижче фрагмент
коду.
InputStream in = new FilelnputStream("program.properties");
settings.load(in);
Зазвичай властивості програми прийнято зберігати в підкаталозі початкового
каталогу користувача. Ім'я такого каталогу часто починається з точки - в системі
UNIX ця угода свідчить про системний каталог, прихований від користувача. Саме
таке умовне позначення застосовується в програмі, що розглядається тут в якості
прикладу.
Щоб знайти початковий каталог користувача, досить викликати метод
System.getProperties(), в якому, як виявляється, об'єкт типу Properties також
служить для опису системної інформації. У початкового каталогу є ключ
''user.home". Для читання одиночного ключа передбачений наступний службовий
метод:
String userDir = System.getProperty("user.home");
Якщо користувач даної програми збирається правити файл з таблицею
властивостей вручну, то доцільно надати значення її властивостей, що
встановлюються за замовчуванням. Для цієї мети в класі Properties передбачені
два механізми. Перш за все для пошуку значення в символьної рядку можна
вказати значення за замовчуванням, яке повинно вибиратися автоматично за
відсутності відповідного ключа, як показано нижче.
String title = settings.getProperty("title", "Default title");
Якщо в таблиці властивостей є властивість "title", то змінній title присвоюється
символьний рядок з даними властивістю. В іншому випадку змінній title
присвоюється задається за замовчуванням символьний рядок "Default title".
Якщо ж ставити значення за замовчуванням при кожному виклику методу
getProperty() занадто утомливо, то всі значення, що встановлюються за
замовчуванням, можна ввести в допоміжну таблицю властивостей і передати її
конструктору основної таблиці властивостей:
Properties defaultSettings = new Properties();
defaultSettings.put("width", "300");
defaultSettings.put("height", "200");
defaultSettings.put("title", "Default title");
Properties settings = new Properties(defaultSettings);
Приклад «Хорстманн. Java. Бібліотека професіонала, том 1. Основи. 10-е
видання », стор 702. (corejava10.zip\corejava\v1ch13\properties)
У прикладі показано, як користуватися властивостями для збереження і
завантаження стану програми. Ця програма запам'ятовує положення, розміри і
заголовок фрейму. У її користувача є також можливість відредагувати вручну файл
.corejava/program.properties в своєму початковому каталозі, щоб надати цій
програмі необхідний зовнішній вигляд.

You might also like