Как скомпилировать все java файлы в папке

Обновлено: 07.07.2024

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

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

Класс Other, единственный метод которого выводит строку текста на экран:

public class Other public String getMessage() return "Привет, мир!" ;
>
>

Сохраним этот текст как есть в файл, имя которого обязательно должно совпадать с именем класса, т.е. Other.java.

Класс Main:

class Main public static void main(String. args) Other other = new Other();
System.out.println(other.getMessage());
>
>

Поскольку здесь есть статичный метод main(), то этот класс может использовать как точка начала работы нашего приложения (так называемый «Main-Class»). Внутри мы создаём экземпляр класса Other, вызываем его единственный метод и выводим результат на экран.

Сохраним исходники этого класса в файле Main.java.

Теперь мы готовы к тому, чтобы скомпилировать написанный нами код. Для этого используется утилита javac, которая поставляется вместе с jdk. Выполним эту команду в той папке, где лежат оба наших файла:

Опция -d указывает, какие именно файлы мы хотим скомпилировать. В результате в нашей папке помимо исходников появится иерархическая структура папок и файлов:

├── Main.java
├── Other.java
└── ru
└── devmark
├── helper
│ └── Other.class
└── Main.class

class-файлы - это бинарные файлы с байт-кодом, которые может обрабатывать виртуальная машина Java. Обратите внимание, что каждый класс компилируется в свой собственный файл. Таким образом достигается модульность нашего приложения. Более того, скомпилированный класс будет работать в любой операционной системе на любой java-машине.

Но когда мы говорим о приложении, то ожидаем увидеть один файл, а не кучу папок. Давайте упакуем наши class-файлы в jar-архив. В этом нам поможет одноимённая утилита.

Опция c говорит, что нужно создать новый архив, f задаёт имя будущего архива, а e указывает полное имя main-класса. В конце указываем папку, в которой лежает все class-файлы.

В результате вы получите файл lesson1.jar, который готов к запуску:

В результате на экране вы увидите приветствие, которые генерирует наш класс Other.

Примечательно, что jar-архив - это обычный zip-архив определённой структуры. Открыв его любым архиватором вы увидите наши class-файлы в иерархии пакетов, а также папку META-INF с файлом MANIFEST.MF. Этот файл содержит вспомогательную информацию об архиве.

У меня этот файл манифеста выглядит так, но у вас может отличаться:

Manifest-Version: 1 . 0
Created-By: 9 . 0 . 4 (Oracle Corporation)
Main-Class: ru.devmark.Main

Здесь указано, в какой версии java был создан архив, а также указан Main-Class. Как видите, ничего сложного.

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

я использую компилятор javac для компиляции файлов java в моем проекте. Файлы распределяются по нескольким пакетам следующим образом: com.vistas.util , com.vistas.converter , com.vistas.LineHelper , com.current.mdcontect .

каждый из этих пакетов имеет несколько файлов java. Я использую javac следующим образом:

вместо того, чтобы давать так много путей, как я могу попросить компилятор рекурсивно скомпилировать все файлы java из родительского каталога com?

Я бы также предложил использовать какой-то инструмент сборки (АНТ или Maven, Ant уже предложен и легче начать) или IDE, которая обрабатывает компиляцию (Eclipse использует инкрементную компиляцию со стратегией согласования, и вам даже не нужно нажимать any "Compile" кнопки).

Используя Javac

Если вам нужно попробовать что-то для большего проекта и не иметь никаких надлежащих инструментов сборки рядом, вы всегда можете использовать небольшой трюк, который javac предложения: имена классов для компиляции могут быть указаны в файле. Вам просто нужно передать имя файла в javac С @ префикс.

если вы можете создать список всех *.java файлы в вашем проекте, это легко:

  • преимущество это быстрое и простое решение.
  • недостаток это то, что вы должны регенерировать sources.txt файл каждый раз, когда вы создаете новый источник или переименовать уже существующий файл, который легко забыть (что чревато ошибками) и утомительно.

использование инструмента сборки

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

Использование Ant

если вы создаете простой build.xml файл, который описывает, как создать программное обеспечение:

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

  • преимущество это то, что вы используете стандартный инструмент сборки, который легко расширить.
  • недостаток это то, что вы должны загрузить, настроить и изучить дополнительный инструмент. Обратите внимание, что большинство IDEs (например, NetBeans и Eclipse) предлагают отличную поддержку для написания файлов сборки, поэтому вам не нужно ничего скачивать в этом случае.

