Какая команда используется для запуска процесса компиляции исходного файла в байт код
1. Загрузите нужную версию JDK компании Oracle Corporation (ранее Sun Microsystems) или последнюю версию SDK («Набор программиста») компании Sun Microsystems.
2. Установите её, следуя указаниям.
Microsoft Windows XP [Версия 5.1.2600]
(C) Корпорация Майкрософт, 1985-2001.
C:\Documents and Settings\2>_
Microsoft Windows XP [Версия 5.1.2600]
(C) Корпорация Майкрософт, 1985-2001.
C:\Documents and Settings\2>_
Microsoft Windows XP [Версия 5.1.2600]
(C) Корпорация Майкрософт, 1985-2001.
C:\Documents and Settings\2>_
4. Для удобства пропишите в path путь к папке bin пакета SDK или JDK, для этого введите системную команду с указанием пути к папке bin, например:
path c:\Program Files\Java\jdk1.7.0\bin
Microsoft Windows XP [Версия 5.1.2600]
(C) Корпорация Майкрософт, 1985-2001.
C:\Documents and Settings\2>path c:\Program Files\Java\jdk1.7.0\bin
C:\Documents and Settings\2>_
5. Зайдите в папку с исходными кодами, для этого введите системную команду перехода к другому подкаталогу CD с указанием пути к подкаталогу с файлом исходного кода, например:
cd c:\Documents and Settings\2\Мои документы\Java\HelloWorld
Microsoft Windows XP [Версия 5.1.2600]
(C) Корпорация Майкрософт, 1985-2001.
C:\Documents and Settings\2>path c:\Program Files\Java\jdk1.7.0\bin
C:\Documents and Settings\2>cd c:\Documents and Settings\2\Мои документы\Java\HelloWorld
C:\Documents and Settings\2\Мои документы\Java\HelloWorld>_
6. Компилируйте файлы *.java, получая *.class. Например: javac MyTest.java или javac HelloWorld.java
Microsoft Windows XP [Версия 5.1.2600]
(C) Корпорация Майкрософт, 1985-2001.
C:\Documents and Settings\2>path c:\Program Files\Java\jdk1.7.0\bin
C:\Documents and Settings\2>cd c:\Documents and Settings\2\Мои документы\Java\HelloWorld
C:\Documents and Settings\2\Мои документы\Java\HelloWorld>javac HelloWorld.java
C:\Documents and Settings\2\Мои документы\Java\HelloWorld>_
7. Запустите класс, где есть функция public static void main(…) . Например: java -cp . MyTest или java HelloWorld
Microsoft Windows XP [Версия 5.1.2600]
(C) Корпорация Майкрософт, 1985-2001.
C:\Documents and Settings\2>path c:\Program Files\Java\jdk1.7.0\bin
C:\Documents and Settings\2>cd c:\Documents and Settings\2\Мои документы\Java\HelloWorld
C:\Documents and Settings\2\Мои документы\Java\HelloWorld>javac HelloWorld.java
C:\Documents and Settings\2\Мои документы\Java\HelloWorld>java HelloWorld
HelloWorld!
C:\Documents and Settings\2\Мои документы\Java\JavaShildt\HelloWorld>_
Для запуска апплета в appletviewer'е с помощью команды cd войдите в подкаталог (папку) в которой находятся файл запуска апплета в браузере *.html и файл апплета *.class, например, для апплета с именем Sample: Sample.html и Sample.class, и запустите аплетвьювер командой:
C:\Documents and Settings\2\Мои документы\Java\JavaShildt\HelloWorld>cd C:\Documents and Settings\2\Мои документы\Java\JavaShildt\643Sample
C:\Documents and Settings\2\Мои документы\Java\JavaShildt\643Sample>appletviewer Sample.html_
Программирование в IDE — прекрасно: связанность зависимостей кода, удобный дебаг, понятное тестирование, темная тема. Так вот, благодаря IDE разработка развивается семимильными шагами. Но она расслабляет. С каждым днем, погружаясь в функционал IDE, разработчик привыкает к коммиту одной кнопкой или сборке двумя кликами. Гораздо хуже обстоит ситуация с новичками в программировании, которые с самого начала работают в IDE, игнорируя работу в командной строке. Например, в Intellij IDEA компиляция Java приложения демонстрируется загрузочным баром в нижней панели, а все параметры компиляции, обработка classpath и прочих прелестей Java-жизни остается за кадром. Предлагаем поговорить о компиляции в Java без IDE. Для запуска примеров в статье следует убедиться, что на вашей машине установлена JDK 1.7 и старше.
Компиляция и выполнение нескольких классов
Для работы с несколькими классами нужен classpath. Он похож на файловую систему, в которой содержатся классы, а функцию папок выполняют пакеты (packages). На этом этапе стоит задуматься об отделении файлов исходного кода от скомпилированных файлов. Как правило исходники находятся в каталоге src, а скомпилированные классы — в bin. Например, у нас есть класс Box и класс BoxMachine , в котором содержится метод main . Класс Box : Он находится в пакете src, это необходимо зафиксировать. Класс BoxMachine : Этот класс также находится в пакете src. В методе main он создает пять объектов класса Box разного размера и выводит в консоль информацию о них. Чтобы скомпилировать эту группу классов, необходимо из главного каталога (в котором лежат папки src и bin) использовать команду javac с аргументами: -d — флаг, после которого следует указать расположение, куда попадут скомпилированные классы. Это очень удобно, так как перекладывать, например, 1000 классов — очень трудоемкий процесс. bin — название папки. ./src/* — расположение исходных файлов. * указывает, что необходимо скомпилировать все файлы. Теперь скомпилированные классы появились в папке bin. Для их запуска используется команда java из той же директории, также с аргументами: -classpath — флаг, после которого следует указать местоположение скомпилированных классов. Java будет искать главный класс и все сопутствующие именно в этой директории. ./bin — название папки, в которой находятся скомпилированные классы. BoxMachine — название главного класса. Как и в первом случае, не следует указывать .class , так как это название класса, а не файла. Вывод:
Заключение
На первый взгляд, умение компиляции и сборки кода без IDE кажется бесполезным. Действительно, зачем мучиться с командными строками и гуглить все команды, когда есть уютная IDEшечка с плагинами, автопроверкой всего что можно (современные IDE разве что уровень IQ не проверяют) и интеграцией с популярными системами. Однако практика показывает, что умение собирать код без среды разработки и понимание каждого шага этого процесса — суровая необходимость. Этот навык сэкономит немало нервных клеток и времени вам и вашей компании. Освоить работу в IDE, попрактиковаться в написании кода и, конечно же, получить фундаментальные основы по программированию на Java вы можете здесь — на JavaRush. Пора вернуться к обучению :)
JVM не может напрямую запустить код, который ты пишешь. Она может выполнять только программы записанные байт-кодом. Байт-код — это язык низкого уровня, близкий к машинному коду.
Компиляция в Java — это перевод программы написаной на Java (высокий уровень) в такую же программу записанную байт-кодом.
Компилятор представляет из себя команду javac, входящий в JDK (Java Development Kit). К примеру, если установить только JRE (Java Runtime Environment), то компилятора там не будет! Будет только JVM, которая умеет запускать только байт-код. Так что устанавливаем JDK, и передаем компилятору наш файл .java .
Для примера возьмем простую программу с выводом в консоль:
Сохраним этот код в файл D:/temp/MySolution.java .
Скомпилируем наш код, используя команду
Если в коде нет ошибок компиляции, в папке temp появится файл MySolution.class . При этом файл MySolution.java с твоим кодом никуда не денется, останется на месте. А вот MySolution.class уже содержит байт-код, и готов к непосредственно запуску с помощью JVM.
Наш пример максимально простой, но команда javac используется и в самых больших и сложных проектах. Поэтому знать принципы ее работы очень полезно.
Компилировать можно и больше одного класса за раз. Например, пусть в папке temp есть еще один файл Cat.java :
После компиляции файлы .class можно упаковать в jar файл, чтоб его было удобно переносить и запускать на разных компьютерах. Пример команды для создания jar файла:
jar – команда для создания .jar файлов, входит в состав JDK;
cvfe – флаги, означающие:
с – нужно создать новый jar файл;
v – выводить дополнительную информацию в процессе выполнения команды;
f – вместе с myjar.jar говорит о том, файл с каким именем мы получим в результате;
e – вместе с MySolution указывает, какой класс содержит метод main ;
MySolution.java Cat.class – разделенные пробелом имена файлов, которые надо упаковать в jar файл.
В прошлой публикации мы установили и настроили Sublime Text в качестве редактора для написания кода на Java.
- о компиляции и запуске Java-программ из консоли
- как выводить в нее корректно русский текст
- способ отображения байт-кода
На первых порах начинающему программисту очень важно научиться выполнять необходимые действия минимальными средствами, чтобы:
- иметь представление, что происходит «под капотом»
- не быть зависимым от среды разработки
- не превратиться в специалиста по нажиманию кнопок в инструментах для профессионалов
- не оказаться беспомощным за их пределами
Вам сейчас нужно максимально набить шишек, находясь в спартанских условиях, которые закалят и научат самостоятельно и оперативно решать возникающие проблемы. Это придаст уверенности и повысит вашу экспертность.
Есть такое понятие — профессиональный кругозор. Он важен для людей любой профессии. Программисты не исключение. Если человек хочет стать настоящим разработчиком, обладающим фундаментальным знанием, а не поверхностным и неструктурированным, то ему нужно изучать возможности языка последовательно и системно. Компиляция и запуск — это основа основ, это база, мимо которой никак нельзя пройти.
Компилировать и запускать программы, на первых порах, мы будем из консоли. В этой и последующих статьях мы будем много работать с этим инструментом. Это важный навык, который используется программистами повсеместно.
Откроем в Sublime Text терминал, нажав Ctrl + Alt + T (при этом файл MyFirstApp.java должен быть открыт в редакторе). Обязательно проверьте, что терминал запустился в папке StartJava (или где вы сохранили класс).
Для компиляции воспользуемся уже знакомой утилитой javac (java compiler, компилятор java). Она нужна для преобразования Java-кода в язык виртуальной машины (байт-код).
Как мы уже знаем, MyFirstApp.class содержит байт-код. Для его исполнения воспользуемся утилитой java. Именно она стартует JVM, которая в свою очередь запустит класс MyFirstApp.
Обратите внимание, что необходимо указать не имя файла MyFirstApp.class, а имя класса. При этом писать какое-либо расширение не нужно. Утилита java принимает в качестве параметра именно имя класса, а не имя файла, где он находится.
Мы уже не первый раз упоминаем про байт-код, но до сих пор в глаза его не видели. Исправим эту ситуацию.
Для отображения (декомпиляции) байт-кода класса необходимо в консоли написать команду javap -c MyFirstApp.
Как правило, умение читать и понимать байт-код, вносить в него изменения для рядовых Java-разработчиков обычно не требуется — это очень специфические знания. Так что долго не сидите на этой теме.
Если обобщить все этапы, которые проходит программа перед запуском, то схематично их можно отобразить в виде схемы:
Чтобы посмотреть, как работает программа, необходимо выполнить два действия: компиляцию и запуск. Если эти шаги требуется исполнять часто, то данный процесс рано или поздно надоест. Хотелось бы его упростить.
Удалите из папки class-файл, чтобы все было честно. И запустите программу без компиляции в явном виде, написав java MyFirstApp.java.
Мы только что запустили (и скомпилировали) файл с java-кодом без использования команды javac. При этом исходный код в любом случае компилируется в памяти (без создания на диске class-файла), а затем исполняется JVM.
Эта функция ограничена кодом, который хранится в одном файле. Она не сработает для программ, состоящих из двух и более файлов.
Теперь, когда вы умеете компилировать и запускать программу, можете поэкспериментировать с кодом MyFirstApp.java, внося в него изменения. Попробуем удалить точку с запятой.
Если вы используете Linux или macOS, то дальше можете не читать, т.к. ниже описаны проблемы и их решения для Windows. У вас таких проблем не будет!
Написанная нами программа выводит текст в консоли на английском языке. Как вы думаете, что произойдет, если попробовать вывести текст на русском?
Первое, что приходит в голову — это какая-то проблема с кодировкой. Нужно разобраться в какой момент она возникает.
Посмотрим, какая кодировка у файла с нашим кодом. Она отображается в правом нижнем углу окна. Видим, что это UTF-8.
А какая кодировка используется в OC? Определить это можно разными путями. Например, в Windows в реестре (для его запуска из консоли используйте команду regedit) по следующему адресу HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage можно посмотреть, чему равен параметр под названием ACP (ANSI code page).
У меня он имеет значение 1251. Это стандартная кодировка для русских версий Windows. У вас она может быть другой — все зависит от языка (кодировки) системы.
Есть еще один способ узнать кодировку, который подходит для любой ОС — это воспользоваться Java, поместив в наш класс две новых строки:
Вникать в то, что означает этот код мы не будем — наша задача лишь получить универсальным способом значение кодировки. Но, если в двух словах, то в первой строке мы подключаем класс Charset, а в пятой выводим на экран значение кодировки по умолчанию для ОС, воспользовавшись возможностями данного класса.
Она выдала 866. Это же число можно наблюдать и в реестре у параметра OEMCP (Original equipment manufacturer code page). Это DOS-кодировка, которая досталась нам в наследство.
Не удивительно, что java не смогла корректно отобразить кириллический текст, когда используется столько кодировок в одной ОС.
Дело в том, что во время компиляции компилятор определяет кодировку исходного кода, опираясь на значение кодировки по умолчанию (на кодировку вашей ОС), а не на кодировку файла. В разных системах используются разные кодировки по умолчанию: в Windows — windows-1251, в Linux и Mac — UTF-8.
В Windows ко всему прочему еще и кодировка консоли не совпадает с кодировкой системы! Консоль по историческим причинам имеет кодировку Cp866 (видимо, в целях совместимости).
Затем JVM определяет кодировку по умолчанию во время запуска, используя системное свойство file.encoding. Значение для этого свойства устанавливается Java-машиной один раз при старте на основании данных, взятых из ОС.
Кодировка, используемая при выводе в консоль тоже системная, а не консоли. Если они не совпадают, то не видать нам корректного вывода кириллицы.
В итоге кодировку надо учитывать во время компиляции, во время запуска и во время вывода текста на консоль, например, при вводе с клавиатуры. Невыполнение этого правила в любом из этих мест способно вызвать проблемы.
У компилятора есть опция -encoding. Она позволяет принудительно указать кодировку исходника, чтобы компилятор не определял ее, опираясь на кодировку системы. Как вы помните, файл имеет кодировку UTF-8. Вот ее мы и укажем javac -encoding utf8 MyFirstApp. java.
Если для однофайловых программы вы решили не использовать явно компиляцию, а сразу писать java, то для переопределения системного свойства file.encoding существует специальная команда. Вместе с ней запуск программы будет выглядеть так java -Dfile.encoding=UTF8 MyFirstApp.java.
-Dfile.encoding — это уже параметр JVM, с помощью которого мы устанавливаем принудительно нужное нам значение, сохраняя его в file.encoding.
От всех этих параметров и правил может закружиться голова. И все эти годы Java-разработчики жили и мучились с кодировками и ошибками, которые они вызывали в программах.
Но, не прошло и 25 лет, как появилась хорошая новость. Начиная с Java 18, значение кодировки по умолчанию определяется не исходя из кодировки ОС, а исходя из того, что она является UTF-8 — отныне это кодировка по умолчанию. Никакие параметры больше не нужны. Убедимся в этом:
Для тех, кто использует Java меньше 18, придется использовать все параметры, указанные ранее — ни куда от них не деться. Но и тут есть выход.
Утомительно все время указывать кодировку. Этот вопрос можно решить, используя JAVA_TOOL_OPTIONS со значением -Dfile.encoding=UTF8. Необходимо установить эту переменную и ее значение в качестве переменной среды (ранее мы уже имели дело с другой переменной — JAVA_HOME).
Забежим немного вперед и рассмотрим ситуацию, когда нам нужно ввести с клавиатуры что-то на русском языке. Да, ввод мы еще не проходили, но мне совсем не хочется размазывать эту информацию по разным статьям. Пусть все, что связано с компиляцией и запуском, с кодировками, их проблемы и решения будут в одном месте.
Добавим в наш код библиотечный класс Scanner, который позволит считывать, введенные с клавиатуры символы , и пару строк с его использованием:
Чтобы решить проблему, замените строку Scanner console = new Scanner(System.in); на Scanner console = new Scanner(System.in, «cp866»); Тут мы явно указываем кодировку cp866 — это кодировка консоли, как вы помните.
Если после всего проделанного, что я описал выше, у вас вместо русского текста выводится пустая строка, то необходимо в консоли ввести chcp 866 и заново запустить программу.
В этой статье мы научились компилировать и запускать java-программы, нашли способ побороть проблему с выводом кириллических символов в консоль, а также лучше стали понимать, как работают все эти механизмы.
Если не использовать в коде программы или во время ввода с клавиатуры русский язык, то никаких проблем с кодировками не возникнет. Но, если вы все же ступили на путь использования кириллических символов, то вам придется проделать все те настройки, которые были описаны во второй половине статьи. Таких проблем в профессиональных средах разработки практически не бывает, т.к. они умеют правильно отображать текст в консоли, делая автоматически, если нужно, его перекодировку.
В предыдущей части мы написали очень простую программу с помощью онлайн-редактора кода. Если хотите, можете им пользоваться какое-то время. Но рано или поздно придется идти дальше в познании Java и сопутствующих технологий. А для этого уже нужны совсем другие инструменты. О некоторых из них мы и поговорим в этой статье.
Для того чтобы начать писать приложения на Java у себя на компьютере, требуется выполнить подготовительную работу, связанную с установкой и настройкой необходимых программ.
Java — это не просто язык. Это целая платформа, экосистема, состоящая из набора инструментов для разработчиков и разных подсистем. При этом Java является кроссплатформенным языком.
Под платформой обычно понимают сочетание аппаратной (процессор) и программной (операционная система, ОС) части.
В предыдущей статье наша маленькая программка выводила фразу: «Write once, run anywhere» («Написано однажды, работает везде»). Это девиз Java, подчеркивающий ее платформонезависимость.
Раньше приложения писали под конкретную ОС. Это означало, что перенести их с одной ОС на другую было крайне проблематично. Приходилось под каждую из них создавать чуть ли не с нуля новую версию программы. Зачастую под каждую платформу нанимали новую команду разработчиков. Это трудозатратно и выходит намного дороже по стоимости.
В какой-то момент возникла идея сделать универсальную платформу, на которой могли бы работать приложения, написанные под разные ОС.
Для реализации этой задумки была создана виртуальная машина (Java Virtual Machine, JVM). Это специальное приложение, которое позволяет запускать программы, написанные на Java, на любой ОС и любом железе (при условии, что JVM реализована для используемой платформы).
Виртуальная машина является прослойкой между процессором и программным кодом. При этом она запускает не файлы с исходным кодом (с расширением .java), а специальные промежуточные файлы с расширением. class в которых хранится байт-код. Этот код назван так из-за того, что представляет собой набор команд в один байт, хотя имеются команды и большей длины.
В использовании байт-кода и заключается магия переносимости программ с одной ОС на другую без внесения каких-либо изменений.
Компиляция — это процесс преобразования кода, написанного на языке программирования, например, Java в специальный код, который компьютер (в нашем случае JVM) может понять и запустить. Для компиляции используется программа под названием компилятор.
Все виртуальные машины, неважно на какой ОС они установлены, знают и понимают байт-код одинаково хорошо, т.к. он представляет собой не машинные команды конкретной компьютерной платформы (конкретного процессора в виде последовательности нулей и единиц), а команды JVM. За счет этого и реализуется кроссплатформенность. Промежуточный код не зависит от какой-то ОС или процессора, т.к. не содержит код, созданный специально под них. Он содержит байт-код, который одинаково интерпретируется JVM на любой платформе.
Для создания программ на Java существует специальный набор инструментов для разработчиков, называемый Java Development Kit (JDK). Из этого набора нам сегодня потребуются две утилиты (самые основные и важные) под названием javac (сокр. от java compiler) и java (да, называется так же, как и язык).
Первая из них является компилятором. Она компилирует java-файлы в class-файлы, содержащие байт-код. Вторая утилита нужна для запуска JVM с полученными class-файлами.
Создание JAR-файлов
Чтобы программу было легко переносить и запускать, можно собрать скомпилированные классы в jar-файл — архив классов. Главное отличие от zip или rar-архивов — наличие файла манифеста. В этом манифесте указывается главный класс, который будет запускаться при выполнении jar-файла, classpath, а также много дополнительной информации. В главном каталоге создадим файл manifest.mf. Его содержимое будет следующим: main-class указывает класс, который содержит метод main и будет выполнен при запуске. class-path — путь к скомпилированным классам или дополнительным библиотекам. Настало время собрать настоящую программу без IDE с помощью команды jar: -cmf — флаг, после которого следует указать путь к файлу манифеста. manifest.mf — путь к манифесту. box-machine.jar — название выходного jar-файла. -С — флаг, после которого указывается путь к скомпилированным классам. . — путь, куда будет помещен jar-файл. В нашем случае —это главный каталог. Теперь можно запустить. Запуск jar-файлов выполняется также с помощью команды java, но следом нужно указать флаг -jar : он говорит о том, что запускается Jar-файл, а второй аргумент — путь к jar -файлу, включая расширение: Вывод:
Maven
Maven предлагает несколько другой подход к сборке проектов. Здесь разработчик скорее описывает свой проект и дополнительные инструменты, которые использует, в отличие от Ant, где сборка — это последовательность действий. Maven популярен среди разработчиков благодаря простому управлению зависимостями и удобной интеграции со всеми средами разработки. При работе с Maven придерживаются такой структуры проекта: Правила сборки, зависимости и прочее описывается в файле pom.xml. Как правило он находится в главной папке проекта. При запуске Maven проверяет структуру и синтаксис файла, предупреждая об ошибках. В главной директории рядом с папками bin и src создаем файл pom.xml, внутрь добавляем: Далее в командной строке выполняем команду mvn: Теперь в папке bin есть папка src, в которой находятся скомпилированные классы. В pom.xml в теге build определена цель сборки — компиляция, директории файлов исходного кода и результата компиляции, а также имя проекта. У Maven есть множество целей сборки и плагинов для запуска тестирования, создания Jar-файлов, сборки дистрибутивов и других задач.
Gradle
Это самая молодая система сборки, которая основывается на Ant и Maven. Главное отличие — работа на базе ациклического графа для определения порядка выполнения задач. Это очень полезно при более сложных задачах, например, инкрементальных и многопроектных сборках. При сборке с помощью Gradle также рекомендуется придерживаться структуры папок проекта Maven. Кстати, файл для сборки в Gradle он называется build.gradle и выглядит гораздо меньше, чем у Maven. Пример для наших классов: В файле происходит подключение плагинов, определение директории файлов исходного кода (если не используется структура проектов Maven), директория результатов сборки, имя главного класса, а также задачи по умолчанию. За запуск сборки отвечает команда gradle в директории, где лежит файл build.gradle:
Как скомпилировать Java?
Самые известные системы сборки на Java — это Ant, Maven и Gradle. Среди нет плохой или хорошей: каждая из них создана для решения определенных задач. Рассмотрим каждую из них подробнее.
- mkdir — создание директорий
- delete — удаление файлов и директорий
- javac — компиляция Java–кода
- java — запуск скомпилированного кода
Как скомпилировать программу?
- Есть исходный код в файле с именем НазваниеКласса.java;
- Если в коде нет ошибок, он компилируется в байт-код (в файл НазваниеКласса.class);
- Программа запускается.
Компиляция в Java без IDE: обзор систем сборок
Несмотря на относительную простоту использования командной строки, с ее помощью очень сложно собирать средние и большие проекты. Это занимает много времени и чревато ошибками разной степени. К счастью, есть системы сборки, которые в разы облегчают процесс работы. Несколькими командами эта система может собрать проект любой сложности, а обилие плагинов, созданных за время существования таких систем, может избавить практически от любой головной боли.
Для чего нужна команда javac
Окей, первый пункт выполнен. Идем дальше, чтобы понять: скомпилировать — это как? :) В этом нам поможет команда javac, в аргументе которой необходимо указать нужный файл: Если нет ошибок в коде, рядом с файлом Test.java появится файл Test.class. Это и есть скомпилированный байт-код. Теперь его нужно запустить. Здесь используется команда java, запускающая байт-код: На скриншоте видно, что в выводе получаем какие-то иероглифы: очевидно, это сбитая кодировка. Как правило это происходит в системе Windows. Для корректного отображения кириллицы в консоли, есть следующие команды: Они меняют текущую кодовую страницу командной консоли на время работы текущего окна. Попробуем еще раз: Это говорит приложение из командной строки. Знать принцип работы команды javac очень полезно, так как эта команда лежит в основе любой системы сборки проектов.
Читайте также: