что такое сборка проекта java

Сборка и выполнение Java программ

Сборка проекта

Сборка (англ. assembly) — двоичный файл, содержащий исполняемый код программы или (реже) другой подготовленный для использования информационный продукт.

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

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

Принципы сборки в java

1. Как работает java компилятор

Текст программы — это исходный код программы на языке java.

Дополнения — это классы, которые необходимо учитывать во время сборки (библиотеки).

В итоге мы получаем набор файлов с расширением class. То есть, если мы используем сторонние библиотеки – мы должны указать их при сборке. Это могут быть скомпилированные классы или собранные подсистемы.

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

Пример компиляции программы из одного файла:

javacHelloWorld.java

Пример компиляции программы c дополнительными библиотеками «myLib» и «my2ndLib»:

В java нет разграничения между собранной библиотекой, исполняемым приложением или же подсистемой. Что имеется в виду, что если вы хотите создать самостоятельную сущность в едином файле, вы создаёте jar файл. К примеру, если вы создаёте библиотеку, то это будет jar файл с набором классов, который могут быть использованный другими разработчиками, если это подсистема, то это часть функционала (набор классов) вынесенная за рамки основного модуля, но используемая в нём (что то вроде частной библиотеки), и т.д..

2. Выполнение java-программы.

Выполнение классов работает схожим образом с компиляцией (используются даже те же аргументы).

Если после компиляции у нас получилось 10 классов, то выполняем только класс который содержит функцию main, остальные классы должны быть представлены как библиотеки.

К примеру, запуск программы c дополнительными библиотекой «sout», которая находиться в папку «lib» выглядеть так:

По умолчанию, все классы в текущем каталоги включены в пути (-cp для классов в текущем каталоге указывать не надо). Что имеется в виду, если мы скомпилировали программу, и в итоге получили множество классов в одной папке, то мы можем запускать только лишь главный класс, остальные классы java попробует найти сама в текущем каталоге (Даже если они находятся во вложенных папках, java и туда заглянет).

3. Jar-файл

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

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

Jar – это утилита и набора утилит которые вы получаете при установке java.

Когда вы создаете JAR-файл, он автоматически получает файл манифеста по умолчанию (если вы его не указали во входных файлах – он будет создан автоматически). В jar-файле может быть только один файл манифеста с указанным путём:

Общая структура манифеста имеет вид:

Заголовок: значение

Все символы пробелов (\n, \r, \t, …) в «значении» будут удалены, к примеру, манифест:

Manifest-Version:1.0Созданная-By:1.6.0

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

Когда вы создаете 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»:

Источник

Руководство по Java 9: компиляция и запуск проекта

Авторизуйтесь

Руководство по Java 9: компиляция и запуск проекта

Установка Java 9

Сперва необходимо установить Java 9. Вы можете скачать её с сайта Oracle, но рекомендуется использовать SdkMAN!, так как в будущем он позволит вам с легкостью переключаться между разными версиями Java.

Можно установить SdkMAN! с помощью этой команды:

Посмотрите, какая сборка является последней:

Затем установите Java 9:

Теперь, если у вас установлены другие версии Java, вы можете переключаться между ними с помощью команды:

Компиляция и запуск «по-старому»

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

Возьмем этот простой Java-класс:

Теперь, так как мы не использовали никаких особенностей Java 9, мы можем скомпилировать всё как обычно:

4–5 декабря, Онлайн, Беcплатно

Теперь создадим библиотеку Greeting также без особенностей Java 9, чтобы посмотреть, как это работает.

Создадим файл greeting/ser/lib/Greeting.java со следующим кодом:

Изменим класс Main для использования нашей библиотеки:

Скомпилируем эту библиотеку:

Чтобы показать, как работают оригинальные Java-библиотеки, мы превратим эту библиотеку в jar-файл без дескрипторов модулей Java 9:

Просмотреть информацию о jar-файле можно с помощью опции tf :

Команда должна вывести:

Используем для этого cp (classpath):

И то же самое для запуска программы:

Мы можем упаковать приложение в jar-файл:

И затем запустить его:

Вот так выглядит структура нашего проекта на данный момент:

Модуляризация проекта

Пока что ничего нового, но давайте начнем модуляризацию нашего проекта. Для этого создадим модульный дескриптор (всегда называется module-info.java и размещается в корневой директории src/ ):

Команда для компиляции модуля в Java 9 отличается от того, что мы видели раньше. Использование старой команды с добавлением модуля к списку файлов приводит к ошибке:

Чтобы понять, почему наш код не компилируется, необходимо понять, что такое безымянные модули.

Любой класс, который загружается не из именованного модуля, автоматически выполняет часть безымянного модуля. В примере выше перед созданием модульного дескриптора наш код не был частью какого-либо модуля, следовательно, он был ассоциирован с безымянным модулем. Безымянный модуль — это механизм совместимости. Проще говоря, это позволяет разработчику использовать в приложениях Java 9 код, который не был модуляризирован. По этой причине код, относящийся к безымянному модулю, имеет правила сродни Java 8 и ранее: он может видеть все пакеты, экспортируемые из других модулей, и все пакеты безымянного модуля.

Модули в Java 9, за исключением неуловимого безымянного модуля описанного выше, должны объявлять, какие другие модули им необходимы. В случае с модулем com.app единственным требованием является библиотека Greeting. Но, как вы могли догадаться, эта библиотека (как и другие библиотеки, не поддерживающие Java 9) не является модулем Java 9. Как же нам включить её в проект?

В таком случае вам нужно знать имя jar-файла. Если у вас есть зависимость от библиотеки, которая не была конвертирована в модуль Java 9, вам надо знать, какой jar-файл вызывается для этой библиотеки, потому что Java 9 переведёт имя файла в валидный модуль.

Это называется автоматический модуль.

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

Для создания и использования app.jar в качестве исполняемого jar-файла выполните следующие команды:

Следующим шагом будет модуляризация библиотек, которые используются нашим приложением.

Модуляризация библиотек

Для модуляризации библиотеки нельзя сделать ничего лучше, чем использовать jdeps — инструмент для статистического анализа, который является частью Java SE.

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

А вот результат её выполнения:

Как и ожидалось, библиотека зависит только от java.base модуля.

Хорошо, но можно лучше. Мы можем попросить jdeps автоматически сгенерировать модульный дескриптор для набора jar-файлов. Просто укажите ему, куда сохранять сгенерированные файлы (например, в папку generated-mods ), и где находятся jar-файлы:

Команда создаст два файла: generated-mods/app/module-info.java и generated-mods/greetings/module-info.java со следующим содержимым:

Теперь мы можем добавить сгенерированный дескриптор для нашей библиотеки в её исходный код, переупаковать её, и у нас получится полностью модульное приложение:

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

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

Наиболее простым способом получить список всех jar-файлов, которые используются в библиотеке, является использование скрипта Gradle. Он выведет пути локальных jar-файлов для всех зависимостей библиотек, которые вы добавите в секцию зависимостей, и скачает их, если необходимо:

Если у вас нет Gradle, вы можете использовать SdkMAN! для его установки:

Для получения списка зависимостей используйте следующую команду:

Полученную информацию передайте jdeps для анализа и автоматической генерации метаданных.

Это файл, который jdeps выводит для javaslang.match :

Создание собственного образа среды выполнения

С помощью jlink Java-приложения могут распространяться как образы, которые не требуют установки JVM.

Следующая команда создает образ для нашего com.app модуля без оптимизации, сжатия или отладочной информации:

Для запуска приложения используйте предоставляемый лаунчер в директории bin :

На этом всё. Разбор нововведений в Java 9 предлагаем прочитать в нашей статье.

Источник

Автоматизированные сборки в Java

Введение

Сборка (англ. assembly) — двоичный файл, содержащий исполняемый код программы или (реже) другой подготовленный для использования информационный продукт.

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

1. компиляция исходного кода в бинарный код

2. сборка бинарного кода

3. выполнение тестов

4. разворачивание программы на производственной платформе

5. написание сопроводительной документации или описание изменений новой версии

Автоматизированные сборки jar файлов.

Чтобы автоматизировать данные процессы и уменьшить участие программиста в сборке были созданы автоматизированные сборщики java-программ (На подобии уже существующих альтернатив в других языках).

Ant the Java build tool

Ant (http://ant.apache.org/) стал логическим продолжением make, схожий по принципу работы инструмент, основной задачей которого была обеспечить автоматизацию и мульти платформенность процесса сборки Java приложений.

В отличие от make, в Ant используется несколько иной подход к описанию целей и зависимостей между ними. В Ant понятие цели не привязано к некоторому файлу, и является описанием некоторого действия. Также отличается формат Make файлов, Ant использует XML разметку вместо простого текста и не требует обязательного использования символа табуляции для выделения команд, в случае make.

Приведем пример build.xml:

name = «Hello» default = «compile» >

description = «compile the Java source code to class files» >

srcdir = «.» destdir = «classes» />

name = «jar» depends = «compile»

description = «create a Jar file for the application» >

dir = «classes» includes = «**/*.class» />

Здесь объявляются 2 цели(target): compile и jar. Цель jar также объявляет зависимость от цели compile, и это означает, что прежде чемAnt начнет выполнение цели jar, он должен сначала выполнить цель compile. Базовая форма описания цели выглядит следующим образом:

name = «D» depends = «C,B,A» />

Атрибут name уникальным образом объявляет название цели, а атрибут depends указывает, какие цели должны быть завершены перед выполнением текущей цели. Стиль исполнения build скрипта, основанный на достижении целей и разрешении их зависимостей, заметно отличается от обычного императивного стиля программирования и является, пожалуй, наиболее характерной чертой современных build инструментов.

Внутри каждой цели располагается список задач, которые необходимо совершить. К примеру, чтобы завершить цель compile, Antдолжен сначала создать директорию classes(задача ) и затем вызвать javac компилятор (задача ).

Ant выполняет каждую цель только один раз, поэтому можно не беспокоится о возможных накладных расходах, связанных с выполнением одной и той же цели несколько раз, при объявлении вложенных или рекурсивных зависимостей. При выполнении в нём есть стек выполненных операций, если операция была выполнена, то она не будет выполняться ещё раз. В отличие от make Ant максимально абстрагируется от низкоуровневых системных вызовов, к примеру, следующая команда make:

имеет следующий аналог в Ant:

Это позволяет свободно выполнять один и тот же build как на Windows, так и на *nix подобных системах.

В базовом случае Ant используется из командной строки схожим с make образом:

$ ant target_name

Это приведет к чтению файла build.xml из текущей директории и выполнению цели target_name.

Maven

Для платформы Java существуют два основных инструмента для сборки: Ant и Maven.

Основные преимущества Maven:

Независимость от OS. Сборка проекта происходит в любой операционной системе. Файл проекта один и тот же.

Декларативное описание проекта.

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

В основе проекта Maven, как и в анте, лежит xml описание проекта, но для Mavenа мы можем сгенерировать описание из архетипа. Архетип определяется как оригинальный образец или модель, из которой все другие вещи того же рода делаются. В Maven архетип, шаблон проекта, который в сочетании с некоторым вводом данных пользователем получаем рабочий Maven проект.

mvn archetype: generate

Maven Quick Start Archetype

pom.xml содержит модель объекта проекта (Project Object Model). POM содержит все важная информация о вашем проекте. Это очень простой POM, но содержит ключевые элементы. Рассмотрим каждый из них, чтобы ознакомить вас с POM :

project этот элемент верхнего уровня во всех файлов pom.xml Maven.

modelVersion этот элемент указывает, какую версию объектной модели этого POM использует.

groupId этот элемент указывает на уникальный идентификатор организации или группы, которые создали проект. GroupId является одним из ключевых идентификаторов проекта и, как правило, основаны на полное доменное имя вашей организации. Например org.apache.maven.plugins является назначенным GroupId для всех Maven плагинов.

packaging этот элемент указывает на тип пакета, который будет использоваться этот артефакт (например, JAR, WAR, EAR и др.). Это не только означает, что если артефакт произведенного JAR, WAR, или EAR, но также может указывать на конкретного жизненного цикла для использования в качестве части процесса сборки. EAR – это если нам от какого либо проекта не нужен jar файл (к рутовый проект который содержит в себе лишь описание). В зависимости от того какой тип вы выберете, такая сборка и будет (Сборка для веб приложение отличается от настольного …).

version этот элемент указывает на версию артефакта, генерируемых проектом. Maven проходит долгий путь, чтобы помочь вам в управление версиями, и вы часто будете видеть SNAPSHOT обозначение в версии, которая указывает, что проект находится в состоянии развития.

name этот элемент указывает отображаемое имя для проекта. Это часто используется в генерации документации Maven (Это так же может быть имя проекта в Nenbeans).

url этот элемент указывает, где можно найти сайте проекта. Это часто используется в генерации документации Maven.

description Этот элемент представляет собой общее описание вашего проекта. Это часто используется в генерации документации Maven.

Также будет создана структура проекта:

Одно из основных отличий Maven в том что цели жизненного цикла сборки уже определены, вы только можете вызывать определённую цели или же настраивать её под свои нужды. Вот список целей:

· validate — проверяет корректность метаинформации о проекте

· compile — компилирует исходные коды

· test — выполняет тесты классов из предыдущего шага

· package — упаковывает скомпилированые классы в удобно перемещаемый формат (jar или war, к примеру)

· integration-test — отправляет упакованные классы в среду интеграционного тестирования и выполняет тесты

· verify — проверяет корректность пакета и удовлетворение требованиям качества

· install — переносит пакет в локальный репозиторий, откуда он (пекат) будет доступен для использования как зависимость в других проектах

· deploy — отправляет пакет на удаленный production сервер, откуда другие разработчики его могут получить и использовать

При этом все шаги последовательны. И если, к примеру, выполнить «mvn package», то фактически будут выполнены шаги: validate, compile, test и package. Таким образом использовать Maven довольно просто. Написали код, выполнили mvn test и можно работать дальше, убедившись что код не содержит синтаксических и логических ошибок.

Зависимости

Сейчас наш проект в зависимости от JUnit только. Для каждой внешней зависимости, вам необходимо определить, по крайней мере, 4 вещи: groupId, artifactId, version, и scope.

Плагины

Всякий раз, когда вы хотите настроить построить для проекта Maven, это делается путем добавления или перенастройки плагинов.

К примеру, мы разрабатываем систему используя jdk 1.6, а пользователи будут использовать jdk 1.4. В этом случае нам необходимо указать итоговую версию jar-файла, и Maven включит в неё все недостающие части.

Источник

Сборка Java-проекта с использованием Maven

Этот урок освещает создание вами простого Java-приложения с использованием Maven.

Что вы создадите

Вы создадите простое приложение и соберете его с помощью Maven.

Что вам потребуется

Как проходить этот урок

Как и большинство уроков по Spring, вы можете начать с нуля и выполнять каждый шаг, либо пропустить базовые шаги, которые вам уже знакомы. В любом случае, вы в конечном итоге получите рабочий код.

Чтобы начать с нуля, перейдите в Настройка проекта.

Настройка проекта

Для начала вам необходимо настроить Java-проект перед тем, как собрать его Maven’ом. Т.к. урок посвящен Maven, сделаем проект максимально простым, насколько это возможно.

Создание структуры каталогов

Теперь, когда у вас есть проект, который вы можете собрать с Maven, вам нужно установит сам Maven.

Maven можно получить, скачав zip-файл с maven.apache.org/download.cgi. Необходимы только бинарные файлы, так что ищите ссылку на архив с именем apache-maven-version-bin.zip или apache-maven-version-bin.tar.gz.

Распакуйте архив и добавьте путь к каталогу bin в переменную окружения path.

Чтобы протестировать правильность установки Maven, запустите в командной строке:

Если всё было сделано правильно, то вы увидите сообщение примерно такого содержания:

Теперь у вас есть установленный Maven.

Создание простой сборки Maven

Теперь, когда Maven установлен, вам необходимо создать определение Maven-проекта. Maven-проекты определяются как XML-файлы с названием pom.xml. Помимо всего прочего, этот файл определяет имя проекта, версию, а также зависимости от сторонних библиотек.

Создайте файл с названием pom.xml в корневом каталоге проекта и наполните его следующим содержанием:

За исключением дополнительного элемента

, это простейший из pom.xml файлов, необходимый для сборки Java проекта. Он включает следующие детали конфигурации проекта:

На данном этапе мы имеем минимальное, но уже рабочее определение Maven-проекта.

Сборка Java кода

Теперь все готово для сборки проекта Maven’ом. Вы можете выполнить несколько этапов жизненного цикла сборки, включая компиляцию кода, создание библиотеки пакета(такого, как JAR-файл) и установку библиотеки в локальный репозиторий Maven зависимостей.

Попробуйте собрать, выполнив команду, приведенную ниже:

Этим вы запустите Maven, передав ему указание на выполнение задачи compile. Когда он закончит, вы должны найни скомпилированные .class файлы в target/classes директории.

Вряд ли вы захотите распостранять или работать напрямую с .class файлами, поэтому вам полее подойдет выполнение задачи package:

с «jar» на «war», то результатом будет WAR-файл в target директории вместо JAR-файла.

Maven также хранит репозиторий зависимостей на вашей локальной машине(обычно в .m2/repository директории в вашей домашней папке) для быстрого доступа к зависимостям проекта. Если вы хотите добавить JAR-файл вашего проекта в локальный репозиторий, тогда вам необходимо выполнить задачу install :

Задача install включает компиляцию, тестирование, упаковку кода проекта, а затем копирование в локальный репозиторий, тем самым другие проекты смогут ссылаться на него как на зависимость.

Говоря о зависимостях, пришло время объявлять зависимости в Maven сборке.

Объявление зависимостей

Простой «Hello World» пример полностью автономный и не зависит от каких-либо дополнительных библиотек. Однако, большинство приложений зависит от внешних библиотек, с реализацией распостраненного и/или сложного функционала.

К примеру, предположим, что в дополнение к «Hello World!» вы хотите, чтобы приложение печатало текущую дату и время. Вы могли бы использовать функциональность из стандартных(native) Java библиотек, но мы можем сделать это и другими интересными способами, например с помощью Joda Time библиотеки.

Здесь HelloWorld использует Joda Time LocalTime класс для получения и печати текущего времени.

Если бы вы запустили mvn compile для сборки проекта сейчас, то получили бы ошибку сборки, потому что вы не объявили Joda Time компилируемую зависимость в сборке. Вы можете это исправить, добавив следующие строки в pom.xml(в пределах

Этот блок XML объявляет список зависимостей проекта. В частности, он объявляет единственную зависимость от Joda Time библиотеки. В элементе, зависимость определяется через описание трех вложенных элементов:

По умолчанию, все зависимости определены как зависимости. Т.е. они должны быть доступны во время компиляции(а если вы собираете WAR-файл, то в /WEB-INF/lib каталоге). Кроме того, вы можете добавить элемент, с одним из значений:

Здесь полная версия pom.xml :

Поздравляем! Вы создали простой, но эффективный файл сборки Maven для сборки Java проектов.

Источник

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

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