Использование Maven

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

  • это главное преимущество (для меня) заключается в том, что он также обрабатывает зависимости, поэтому вам больше не нужно будет загружать файлы Jar и управлять ими вручную, и я нашел его более полезным для создания, упаковки и тестирования больших проектов.
  • недостаток - это крутой обучение и если Плагины Maven любят подавлять ошибки : -) другое дело, что довольно много инструментов также работают с репозиториями Maven (например, Sbt для Scala, Айви для Ant, Graddle для Groovy).

использование IDE

теперь, что может повысить производительность вашего развития. Есть несколько альтернатив с открытым исходным кодом (например,затмение и NetBeans, Я предпочитаю первое) и даже коммерческие (например,IntelliJ), которые являются довольно популярными и мощными.

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

одно дополнительное Примечание

для больших проектов, всегда рекомендуется использовать IDE и инструмент построения. Первый повышает производительность, в то время как последний позволяет использовать различные IDE с проектом (например, Maven может генерировать дескрипторы проекта Eclipse с помощью простого mvn eclipse:eclipse command). Кроме того, имея проект, который может быть протестирован/построен с помощью одной команды строки легко представить новым коллегам и в сервер непрерывной интеграции, например. Кусок пирога :-)

Я компилирую несколько файлов в каталоге (javac *.java), но у меня есть проблема, когда я пытаюсь это сделать:

Я получаю ошибки компиляции, говоря, что javac не может найти символ объекта.

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

Основная программа находится в папке с драйверами.

this is a screenshot of the folders

Я попытался скомпилировать файлы в порядке зависимости, но это не сработало.

ОТВЕТЫ

Ответ 1

Javac документация содержит всю необходимую информацию. Однако было бы полезно использовать Ant или Maven для построения командной строки.

Эта страница служит хорошим примером использования первого javac, а затем Ant для создания простого проекта.

Вот пример проекта и как его можно скомпилировать с помощью javac.

Древовидная структура проекта такова:

Существует два специальных каталога - build для хранения скомпилированных классов и src для размещения исходных файлов (может быть в разных подкаталогах - пакетах).

Следующая команда компилирует весь проект и помещает результат в каталог build .

-sourcepath src указывает каталог src как место, где весь источник может быть найден компилятором. Опция -d build сообщает компилятору, куда поместить скомпилированные файлы.

Опция src/**/*.java сообщает компилятору, какие файлы нужно компилировать. В этом конкретном случае он сообщает javac посмотреть два уровня вниз и выбрать все *.java на этом уровне.

Если существуют файлы *.java на разных уровнях, необходимо указать список файлов. Для этого можно создать такой список как внешний файл и передать эти файлы, как в опции ввода для javac .

Вот как это можно сделать в Linux/Unix:

Вышеупомянутая команда создает файл source.txt, содержащий полные пути для найденных *.java файлов. В этом примере он содержит:

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

Обратите внимание, что @source.txt указан в конце, который сообщает компилятору, где искать список исходных файлов. Также обратите внимание, что параметр -sourcepath можно опустить.

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

Как можно заметить, каталог build теперь содержит скомпилированные файлы классов в соответствующих пакетах.

И если вы хотите запустить его, предположив, например, что Driver имеет метод main , следующая программа выполняет программу.

Обратите внимание, что в Unix используется разделитель файлов : (двоеточие), для Windows его можно изменить на ; (точка с запятой).

Ответ 2

Я компилирую несколько файлов в каталоге (javac *.java)

Неправильно. Это будет работать только в том случае, если классы Java не находятся в пакетах. Правильный способ сделать это выглядит следующим образом, где src - это имя каталога, в котором находятся все каталоги пакетов:

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

См. документацию инструмента для javac .

Ответ 3

1) Используйте командную строку, чтобы указать все файлы для компиляции

2) Создайте файл со всеми именами файлов (вывод из поиска, возможно) и запустите javac @argfile

Компиляция в Java - 1

Программирование в IDE — прекрасно: связанность зависимостей кода, удобный дебаг, понятное тестирование, темная тема. Так вот, благодаря IDE разработка развивается семимильными шагами. Но она расслабляет. С каждым днем, погружаясь в функционал IDE, разработчик привыкает к коммиту одной кнопкой или сборке двумя кликами. Гораздо хуже обстоит ситуация с новичками в программировании, которые с самого начала работают в IDE, игнорируя работу в командной строке. Например, в Intellij IDEA компиляция Java приложения демонстрируется загрузочным баром в нижней панели, а все параметры компиляции, обработка classpath и прочих прелестей Java-жизни остается за кадром. Предлагаем поговорить о компиляции в Java без IDE. Для запуска примеров в статье следует убедиться, что на вашей машине установлена JDK 1.7 и старше.

Как скомпилировать программу?

  1. Есть исходный код в файле с именем НазваниеКласса.java;
  2. Если в коде нет ошибок, он компилируется в байт-код (в файл НазваниеКласса.class);
  3. Программа запускается.

