Збірка і виконання java програм

збірка проекту

Збірка (англ. Assembly) - двійковий файл, який містить виконуваний код програми або (рідше) іншої підготовлений для використання інформаційний продукт.

Автоматизація складання - етап написання скриптів або автоматизація широкого спектра завдань стосовно ПО, що застосовується розробниками в їх повсякденній діяльності, включаючи такі дії, як:

  1. компіляція вихідного коду в бінарний код
  2. збірка бінарного коду
  3. виконання тестів
  4. розгортання програми на виробничій платформі
  5. написання супровідної документації або опис змін нової версії

Для автоматизації збирання проектів традиційно використовують системи збирання, такі як make на Unix подібних системах і nmake для компілятора Microsoft. Також традиційно написання файлів для збірки проекту під ці системи є завданням нетривіальною. Звичайно, користуючись тільки Mictosoft Visual Studio можна навіть не підозрювати про існування цих файлів, так як інтегроване середовище розробки досить зручно приховує всю схему роботи, залишаючи зовні кілька діалогових вікон і кнопку Build. Але для складних проектів використовують масу сторонніх бібліотек і кроссплатформенних проектів такий підхід часто виявляється неприйнятним.

Принципи складання в java

1. Як працює java компілятор

Текст програми --- \

-> Javac -----> * .class

Доповнення - [-cp] - /

Текст програми - це вихідний код програми на мові java.

Додатки - це класи, які необхідно враховувати під час складання (бібліотеки).

У підсумку ми отримуємо набір файлів з розширенням class. Тобто, якщо ми використовуємо сторонні бібліотеки - ми повинні вказати їх при складанні. Це можуть бути скомпільовані класи або зібрані підсистеми.

Не завжди для компіляції необхідно вказувати додаткові бібліотеки (наприклад, якщо у нас програма в 1 програмний файл). Але якщо все ж це необхідно, то для цього компілятор java необхідно запустити з аргументом «-cp» (скорочення від -classpath). Після цього аргументу йде список бібліотек (jar файлів або файлів class) розділених символом роздільником файлів (в * nix це «:», в windows це «;»).

Приклад компіляції програми з одного файлу:

Приклад компіляції програми c додатковими бібліотеками «myLib» і «my2ndLib»:

javac -cp myLib.jar: my2ndLib.jar NotStandartHelloWorld.java

У java немає розмежування між зібраної бібліотекою, виконуваним додатком або ж підсистемою. Що мається на увазі, що якщо ви хочете створити самостійну сутність в єдиному файлі, ви створюєте jar файл. Наприклад, якщо ви створюєте бібліотеку, то це буде jar файл з набором класів, який можуть бути використаний іншими розробниками, якщо це підсистема, то це частина функціоналу (набір класів) винесена за рамки основного модуля, але використовувана в ньому (щось на зразок приватної бібліотеки), і т.д ..

2. Виконання java-програми.

* .class ----- --- \

Доповнення - [-cp] - /

Виконання класів працює схожим чином з компіляцією (використовуються навіть ті ж аргументи).

Якщо після компіляції у нас вийшло 10 класів, то виконуємо тільки клас який містить функцію main, інші класи повинні бути представлені як бібліотеки.

Наприклад, запуск програми c додатковими бібліотекою «sout», яка знаходитися в папку «lib» виглядати так:

java -cp lib / sout.jar HelloWorld

За замовчуванням, всі класи в поточному каталоги включені в дорозі (-cp для класів в поточному каталозі вказувати не треба). Що мається на увазі, якщо ми скомпілювали програму, і в підсумку отримали безліч класів в одній папці, то ми можемо запускати тільки головний клас, інші класи java спробує знайти сама в поточному каталозі (Навіть якщо вони знаходяться у вкладених папках, java і туди загляне).

Такий підхід допустимо, коли у нас трохи класів, але при великих системах перерахування всіх класів неможливо (їх кількість може перевищувати тисячі ...). Тому можна виконувати не клас, а спеціально зібраний jar-файл. Для цього необхідно вказати аргументи -jar.

3. Jar-файл

Jar-файл - це ZIP архів (тобто ви можете розпакувати його). Jar-файл повинен в собі містити набір класів і файл META-INF / MANIFEST.MF, в якому описані характеристики даного jar-файлу.

Основний варіант створення Jar-файлу:
jar cf jar-file input-file (s)

Jar - це утиліта і набору утиліт які ви отримуєте при установці java.

Програма jar приймає аргументи на old-UNIX стилі: спочатку йдуть ключі потім аргументи програми, ключ з аргументом вказується останнім, не вказувати «-» перед аргументами, групувати короткі аргументи ( «cf» означає «-c -f»).

  1. Опція c - говорить про те, що ви хочете створити (create) jar-файл.
  2. Опція f - говорить про те, що ви хочете створити файл (file) з певним ім'ям (при виконанні даного прикладу створиться файл з ім'ям «jar-file.jar»).
  3. Аргумент input-file (s) є розділений пробілами список з одного або декількох файлів, які ви хочете включити в ваш JAR-файл. input-file (s) аргумент може містити символ «*». Якщо будь-який з вхідних є каталогом, вміст цих каталогів додаються в архів JAR рекурсивно.

Коли ви створюєте JAR-файл, він автоматично отримує файл маніфесту за замовчуванням (якщо ви його не вказали у вхідних файлах - він буде створений автоматично). У jar-файлі може бути тільки один файл маніфесту з зазначеним шляхом:

Загальна структура маніфесту має вигляд:

Manifest-Version: 1.0Созданная-By: 1.6.0 (Sun Microsystems Inc)

Ці рядки показують, що елементи маніфесту мають форму «заголовок: значення» пар. Ім'я заголовка відділяється від її значення двокрапкою. Маніфест за замовчуванням відповідає версії 1.0 специфікації маніфест і був створений 1.6.0 версії JDK.

Маніфест також можуть містити інформацію про інших файлах, що не упаковані в архів (зовнішні бібліотеки який необхідні для функціонування, про це буде сказано більш докладно далі). Саме те, що інформацію про jar-файлі повинна бути записані в маніфесті залежить від того, як ви збираєтеся використовувати JAR-файл. Маніфест за замовчуванням не робить ніяких припущень про те, яку інформацію він повинен записати про інших файлах.

Щоб створити jar-файл з маніфестом:
jar cfm jar-file manifest-addition input-file (s)

Ключ «f» і «m» обидва вимагають аргументів, тому ми спочатку вказуємо ключі, а потім в тому ж порядку вказуємо (якщо це необхідно) відсутню аргументи. На початку ми вказали аргумент «f», а потім «m», тому перший аргумент буде ім'я вихідного файлу, а другий це ім'я (і шлях) до маніфесту.

Якщо в написаному вами маніфесті НЕ буде однією з вище зазначених опцій, то вони будуть додані автоматично (тобто, ну вказати маніфест або вказати порожній файл, це одне і те ж, це часто може бути застосовано на початку розробки ...). Те, тобто якщо ваш маніфест виглядає наступним чином:

Те, в підсумковому jar-файлі він буде представлений у вигляді:

Manifest-Version: 1.0Созданная-By: 1.6.0 (Sun Microsystems Inc) Main-Class: Main

Якщо ви розробляєте додаток. яке поставляється в JAR-файл, необхідно якимось чином вказати, який клас в JAR-файлі є вхідний точкою докладання (який містить функцію main). Ви надаєте цю інформацію з Main-Class заголовка в маніфесті, який має загальний вигляд:

Main-Class: ім'я класу

Значення імені класу є ім'ям класу, який є вхідний точкою докладання.

Після того як ви встановите Main-Class заголовка в маніфесті, ви запустите файл JAR за допомогою наступної форми Java команду:

Чи не вказавши головного класу в маніфесті вам надати виконувати вашу програму так:

Якщо ви хочете вказати лише головний клас в маніфесті, то вам не потрібно створювати весь маніфест, ви можете вказати, необхідні параметр при виклику jar:

jar cfe app.jar MyApp MyApp.class

Опція e - говорить про точки входу в програму (entrypoint).

Вам доведеться посилатися на класи в інші файли JAR з JAR-файлу (якщо ви використовуєте сторонні бібліотеки в своєму додатку). Для цього вам необхідно включити такі поля в маніфест:

Class-Path: jar1-name jar2-name directory-name / jar3-name

Даний шлях вказується щодо розташуванню виконуваного jar файлу. Наприклад, Netbeans складає все бібліотеки в папку lib, яку поміщає поруч із зібраним додатком, і відповідно вказує шлях до бібліотек.

Розглянемо кінцевий приклад маніфесту, для виконуваного jar-файлу бібліотеки до якого перебувають поруч з ним в папці «lib»:

Manifest-Version: 1.0Созданная-By: 1.6.0 (Sun Microsystems Inc) Main-Class: net.mycompany.product1.MainClass-Path: lib / recoder.jar lib / io-common.jar lib / f