Э |
Та глава посвящается работе с JAR-файлами. Дополнительные сведения по этому же поводу вы сможете найти в следующей главе. В данной главе предложу вам ознакомиться с основами JAR-файлов, а в главе 28 — с развертыванием приложений, содержащихся в JAR- и выполняемых файлах.
В этой главе будут освещены следующие вопросы:
■ Роль JAR-файлов в проектах, разработанных на Java. Понимание роли JAR — файлов является необходимым условием для создания сложных проектов, которые достаточно легко сопровождать. Этот раздел главы будет посвящен общим вопросам программирования на языке Java, а не исключительно среде JBuilder. Он введен просто потому, что многие книги упускают данную тему из рассмотрения. Учебники по программированию на языке Java считают, что эта тема слишком сложна для начинающих, в то время как авторы книг для опытных программистов полагают, что описание основ программирования является чересчур уж простой темой для их круга читателей. Как результат, очень сложно найти хорошую книгу, посвященную основам программирования на языке Java.
■ Как создавать JAR-файлы, содержащие утилиты, которые можно использовать в нескольких проектах.
■ Как добавлять JAR-файлы в JBuilder-проекты, содержащие библиотечные файлы. Это исключительно важный вопрос, поскольку JAR-файлы интенсивно используются при разработке проектов на языке Java. Данный вопрос будет рассмотрен в конце главы. Если вас не интересует тема создания JAR-файлов, пропустите все вплоть до раздела, рассматривающего использование JAR-файлов в программах на языке Java.
■ Как создавать проекты, содержащие. class-файлы, которые не сопровождаются исходным кодом. Процесс создания проектов подобного рода достаточно прост, но для этого вы должны иметь представление о файлах библиотек среды JBuilder.
■ Как компилировать проекты, использующие JAR-файлы, в режиме командной строки.
Наиболее важной концепцией, которая будет рассмотрена в этой главе, является, по-видимому, концепция библиотек JBuilder. Библиотеки в среде JBuilder выполняют ту же роль, что и пути классов во время компиляции проекта из командной строки с помощью средств JDK. В частности, библиотеки в среде JBuilder можно использовать для указания путей классов в вашей системе.
Эта глава неразрывно связана со следующей главой, в которой будут рассмотрены вопросы развертывания. Обе главы имеют отношение к созданию JAR-файлов. Назначение настоящей главы заключается в объяснении процесса интеграции JAR- файлов в развертывание проектов JBuilder, в то время как назначение главы 28 — демонстрация включения всего проекта в отдельный JAR-файл. Кроме того, JAR-фай — лы будут рассматриваться в части VII, в которой вы научитесь помешать компоненты в JAR-файлы. И, наконец, мы поговорим о JAR-файлах в конце главы 43, где будут рассмотрены вопросы развертывания приложений, использующих несколько JAR-файлов. Таким образом, JAR-файлы являются очень важной частью процесса разработки Java-приложений, поэтому им и уделено настолько большое внимание в книге.
При изучении примеров, приведенных в настоящей главе, важную роль играет дерево каталогов проектов. В частности, на жестком диске вашего компьютера в требуемом каталоге должны находиться файлы MathBox. Java И StringBox. Java. Эти файлы являются частью JAR-файла библиотеки CodeBox, о которой шла речь в главе 25. В настоящей главе будут приведены указания по правильному размещению файлов MathBox. Java И StringBox. Java. Тем не менее, если вы правильно следовали всем указаниям, приведенным в предыдущих главах, ваш компьютер уже должен быть соответствующим образом настроен. Если же настройки компьютера не соответствуют требованиям, файлы можно установить, воспользовавшись сопровождающими книгу материалами, которые, как вы уже, должно быть, знаете, доступны для выгрузки и в Internet. Ссылку на страницу выгрузки материалов можно найти на моем сайте по адресу Http://Www.Elvenware.Com, А также на сайте издателя русскоязычной редакции этой книги.
Описание JAR-файлов
JAR-файлы — это технология, основанная на формате архивов zip, которая позволяет записать каталоги и файлы в один контейнер. Для всех практических целей они являются одной из форм файлов tar — или zip-формата, адаптированной под разработку проектов на языке Java. Фактически большинство программ, которые работают с различными технологиями сжатия файлов, будут работать и с файлами в формате JAR. Так, например, широко известное приложение WinZip может открывать не только zip — и tar-файлы, но также и JAR-файлы.
Тем не менее, основное назначение JAR-файлов несколько отличается от назначения tar — и zip-файлов. В частности, код, как правило, запускается непосредственно из JAR-файла, в то время как zip-файлы, в основном, используются в качестве способа хранения файлов. Таким образом, несмотря на то, что технологии zip и JAR практически ничем не отличаются, их назначение совершенно различно.
В этой главе мы рассмотрим JAR-файлы, содержащие несколько. class-файлов, которые будут задействованы в основной программе. В главе 28 будут рассмотрены JAR-файлы, включающие основную программу и используемые ею файлы.
JAR-файлы могут отслеживать не только помещаемые в них. class-файлы, но и структуру каталогов, в которой находятся файлы классов и используемые в проекте ресурсы. Как результат, JAR-файлы могут содержать как файлы классов, так и пакеты и битовые карты.
Ниже приведено перечисление основных связей JAR-файлов и Java-программ.
■ Поскольку JDK и JRE хранятся в JAR-файлах, все программы на Java используют JAR-файлы. Тем не менее, в некоторых случаях программы на Java могут ссылаться не только на JAR-файлы, поставляемые компанией Sun. При использовании класса, хранящегося в JAR-файле, иногда приходится указывать каталог, т. е. пакет, в котором находится нужный JAR-файл. В частности, следует убедиться, что каталог присутствует в путях классов. В среде JBuilder это, как правило, делается путем настройки библиотечного файла. Библиотечные файлы рассматриваются далее в этой главе. (В последних версиях JDK и JRE вам не придется беспокоиться о помещении JAR-файлов в пути классов. Этот процесс реализуется автоматически.)
■ JAR-файлы могут содержать пакеты. Фактически большинство JAR-файлов будет содержать не только файлы классов, но и структуру каталогов, в которой эти файлы располагаются Во многих случаях JAR-файлы можно считать контейнером для набора пакетов.
Пакеты обладают следующими преимуществами:
■ Они позволяют эффективно организовать код
■ Они позволяют избежать конфликтов имен. Класс с именем MyPackage.MyCiass Будет отличаться ОТ Класса С именем YourPackage.MyClass
■ Они позволяют повторно использовать код. После создания пакета его можно использовать в нескольких проектах.
■ Они будут функционировать на всех платформах. Все компьютеры поддерживают концепцию каталогов. Когда разработчики создавали язык Java, им было необходимо средство, которое бы позволило отличать один файл от другого, что дало бы возможность без ошибок компоновать проекты. При этом технология должна была быть независимой от платформы. Решение, которое нашли специалисты компании Sun, заключается в использовании пакетов.
■ Использование пакетов в языке Java значительно расширилось после принятия решения о том, что каждый открытый класс должен находиться в своем собственном файле исходного кода. Это решение во много раз увеличило количество файлов, входящих в состав JDK и других проектов. Пакеты были необходимы для группировки столь огромного числа файлов.
При использовании пакетов необходимо помнить, что действительное расположение пакета на жестком диске для Java не всегда играет важную роль. Рассмотрим следующую структуру каталогов
<:: ∖Teπ.P∖MyPackage∖Sam. Java F:∖Goobβr∖MyPackage∖Tom.Java
В приведенном примере, если каталоги c:\temp и f:\goober указаны в путях классов, Java будет рассматривать
C:\Temp\MyPackage\Sam.Java И F:\Goober\MyPackage\Tom.Java Как один и тот же пакет. Это может привести к нежелательным ошибкам.
Несмотря на теоретическую возможность, я не считаю рациональным помещать пакеты в каталог с тем же именем. Например, следует избегать таких структур, как c:\goober\MyPackage\MyPackage\MyPackage. jpr. И хотя подобная структура может и не привести к неприятным последствиям, тем не менее, при работе в среде JBuiIder она может привести к путанице. Приведенную выше структуру лучше преобраЗовать к виду C:\Goober\MyPackage\MyPackage.Jpr.
Читатели, которые только-только начинают работать с языком Java, могут поначалу не уловить связи между JAR-файлами и путями классов. Тем не менее, они достаточно тесно связаны между собой. Точный характер связи для непосвященных может показаться абсолютно неочевидным.
Каждый JAR-файл содержит файлы классов, которые, как правило, организованы в виде пакетов. Таким образом, структура каталогов присутствует в двух местах:
■ каталоги, находящиеся на жестком диске компьютера;
■ каталоги, содержащиеся в JAR-файле.
Для успешного использования JAR-файлов нужно всегда помнить об этих двух составляющих дерева каталогов.
Давайте-ка рассмотрим процесс настройки.
Сначала необходимо указать в глобальных путях классов или файле библиотеки среды JBuilder расположение конкретного JAR-файла. После этого пакеты в JAR — файле могут считаться обычными пакетами, находящимися на жестком диске.
Рассмотрим пример. Пусть JAR-файл с именем MyCode. jar Находится в каталоге C:\src\classes. В Файле MyCode. jar Содержится пакет Com. mycompany. utils.
Чтобы получить возможность ссылаться на файлы в каталоге utiɪs JAR-файла, поместите путь к файлу MyCode. Jar в путь классов. Для этого в Linux можно воспользоваться следующим сценарием:
Export CLASSPATH=$CLASSPATH:∕home∕UserName∕src∕classes∕MyCode. jar
Тот же сценарий для операционной системы Windows выглядит следующим образом:
Set CLASSPATH=%CLASSPATH%;с:∖src∖classes∖MyCode. jar
В среде Windows при необходимости ссылки на содержимое переменной среды ее имя помещается в символы %. Например, для ссылки на текущее содержимое пути, хранящееся в переменной среды PATH, используется синтаксис %PATH%. В операционной системе Linux для той же цели служит символ $. Как результат, ссылка $CLASSPATH в Linux указывает на переменную среды CLASSPATH.
Таким образом, два приведенных выше оператора устанавливают значение переменой среды CLASSPATH равным текущему значению CLASSPATH плюс новый путь к JAR-фай — лу. Список переменных среды можно просмотреть, набрав в командной строке set. Для просмотра значения одной конкретной переменной среды используется команда Echo (echo $РАТН или Echo %PATH%).
После установки значения пути классов для получения доступа к пакету utils в файлы исходного кода потребуется включить следующий оператор:
Inport com. mycompany. utils.*
Таким образом, доступ к JAR-файлу можно получить, указав путь к нему в переменной Classpath Среды или ссылку на него в библиотечном файле JBuilder. После помещения файла MyCode. jar В каталог, в котором он будет доступен для использования, можно забыть, что MyCode. jar Представляет собой файл, поскольку на него можно ссылаться как на каталог MyCode.
При добавлении пути к файлу MyCode. Jar в путь классов фактически вы создаете на жестком диске новые каталоги. При этом мы получаем ситуацию, когда структура каталогов на диске выглядит следующим образом:
С:∖src∖classes∖MyCode∖com∖mycompany∖utils
∕home∕UserName∕src∕classes∕MyCode∕com∕mycompany∕utils∕
В двух приведенных здесь примерах первая строка соответствует операционной системе Windows, а вторая — операционной системе Linux. Важным в приведенных примерах является то, что MyCode Считается каталогом, а не JAR-файлом. Именно так JAR-файлы интерпретируются в Java: JAR-файлы считаются расширением жесткого диска.
Давайте подробнее рассмотрим то, о чем только что шла речь. Чтобы определить, находится ли используемый пакет в JAR-файле, нужно понимать, что путь к пакету состоит из трех частей:
■ Первая часть — это путь на жестком диске к JAR-файлу. Этот путь должен содержаться в пути классов или на него должна иметься ссылка в библиотечном файле JBuilder.
■ Вторая часть представляет собой сам JAR-файл.
■ И, наконец, третья часть является содержимым JAR-файла, в частности, пакетами, которые хранятся в файле. Доступ к пакетам в JAR-файле можно получить с помощью оператора import.
Часть пути, которая находится на жестком диске, выглядит следующим образом: С:∖Src∖Classes∖MyCode. jar
Она разделена на две части: путь к JAR-файлу и имя самого JAR-файла.
Часть пути, которая находится в JAR-файле, выглядит следующим образом: Com. mycompany. utils
Внутри программы эта часть будет выглядеть так: Import com. mycompany. utils.*;
Чтобы добраться до файлов в пакете С:∖Src∖Classes∖MyCode. jАс∖Com. mycompany. utils
Необходимо помнить обо всех частях пути Правильная установка пути классов обеспечивает выбор первых двух частей пути О Третьей части пути вы должны позаботиться отдельно, определив в коде соответствующий оператор import.
В первый раз это достаточно сложно как для понимания, так и для объяснения простыми словами. Тем не менее, стоит хотя бы раз сделать все на практике, и вскоре вы достигнете того уровня, когда пути классов уже не будут для вас загадкой. Лишь некоторые вопросы в вычислительной технике (и таких вопросов очень немного) остаются сложными, даже если вы правильно их понимаете. Тем не менее, нашу тему вряд ли можно отнести к вопросам подобного рода. Несмотря на то что она достаточно сложна для понимания, она очень проста в реализации. Это как раз тот случай, когда у вас однажды наступает просветление, после которого никаких проблем не остается.
В оставшейся части этой главы мы расскажем о связи между языком Java, средой JBuilder, библиотечными файлами, путями классов и JAR-файлами. В частности, будут приведены примеры всего того, что до сих пор рассматривалось лишь на словах. Кроме того, будут кратко рассмотрены библиотечные файлы JBuilder. Как уже говорилось, библиотечные файлы JBuilder являются, пожалуй, самой важной темой этой главы.
Создание и использование JAR-файлов
Наконец-то мы готовы взобраться на самую вершину, к которой приближались на протяжении нескольких последних глав. C этой вершины мы сможем подробно рассмотреть концепцию использования JAR-файлов в J Builder-проектах. Располагая знаниями, полученными до этого момента, вы сможете легко увидеть способы структуризации даже наиболее сложных проектов.
Настало время создать простой JAR-файл и использовать его из среды JBuilder. Когда вы научитесь создавать и пользоваться JAR-файлами, то сможете работать с JAR-файлами, поставляемыми со стороны независимых разработчиков, например, с файлами Xerces. Jar и Soap. jar. Такие файлы играют очень важную роль во многих Java-πpoeκτax, разрабатываемых на сегодняшний день.
Эта часть главы разделена на три раздела:
■ Первая часть рассказывает о настройке и тестировании файлов, которые станут частью JAR-файла.
■ Во второй части рассматриваются два способа создания JAR файла.
■ Третья часть будет посвящена использованию созданного JAR-файла. JAR — файл будет применяться сам по себе, без ссылки на исходный класс и файлы исходного кода, на основе которых был создан этот JAR-файл.
Настройка тестовой программы
В этом разделе будет создана стандартная программа Java, предназначенная для тестирования различных частей JAR-файла CodeBox, который мы собираемся создать. Этот JAR-файл будет содержать откомпилированный код файла
StringBox. java, Который разрабатывался на протяжении нескольких последних глав. Кроме того, в JAR-файл будут включены файлы MathBox. java И FileBox. java. Они содержат дополнительные сервисные функции, которые могут понадобиться в будущих программах.
Важно понимать, что утилита JUnit1 о которой будет рассказано в последующих главах книги, использоваться не будет. Утилита JUnit позволяет легко создавать и тестировать Java-классы. Назначение тестов заключается в проверке того, что код работает так, как предполагалось. Утилита JUnit как раз представляет собой очень удобный инстРумент для тестирования кода, однако я хочу рассмотреть ее в отдельной главе.
Тем не менее, утилиту JUnit очень сложно использовать для тестирования программ, содержащих графический интерфейс пользователя. Поэтому, как правило, для тестирования кода применяются тесты двух видов. Один будет рассмотрен в настоящем разделе, а второй тест можно разработать с помощью утилиты JUnit.
Проект, который мы будет создавать, называется ManagecodeBoxSimple. Как и все примеры, рассматриваемые в книге, он содержится в сопровождающих материалах, которые доступны на Web-сайтах Www.Diasoft.Kiev.Ua И Www.Elvenware.Com. Создаваемый проект ПОЗВОЛИТ Откомпилировать файлы MathBox, StringBox И FiieBox И выполнить для них отдельные простые тесты. Начнем с создания нового проекта ManagecodeBoxSimple В каталоге ComplexProjects, Как было описано B главе 3. Добавьте в проект приложение. Заполните страницу Paths диалогового окна Project Properties, как показано на рис. 27.1.
![]() |
В состав сопровождающих книгу материалов входят два проекта с именами, которые начинаются с ManageCodeBox. Один назван ManagecodeBoxSimple, а второй — просто ManageCodeBox. Поскольку книга предназначена для читателей, работающих с разными версиями среды JBuiIder, мне пришлось создать отдельные структуры каталогов файлов CodeBox, включающих подкаталоги для редакций Personal, SE и Enterprise. В этой главе я не хотел бы, чтобы вы сталкивались с проблемами, поэтому в качестве примера я использую простой проект ManagecodeBoxSimple, который может работать во всех редакциях JBuiIder. Проект ManageCodeBox будет работать только в редакции Enterprise. Окончательная версия пакета CodeBox находится в подкаталоге src корневого каталога примеров. Там же находятся сценарии для компиляции окончательной версии файла codebox. jar в каждой редакции JBuiIder.
Все параметры, содержащиеся на странице Paths диалогового окна Project Properties (см. рис. 27.1), не требуют пояснений, за исключением добавления в панели исходного кода каталога ComplexProjects∕src. Это каталог, в котором хранится исходный код пакета codebox. Структура каталога CompiexProjects/Src Выглядит следующим образом:
../ComplexProjects∕Src∕Com∕Elvenware∕Codebox
В каталоге ComplexProjects Находится несколько проектов, которые будут рассматриваться в последующих главах. Многие из них используют исходный код пакета codebox. Как результат, код пакета codebox был помещен в каталог Src, В котором он может использоваться всеми проектами. В реальной жизни часто случаются ситуации, когда приходится делать то же самое.
В панели содержимого выберите Framel и перейдите в режим конструирования. Поместите на форму элементы управления JButton и JTextArea, как показано на рис. 27.2.
В листинге 27.1 приведен исходный код основного модуля проекта. Он содержит простой метод для тестирования, по крайней мере, части кода, находящегося в каталоге codebox. Как уже упоминалось, ниже в книге будет показано, как использовать утилиту JUnit для тестирования многих методов исходного кода.
Для создания файла, содержимое которого показано в листинге 27.1, в начало файла поместите оператор Import Com.EɪVenware.Codebox.*. Затем перейдите в режим конструирования и создайте обработчик события для кнопки, выполнив на ней двойной щелчок. Введите для кнопки следующий код:
Void JButtonl_ActionPerformed(ActionEvent Е)
{
String S = StringBox. reverse("Sam"); jTextAreal. setText(S);
>
Это предоставит вам простой способ тестирования кода модулей из пакета codebox.
Листинг 27.1. Фрагмент исходного кода программы ManagecodeBoxSimpIe
Package Inanagecodeboxsimple;
Import j ava. awt. * ;
Import java. awt. event. *;
Import javax. swing.*;
Import com. eɪvenware. codebox.*;
Public class Framel extends JFrame
{
JFanel ContentPane;
BorderLayout borderLayoutl = new BorderLayoutO;
JButton jButtonl = new JButton();
JTextArea j TextAreal = new JTextAreaO;
∕∕ Создание Фрейма
Public Framel()
{
EnableEvents(AWTEvent. WINDOW_EVENT_MASK); try (
Jblnit();
}
Catch(Exception e)
{
E. printStackTrace ();
}
)
∕∕ Инициализация Компонент Private void jbɪnit() throws Exception {
ContentPane = (JPanel) this. getContentPane(); jButtonl. SetText (» jButtonl") ; jButtonl. SddActionListener(new
Framel_jButtonl_actionAdapter(this));
ContentPane. setLayout(borderLayoutl); this. setSize(new Dimension(400, 300));
This. SetTitle (»Fraune Title") ; jTextAreal. setText("jTextAreal");
ContentPane. add(jButtonl, BorderLayout. WEST);
ContentPane. add(jTextAreal, BorderLayout-CENTER);
)
// Перекрыт, Чтобы Можно Было Выйти При Закрытии Окна Protected void processWindowEvent(HindowEvent Е)
{
Super. ProcessHindowEvent(Е);
If (e. getID() == HindowEvent. WINDOH_CLOSING)
{
System. exit(О);
}
J
Void jButtonl_actionPerformed(ActionEvent e)
{
String S = StringBox. reverse("Sam"); jTextAreal. setText(S);
)
)
Class Framel_jButtonl_actionAdapter implements j ava. awt. event. ActionListener
{
Framel adaptee;
Framel_jButtonl_actionAdapter (Framel adaptee)
{
This. adaptee = adaptee;
}
Public void actionPerformed(ActionEvent e)
{
Adaptee. jButtonl_actionPerformed(e);
}
Запустив этот проект, вы увидите, что он тестирует различные части классов пакета codebox. Тем не менее, для наших целей важно научиться компилировать используемые в проекте файлы исходного кода.
При попытке запуска проекта могут возникать ошибки, связанные с оператором import com. elvenware. codebox.*. В этом случае вам придется в диалоговом окне Project Properties внести изменения, показанные на рис. 27.1. Изменения, которые необходимо внести, уже рассматривались в нескольких главах книги. Исходный код модулей пакета codebox, в частности файлы tringBox. java и MathBoxjava, входят в Состав сопровождающих книгу материалов.
Создание JAR-файла для CodeBox
Давайте рассмотрим процесс создания JAR-файла в среде JBuilder. Эта опция не доступна в редакции Personal, однако имеется в редакции SE. Если в вашей версии JBuilder эта опция отсутствует, не волнуйтесь, JAR-файлы можно создавать и в режиме командной строки. Фактически многие разработчики предпочитают создавать JAR-файлы именно из командной строки, поскольку процесс их создания можно автоматизировать с помощью сценариев.
Тема создания JAR-файлов будет рассматриваться и в следующей главе при обсуждении вопросов развертывания. В этой главе мы создадим небольшой JAR-файл, который будет содержать не весь проект, а только файлы пакета codebox. Для создания JAR-файла необходимо выполнить следующие действия:
1. Выберите в меню Wizards ∣ Archive Builder (Мастера | Сборщик архивов).
2. В поле Archive type (Тип архива) выберите Basic (Базовый) и щелкните на кнопке Next.
3. На шаге 2 мастера введите имя архива CodeBoxSimpIe. Это имя, которое архив будет иметь в JBuilder, а не имя JAR-файла на жестком диске.
4. Нажмите кнопку эллипсиса рядом с текстовым полем File (Файл) и выберите каталог, в который необходимо поместить JAR-файл. Это может быть любой каталог на диске. При желании JAR-файл можно поместить в каталог проекта. Кроме того, на диске можно создать специальный каталог, в котором будут храниться все глобальные Java-файлы и классы. Это, например, может быть каталог ∕Home∕UserName∕Classes ИЛИ C:\Utile\Classes ИЛИ Любой другой каталог, на ваше усмотрение.
5. В открывшемся диалоговом окне введите имя выходного файла CodeBoxSimpIejar. После выполнения всех описанных выше действий окно шага 2 мастера должно выглядеть так, как показано на рис. 27.3. Если все сделано правильно, щелкните на кнопке Next.
6. На шаге 3 мастера выберите Include required classes and known resources (Включить требуемые классы и известные ресурсы). Щелкните на кнопке Add Classes (Добавить классы) и укажите корневой каталог пакета CodeBox (см. рис. 27.4). Корневой каталог будет иметь имя Сот, Как в пакете Com.Eivenwarβ.Codβboχ. Добавьте его в архив. Явным образом добавьте в архив классы StringBox И MathBox, Как показано на рис. 27.5. Если вы не имеете возможности выбрать перечисленные пакеты и файлы, значит, вы неправильно установили пути в своей системе. Вернитесь к рис. 27.1 и описанию способов решения проблемы. Щелкните на кнопке Next.
7. В созданном проекте нет зависимостей, поэтому шаг 4 можно пропустить, приняв все значения, предложенные по умолчанию.
8. На шаге 5 снова можно принять значения, предложенные по умолчанию, оставляя установленным флажок Include a manifest in the archive (Включить манифест в архив) и переключатель Create a manifest (Создать манифест).
9. После выполнения всех перечисленных операций выполните щелчок правой кнопкой мыши на архиве в панели проекта, и в контекстном меню выберите пункт Маке. После этого возле имени архива появится знак плюс. Для открытия дерева щелкните на знаке плюс, а затем для открытия JAR файла выполните двойной щелчок на имени файла. После этого содержимое JAR-файла должно отображаться в панели структуры. На рис. 27.6 показано, каким образом это выглядит на экране. При изучении рисунка обратите внимание, что интегрированная среда разработки сжата максимальным образом, что позволяет сконцентрировать внимание только на существенных в данный момент деталях интерфейса. Если пакет ManagecodeBoxSixnple Или Timeit Не входит в архив, вернитесь к шагу 3 мастера и убедитесь, что вы точно следуете всем указаниям.
![]() |
I t⅛ ¾ el⅜e∩ware • В Ай Codebox
F <4 MateBox <⅛ StdngBox
⅛ ∙J⅜>l managecodebox & J⅜l timβlt
![]() |
![]() |
Рис. 27.4. Выбор пакетов и файлов для помещения в архив
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
© Properties for ‘CodeBoxFoo’ ∣ X
Вы, возможно, обратили внимание на то, что JAR-файл содержит элемент, который называется манифестом (manifest). Манифесты будут рассмотрены непосредственно после раздела, рассказывающего о компиляции в режиме командной строки.
Компиляция файла CodeBoxSimpIeJar В режиме командной строки
В предыдущем разделе вы научились создавать JAR-файлы в интегрированной среде разработки. Для этого вам понадобится редакция SE или Enterprise. Если вы пользуетесь редакцией Personal, JAR-файлы придется создавать в режиме командной строки. В этом разделе будет показано, как выполнить эту достаточно простую задачу.
Перейдите в каталог CompiexProjects. Этот каталог будет корневым для подкаталогов Src И подкаталогов с файлами классов. Каталог Src Должен содержать файлы исходного кода пакета codebox:
/ComplexProjects∕Src∕Com∕Elvenware∕Codebox∕MathBox.Java
/ComplexProjects∕classes∕com∕elvenware∕codebox∕MathBox. class
Убедитесь, что в переменной среды path содержится каталог bin инструментального набора JDK:
Path=%path%;С:∖Jbuilder∖Jdkl.3.l∖Bin
Если переменная среды Path Установлена правильно, вы должны иметь возможность выполнить команду Java —Version И при этом получить значащий ответ:
Cg:∖Srcjava∖Jbbook∖Complexprojects]java -version java version ”1.3.1"
Java(TM) 2 Runtime Environment, Standard Edition (buɪld 1.3.1-b24)
Java HotSpot(TM) ClientVM (build 1.3.1-b24, mixed mode)
Ниже приведены команды, которые можно выполнить из командной строки в каталоге ComplexProjectS Для компиляции файлов исходного кода и создания JAR-фаЙла, содержащего классы StringBox И MathBox:
Javac — d classes — Sourcepath src src∖Com∖Elvenware∖Codebox∖*.java mkdir classes
Jar cvf Codeboxsimple. jar -C classes com
Команда Javac Компилирует все файлы исходного кода из каталога Codeboχ И помещает их в каталог файлов классов. (Убедитесь, что каталог файлов классов существует, для чего выполните команду Mkdir classes.) Третья команда создает архив из компилированных файлов классов.
Первое слово в третьей строке вызывает утилиту Jar. Второе слово содержит три флага, передаваемые утилите Jar:
■ С: Создать JAR-файл;
■ V. выдавать расширенные результаты;
■ f: указывает имя создаваемого JAR-файла.
Ниже рассмотрены остальные части команды:
■ Codeboxsimple. Jar — имя создаваемого файла.
■ — с Classes Указывает утилите Jar Перейти в новый каталог с именем Classes. Эта команда имеет четко определенный синтаксис, если вы введете, например, -с Classes/, То команда выполнена не будет.
■ Последнее слово в команде указывает утилите jar поместить в архив содержимое каталога Сот.
При работе с JAR-файлом из командной строки его содержимое можно просмотреть с помощью команды jar Tf Codeboxsimple. Jar. Опция T Указывает вывести на экран содержимое файла, а опция f говорит среде JBuilder, что после нее следует имя файла, содержание которого необходимо вывести. Результаты выполнения этой команды должны выглядеть следующим образом:
META-INF/
META-INF∕MANIFEST. MF Сот/
Com∕elvenware∕ com∕elvenware∕codebox∕ com∕elvenware∕codebox∕FileBox. class com∕elvenware∕codebox∕Finance. class com∕elvenware∕codebox∕MathBox. class com∕elvenware∕codebox∕StringBox. class
Обратите внимание на третью, четвертую и пятую строки, которые указывают на существование в JAR-файле трех важных пакетов. Кроме того, убедитесь, что в архив не был записан каталог файлов классов: Ciasses∕com∕elvenware.
Файл манифеста
При создании JAR-файла с помощью одного из описанных выше способов в него будет автоматически включен манифест. Манифест {manifest) представляет собой всего лишь текстовый файл, который описывает содержимое JAR-файла. Как правило, манифест нужен для программ, которые используют JAR-файл, а не для разработчиков, которые хотят больше узнать о файле.
В рассматриваемом нами простом JAR-файле манифест содержит только следующую строку текста: Manifest-Version: 1.0. Этот текст и сам манифест помещаются в файл автоматически, т. е. от вас не требуется никаких дополнительных действий.
Манифесты будут рассмотрены более подробно в главах 28 и 32 и в части VlI книги. На данном этапе вы не должны уделять особое внимание манифестам.
Таким образом, вы создали JAR-файл, который можно использовать в интегрированной среде разработки JBuilder. В следующем разделе я расскажу, как воспользоваться созданным файлом.
Тестирование JAR-файла
После создания JAR-файла его нужно протестировать. Для этого необходимо убедиться, что удалены все ссылки на файлы классов, помещенные в JAR-файл, т. е. доступ к классу StringBox.Class Должен осуществляться из JAR-файла, а не из копии файла класса, хранящегося в вашей системе. Вначале следует убедиться, что проект не может найти пакет Com.Elvenware.Codebox.*.
Для этого проще всего удалить каталог Classes Проекта ManagecodeBoxSimple, А затем выбрать в меню Project ∣ Project Properties и убедиться, что каталог ComplexProject∕src в списке отсутствует (см. рис. 27.7). Сравните этот рисунок с рисунком 27.1. На рис. 27.1 каталог файлов исходного кода в списке присутствует.
![]() |
![]() |
![]() |
|
Если вы все делали правильно, ваш проект компилироваться Не будет. В частности, ВЫ Получите ошибку, указывающую на строку Import Com.Elvenware.Codebo×.* И говорящую о том, что JBuilder не может получить доступ к указанному каталогу.
Теперь необходимо создать библиотеку, которая будет указывать на JAR-файл. Процесс создания библиотеки будет описан в следуюшем разделе.
Установка пути классов: библиотечные файлы JBuiIder
Одной из ключевых концепций интегрированной среды разработки JBuilder является библиотечный файл. Если для проекта JBuilder необходимо поместить определенное значение в путь классов, используется библиотечный файл JBuiIder. Библиотечные файлы представляют собой XML-файлы, имена которых заканчиваются расширением. library. Во всех версиях JBuilder они могут храниться в подкаталоге. jbuilder вашего домашнего каталога. (Если вы пользуетесь другой версией JBuilder, этот подкаталог может называться. jbuilder6 или. jbuilder8 и т. д.) Расширенные версии позволяют хранить библиотечные файлы в других каталогах.
Как правило, пользователю JBuilder не нужно знать синтаксис библиотечного файла. Интегрированная среда разработки создает и управляет библиотечными файлами автоматически. Для их использования в среде JBuilder необходимо нажать всего несколько кнопок. Тем не менее, в этом разделе будет приведен синтаксис библиотечных файлов, отчасти для того, чтобы снять с них завесу тайны, а отчасти — дабы убедится, что вы четко понимаете, для чего вообще нужны эти файлы.
Обычный библиотечный файл выглядит следующим образом:
<?xml version="l.О" Encoding="UTF-8"?>
<library>
<ι— Файл Определения Библиотеки JBuilder —> <fullname>JavaHelp<∕fullname>
<classXpath>[G% ∣ ∕src∕srcjava∕classes∕jh. jar]<∕pathx∕class>
<∕Library>
Основной частью библиотечного файла является его раздел Class. Как видите, в нем приведен путь в JAR-файлу, который вы хотите включить в проект. Именно таким образом JBuilder определяет пути классов при работе в интегрированной среде разработки. Это одна из самых важных концепций, описанных в книге, — библиотечные файлы JBuilder используются как раз для установки путей классов!
Кодировка библиотечных файлов предполагает замену некоторых символов. Так, например, символ двоеточия в пути заменяется символами %|. Таким образом, путь G:∕src∕srcjava преобразуется к виду G%∣∕src∕srcjava. Должно быть, вы Знаете, что аналогичный тип кодировки используется в Cookie-наборах.
Большинство библиотечных файлов находится в вашем домашнем каталоге, в подкаталоге с именем . Jbuilder×, Где × — версия используемого JBuilder. Обратите внимание на точку перед словом Jbuiider×. В Операционной системе Linux, как правило, используется каталог ∕Home∕UserName∕. Jbuilder×, А в Windows — каталог C:\Documents And SettingsXUserName∖. Jbuilderx∖. В Редакциях SE И Enterprise библиотечные файлы могут храниться в структуре каталогов проекта.
Конфигурацию библиотечных файлов можно настроить двумя способами:
■ Выбрать в меню пункт Tools ∣ Configure Libraries (Сервис | Настроить библиотеки).
■ Выбрать в меню пункт Project ∣ Project Properties ∣ Paths (Проект | Свойства проекта I Пути). В нижней части диалогового окна необходимо перейти на страницу Required Libraries (Обязательные библиотеки) и щелкнуть на кнопке Add.
Более подробно процесс настройки библиотек будет описан в следующем разделе. Использование JAR-файла в интегрированной среде разработки JBuiIder В этом разделе мы создадим библиотечный файл, который содержит ссылку на
JAR-файл. Для создания библиотечного файла в меню JBuilder выберите Tools | Configure Libraries. В появившемся диалоговом окне Configure Libraries щелкните на кнопке New. Назовите библиотеку CodeBoxSimpIe и в качестве места ее расположения установите User Home (Домашний каталог). Снова щелкните на кнопке Add и найдите JAR-файл, который должен называться Codebo×Simpie. Jar. Он может быть расположен в каталоге C:\Utils\Classes Или в том каталоге, куда вы его поместили. После этого мастер создания новой библиотеки (New Library Wizard) должен выглядеть примерно так, как показано на рис. 27.8.
Если в мастере New Library Wizard щелкнуть на кнопке OK, произойдет возврат в диалоговое окно Configure Libraries. Теперь оно должно выглядеть так, как показано на рис. 27.9. На рис. 27.9 в домашнем каталоге, возможно, содержится больше библиотек, чем находится в вашей системе, тем не менее, общий вид диалогового окна должен быть таким же.
На данном этапе настройка библиотеки CodeBox завершена, и библиотека готова к использованию в одном или нескольких проектах. Для добавления библиотеки в проект в меню JBuilder выберите Project ∣ Project Properties. Перейдите на страницу Required Libraries и щелкните на кнопке Add. После этого библиотеку можно выбрать в диалоговом окне, которое выглядит подобно элементу управления JTreeview, Который находится в левой части диалогового окна, показанного на рис. 27.9.
Как результат, библиотека CodeBoxSimple Появится в списке обязательных библиотек (см. рис. 27.10). После того, как библиотека добавлена в проект, вы получите возможность откомпилировать и запустить проект. Если при выполнении одного из перечисленных шагов возникли какие-то проблемы, откройте проект, входящий в состав сопровождающих материалов, и сравните его со своим проектом.
Теперь вы получаете возможность запустить проект, и ошибка, касающаяся каталога Com.Elvenware.Codebox, Возникать не должна. Сейчас вы получаете доступ к классу StringBox Через JAR-файл, а не через файл класса, который содержится в системе. Это может показаться незначительным достижением, тем не менее, оно означает, что вы получили возможность использовать те многие JAR-файлов, которые можно найти в Internet.
Библиотеки, содержащие только файлы классов
Точно так же, как вы имеете возможность создать библиотеку, указывающую на JAR-файл, можно создать и библиотеку, которая указывает на пакет, содержащий набор файлов классов. Если такую библиотеку включить в проект, в него будет автоматически включены и классы. Эта возможность может оказаться весьма полезной, если от независимого разработчика было получено один или несколько файлов классов без сопровождающего исходного кода.
New L∣brar> Wizard
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Несмотря на то что результаты могут варьироваться в зависимости от версии среды JBuiIderf как правило, файлы классов не помещаются непосредственно в проект. Например, они не помещаются в каталог classes, создаваемый по умолчанию JBuiIder. В некоторых версиях JBuiIder помещение файлов классов в каталог classes вызывает ошибку, а в других версиях JBuiIder сам автоматически удалит такие файлы. Поэтому при получении файлов классов от независимых разработчиков я настоятельно реКомендую ссылаться на них через библиотечный файл.
Эта тема рассматривается только в конце главы, поскольку операцию подобного рода приходится выполнять достаточно редко. Тем не менее, бывают случаи, когда какой-то разработчик передает вам набор исходных файлов классов и просит включить их в проект. Конечно, файлы классов можно упаковать в JAR-файл. Но иногда такой подход будет неэффективным. В таком случае удобнее создать библиотечный файл.
Для создания библиотечного файла выполняйте все те же операции, которые вы предпринимали в предыдущем разделе. Но при выборе JAR-файла в мастере New Library Wizard вместо файла потребуется выбрать каталог, в котором находятся подкаталоги ∕com∕elvenware∕codebox.
Предположим, что дерево каталогов выглядит следующим образом: G:∖Src∖Srcjava∖Classes∖Com∖Elvenware∖Codebox
В этом случае в библиотеку потребуется добавить каталог G:\src\srcjava\classes, Точно так же как в предыдущем примере вы добавляли в библиотеку файл Codeboxsimpie. Jar После вставки в файл каталога и перехода в свой домашний каталог можно обнаружить созданный файл. library. В приведенном примере файл библиотеки выглядит следующим образом:
<?xml version="1.O" encoding="UTF-8"?>
<library>
<!— Файл определений библиотеки JBuilder —> <fullname>CodeBoxClasses<∕fullname>
<class>
<path>G%I∕src∕SrcJava∕jbbook∕classes<∕path>
<∕class>
<source>
<path>G%I∕src∕SrcJava∕jbbook∕ComplexProjects∕src<∕path>
<∕source>
<∕library>
Как видите, библиотека содержит и каталог классов, и каталог, в котором находятся файлы исходного кода. Для вставки в библиотеку этих каталогов понадобилось указать ссылку только на каталог Classes. Каталога Classes Будет достаточно для того, чтобы проект компилировался без ошибок, тем не менее, знание места расположения файлов исходного кода помогает при компоновке проекта. Конечно, если у вас нет файлов исходного кода, соответствующий раздел будет пустым. Включение каталога файлов исходного кода не является обязательным требованием, оно просто помогает при компоновке проекта.
Раздел библиотечного файла, который указывает на пакеты, содержащие классы, имеет небольшую длину, тем не менее, он исключительно важен. Бывают случаи, когда библиотека подобного типа может оказаться весьма и весьма полезной. Такие случаи достаточно редки, тем не менее, для них библиотечные файлы могут быть решающими для успешной разработки проекта.
Компиляция проекта Timelt В режиме командной строки
В заключение главы хотелось бы сказать несколько слов об использовании JAR — файла, созданного в компании Borland, во время компиляции в режиме командной строки без использования инструментальных средств JBuilder Этот раздел будет полезен только для тех разработчиков, которые пользуются редакциями SE или Enterprise.
Я не собираюсь рассказывать, как этот процесс выполняется в JBuiIder, поскольку среда JBuiIder автоматически добавляет в проект требуемые файлы библиоТек, если в программе используются их функции.
При работе в интегрированной среде разработки JBuilder бывают ситуации, когда по ошибке в проект добавляются классы Borland. В частности, ситуация подобного рода может возникнуть при работе с компоновками. Если в проект были случайно добавлены классы Borland, их код всегда можно удалить из проекта. Но если вы хотите сохранить код и откомпилировать его из командной строки перед развертыванием проекта, вам понадобится материал, рассматриваемый в этой главе.
Как вы, наверное, помните, в главе 25 был создан проект Timeit, который без проблем компилировался и запускался в интегрированной среде разработки JBuilder Эта программа демонстрировала принцип работы со сложными путями в среде JBuilder
Тем не менее, в ней присутствовала одна неприятная особенность. В частности, она использовала класс VerticalFiowLayout, Который не входит в стандартный JDK, поставляемый компанией Sun. VerticalFlowLayout — Это класс, разработанный компанией Borland, который находится в JAR-файле, созданном и поддерживаемом компанией Borland. Таким образом, ссылка на класс VerticalFiowLayout
Компилируется в интегрированной среде JBuilder. Но что произойдет, если программу Timeit запустить в режиме командной строки? Как уведомить Javac И Java О существовании JAR-файле разработки Borland?
В этом разделе будет рассмотрено, каким образом можно откомпилировать и запустить программу на машине, на которой уже установлен JBuilder. Описание процесса развертывания программы на другой машине будет приведен в следующей главе. Тем не менее, многие читатели после изучения процесса компиляции проекта на машине, на которой выполняется разработка, наверное, поймут один из самых простых способов развертывания проектов на других машинах. Несмотря на это, основное назначение настоящего раздела заключается в описании ситуации, когда при использовании JBuilder возникает необходимость перехода к использованию командной строки. (Как уже упоминалось, для автоматического перехода можно воспользоваться ключом JBuiider. exe — build, однако данная опция рассматриваться не будет. Мы научимся компилировать проект с использованием самого комплекта JDK.)
Следующая строка, взятая из файла Framel. java, Может рассказать о рассматриваемой в этом разделе проблеме:
Import com. borland. jbcl. layout.*;
Очевидно, что файл Com. borland, Скорее всего, не будет распространяться вместе с Java SDK. Таким образом, может возникнуть вопрос: "Как откомпилировать такую программу в командной строке без использования средств Borland?". К этому времени вы уже можете самостоятельно, без особых усилий, найти ответ, тем не менее, я предлагаю рассмотреть пример по следующим двум причинам.
■ Пример поможет акцентировать внимание на основных вопросах, рассмотренных в главе.
■ Некоторые разработчики в своих проекта используют классы Borland, и этот раздел вместе с главой 28 расскажет о необходимых операциях.
Несмотря на то что, строго говоря, это и не нужно для описания процесса компиляции, тем не менее, в примере будет содержаться одна "изюминка". В частности, будет рассмотрен один сценарий.
Ниже приведен фрагмент сценария, используемого мною:
#∙ /bin/bash
JBUILDER_HOME=$HOME/jb
JBUILDER_LIBS=$JBUILDER_HOME∕1Ib
JAVA_HOME=$JBUILDER_HOME/jdkl.3.1
Export JAVA_HOME JBUILDER_HOME JBUILDER_LIBS
Тот же сценарий для операционной системы Windows будет выглядеть следующим образом:
Set JBUILDER_HOME=d:∖Jb
Set JBUILDER_LIBS=% JBUILDER_HOME %∖1Ib
Set JAVA_HOME=%JBUILDER_HOME\jdkl.3.1
Как видите, приведенные сценарии устанавливают несколько переменных среды, которые могут быть интересны для программистов на Java. В частности, обратите внимание, что в сценариях определяется переменная, указывающая на каталог lib. В каталоге Iib находятся JAR-файлы, которые могут представлять интерес. Так, в этом каталоге расположен файл jbcl. jar, который содержит классы, определяющие класс VerticalFlowLayout.
Bash-сценарий компиляции программы Timeit из командной строки выглядит следующим образом:
#! ∕bin∕bash
#————————————————————
# Перед запуском сценария определите переменную среды
# JBUILDER_LIBS. Она должна указывать на каталог JBuiIderX/Iib.
#
Java с — d classes — sourcepath src — classpath $JBUILDER_LIBS/jbcl. jar ∖
Src/timeit/Timelt. java
Java — classpath.:classes:$JBUILDER_LIBS/jbcl. jar timeit. TimeIt
Тот же самый сценарий для Windows выглядит вот так:
Rem ————————————————————
Rem Перед запуском сценария определите переменную среды
Rem JBUILDER_LIBS. Она должна указывать на каталог JBuilderX∕lib.
Rem ————————————————————
Javac — d classes — sourcepath src -classpath %JBUILDER__LIBS%/jbcl. jar ∖
Src/timeit/Timelt. java
Java — classpath./classes;%JBUILDER_LIBS%/jbcl. jar timeit. TimeIt
Эти сценарии аналогичны сценариям, приведенным в главах 23 и 24. Тем не менее, обратите внимание, что они явным образом помещают файл jbcl. Jar В путь классов. После указания пути к файлу jbcl. Jar Машина Java сможет найти файлы классов, определяющие класс VerticalFiowLayout. Зная расположение файлов классов, Java сможет компилировать и запустить программу Timeit.
В этой главе вы узнали о JAR-файлах, библиотеках JBuiIder и об их использовании для организации проектов. Если вы хотите стать программистом среднего или высокого уровня, нужно четко понимать материал, представленный в этой главе Более того, вы никогда не научитесь пользоваться средой JBuilder в полной мере, если не поймете, как манипулировать и использовать JAR-файлы и библиотечные файлы в интегрированной среде разработки JBuilder.
Конечно, отдельные вопросы, рассмотренные в этой главе, могут оказаться достаточно сложными для понимания. Тем не менее, как только вы научитесь работать с JAR-файлами, вы обнаружите, что приобретенные знания окажут неоценимую помощь при разработке проектов. В частности, JAR-файлы предоставляют великолепное средство для инкапсуляции частей проектов в отдельные удобные для использования "пакеты" кода. Они позволяют достичь двух основных целей, к которым стремится любой профессиональный программист:
■ Максимальное повторное использование кода.
■ Инкапсуляция кода в "пакеты", называемые JAR-файлами, которые легко использовать и сопровождать.
![]() |
Глава 28
®>Я|ЯИИвИИИИИИИИИИИЯИИИИНВИЯИВ! ЯИИИИИИ1^ИВвЫвИР*ввИЯ1ИИвИвИИМИИИИИИИвв1ИвИИИИЯИИИОвИИ1вЯИИИИ1ИИИЯЮвв^в1