Для чего нужна команда javac

Компиляция в Java - 2

Окей, первый пункт выполнен. Идем дальше, чтобы понять: скомпилировать — это как? :) В этом нам поможет команда javac, в аргументе которой необходимо указать нужный файл: Если нет ошибок в коде, рядом с файлом Test.java появится файл Test.class. Это и есть скомпилированный байт-код. Теперь его нужно запустить. Здесь используется команда java, запускающая байт-код: На скриншоте видно, что в выводе получаем какие-то иероглифы: очевидно, это сбитая кодировка. Как правило это происходит в системе Windows. Для корректного отображения кириллицы в консоли, есть следующие команды: Они меняют текущую кодовую страницу командной консоли на время работы текущего окна. Попробуем еще раз: Это говорит приложение из командной строки. Знать принцип работы команды javac очень полезно, так как эта команда лежит в основе любой системы сборки проектов.

Компиляция и выполнение нескольких классов

Для работы с несколькими классами нужен 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 , так как это название класса, а не файла. Вывод:

Создание 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 -файлу, включая расширение: Вывод:

Компиляция в Java без IDE: обзор систем сборок

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

Как скомпилировать Java?

Самые известные системы сборки на Java — это Ant, Maven и Gradle. Среди нет плохой или хорошей: каждая из них создана для решения определенных задач. Рассмотрим каждую из них подробнее.

  • mkdir — создание директорий
  • delete — удаление файлов и директорий
  • javac — компиляция Java–кода
  • java — запуск скомпилированного кода

Maven

Компиляция в Java - 3

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 - 4

На первый взгляд, умение компиляции и сборки кода без IDE кажется бесполезным. Действительно, зачем мучиться с командными строками и гуглить все команды, когда есть уютная IDEшечка с плагинами, автопроверкой всего что можно (современные IDE разве что уровень IQ не проверяют) и интеграцией с популярными системами. Однако практика показывает, что умение собирать код без среды разработки и понимание каждого шага этого процесса — суровая необходимость. Этот навык сэкономит немало нервных клеток и времени вам и вашей компании. Освоить работу в IDE, попрактиковаться в написании кода и, конечно же, получить фундаментальные основы по программированию на Java вы можете здесь — на JavaRush. Пора вернуться к обучению :)


Сейчас уже никто не создает программы в консоли. Используя любимую IDE, разработчик чувствует себя неуютно за чужим компьютером, где её нет.
Решив разобраться в работе Ant и Maven, я поймал себя на том, что не смогу собрать приложение без них в консоли.
В данной статье я постарался уместить все этапы проектирования демонстрационного приложения, чтобы не искать справку по каждой команде на просторах Интернета.

От простого к .

Каждая программа обычно содержится в отдельном каталоге. Я придерживаюсь правила создавать в этом каталоге по крайней мере две папки: src и bin. В первой содержатся исходные коды, во второй — результат компиляции. В данных папках будет структура каталогов, зависящая от пакетов.

Один файл

Можно сделать и без лишних папок.
Берем сам файл HelloWorld.java.
Переходим в каталог, где лежит данный файл, и выполняем команды.
В данной папке появится файл HelloWorld.class. Значит программа скомпилирована. Чтобы запустить

Отделяем бинарные файлы от исходников

Теперь сделаем тоже самое, но с каталогами. Создадим каталог HelloWorld и в нем две папки src и bin.
Компилируем
Здесь мы указали, что бинарные файлы будут сохраняться в отдельную папку bin и не путаться с исходниками.

Используем пакеты

А то, вдруг, программа перестанет быть просто HelloWorld-ом. Пакетам лучше давать понятное и уникальное имя. Это позволит добавить данную программу в другой проект без конфликта имен. Прочитав некоторые статьи, можно подумать, что для имени пакета обязательно нужен домен. Это не так. Домены — это удобный способ добиться уникальности. Если своего домена нет, воспользуйтесь аккаунтом на сайте (например, ru.habrahabr.mylogin). Он будет уникальным. Учтите, что имена пакетов должны быть в нижнем регистре. И избегайте использования спецсимволов. Проблемы возникают из-за разных платформ и файловых систем.

Поместим наш класс в пакет с именем com.qwertovsky.helloworld. Для этого добавим в начало файла строчку
В каталоге src создадим дополнительные каталоги, чтобы путь к файлу выглядел так: src/com/qwertovsky/helloworld/HelloWorld.java.
Компилируем
В каталоге bin автоматически создастся структура каталогов как и в src.

Если в программе несколько файлов

HelloWorld.java
Adder.java

Ошибка возникла из-за того, что для компиляции нужны файлы с исходными кодами классов, которые используются (класс Calculator). Надо указать компилятору каталог с файлами с помощью ключа -sourcepath.
Компилируем

Если удивляет результат

Есть возможность запустить отладчик. Для этого существует jdb.
Сначала компилируем с ключом -g, чтобы у отладчика была информация.

Отладчик запускает свой внутренний терминал для ввода команд. Справку по последним можно вывести с помощью команды help.
Указываем точку прерывания на 9 строке в классе Calculator

Запускаем на выполнение.

Чтобы соориентироваться можно вывести кусок исходного кода, где в данный момент находится курссор.

Узнаем, что из себя представляет переменная а.

Выполним код в текущей строке и увидим, что sum стала равняться 2.

Поднимемся из класса Adder в вызвавший его класс Calculator.

Удаляем точку прерывания

Можно избежать захода в методы, используя команду next.

Проверяем значение выражения и завершаем выполнение.

Хорошо бы протестировать

Запускаем. В качестве разделителя нескольких путей в classpath в Windows используется ';', в Linux — ':'. В консоли Cygwin не работают оба разделителя. Возможно, должен работать ';', но он воспринимается как разделитель команд.

Создадим библиотеку

Класс Calculator оказался полезным и может быть использован во многих проектах. Перенесем всё, что касается класса Calculator в отдельный проект.

Измените также назавания пакетов в исходных текстах. В HelloWorld.java нужно будет добавить строку

Делаем архив jar

С помощью ключа -C мы запустили программу в каталоге bin.

Надо узнать, что у библиотеки внутри

Можно распаковать архив zip-распаковщиком и посмотреть, какие классы есть в библиотеке.
Информацию о любом классе можно получить с помощью дизассемблера javap.

Из результата видно, что класс содержит кроме пустого конструктора, ещё один метод sum, внутри которого в цикле вызывается метод add класса Adder. По завершении метода sum, вызывается Adder.getSum().
Без ключа -c программа выдаст только список переменных и методов (если использовать -private, то всех).

Лучше снабдить библиотеку документацией

Изменим для этого класс калькулятора.

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

image

В результате получиться следующее

Можно подписать jar-архив

Если требуется подписать свою библиотеку цифровой подписью, на помощь придут keytool и jarsigner.
Генерируем подпись.

Генерируем Certificate Signing Request (CSR)

Содержимое полученного файла отправляем в центр сертификации. От центра сертификации получаем сертификат. Сохраняем его в файле (например, qwertokey.cer) и импортируем в хранилище

Файл qwertokey.cer отправляем всем, кто хочет проверить архив. Проверяется он так

Использование библиотеки

Есть программа HelloWorld, которая использует библиотечный класс Calculator. Чтобы скомпилировать и запустить программу, нужно присоединить библиотеку.
Компилируем

Собираем программу

Это можно сделать по-разному.

Первый способ

Здесь есть тонкости.
В строке

не должно быть пробелов в конце.
Вторая тонкость описана в [3]: в этой же строке должен стоять перенос на следующую строку. Это если манифест помещается в архив сторонним архиватором.
Программа jar не включит в манифест последнюю строку из манифеста, если в конце не стоит перенос строки.
Ещё момент: в манифесте не должно быть пустых строк между строками. Будет выдана ошибка «java.io.IOException: invalid manifest format».

При использовании команды echo надо следить только за пробелом в конце строки с main-class.

Второй способ

В данном способе избегаем ошибки с пробелом в main-class.

Третий способ

Включили код нужной библиотеки в исполняемый файл.

Запуск исполняемого jar-файла

Файл calculator.jar исполняемым не является. А вот helloworld.jar можно запустить.
Если архив был создан первыми двумя способами, то рядом с ним в одном каталоге должна находится папка lib с файлом calculator.jar. Такие ограничения из-за того, что в манифесте в class-path указан путь относительно исполняемого файла.

При использовании третьего способа нужные библиотеки включаются в исполняемый файл. Держать рядом нужные библиотеки не требуется. Запускается аналогично.

Как быть с приложениями JavaEE

Аналогично. Только библиотеки для компиляции нужно брать у сервера приложений, который используется. Если я использую JBoss, то для компиляции сервлета мне нужно будет выполнить примерно следующее

Структура архива JavaEE-приложения должна соответствовать определенному формату. Например

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

Надеюсь, данная статья станет для кого-нибудь шпаргалкой для работы с Java в командной строке. Данные навыки помогут понять содержание и смысл Ant-скриптов и ответить на собеседовании на более каверзные вопросы, чем «Какая IDE Вам больше нравится?».

Читайте также: