Компиляция всех Java-файлов в папке: рекурсия в javac
Быстрый ответ
Чтобы выполнить рекурсивную компиляцию всех Java-файлов при помощи компилятора javac
, используйте следующую команду:
javac -d bin $(find . -name "*.java")
Эта команда определяет и компилирует все .java
-файлы в текущей и подчинённых директориях, а результаты помещает в папку bin
. Запустите эту команду из корневой директории вашего проекта.
Где и как применять правильные инструменты
Интегрированные среды разработки (Integrated Development Environments, IDE), такие как Eclipse и IntelliJ IDEA, предлагают функцию инкрементальной компиляции, автоматически отслеживающую изменения при сохранении файла. Эта функция требуется при работе над масштабными проектами на Java.
Для тех, кто предпочитает работать в терминале, значительно эффективнее будет применение ранее упомянутой команды из раздела Быстрый ответ.
Большие проекты, как правило, требуют применения инструментов сборки, таких как Apache Maven и Apache Ant. Здесь Maven отлично выполнит работу по управлению жизненным циклом проекта. Если вы работаете в мультитехнологической среде, Sbt для проектов на Scala, Ivy для Ant и Gradle для Groovy-проектов станут надёжной опорой.
Автоматизированный процесс сборки делает его более надёжным, предсказуемым и облегчает реализацию методики непрерывной интеграции – это важный элемент современного программного процесса.
Использование возможностей командной строки
Рекурсивная компиляция с применением вайлдкарда
Для компиляции всех Java-файлов в директории и её поддиректориях с помощью javac
воспользуйтесь командой find
с вайлдкардом:
find . -name "*.java" -print | xargs javac -d bin
Установка classpath для внешних зависимостей
Если в коде присутствуют внешние зависимости, укажите classpath, используя параметры -cp
или -classpath
:
javac -d bin -cp "lib/*" $(find . -name "*.java")
Это позволит компилятору javac
использовать JAR-файлы из директории lib
в процессе компиляции.
Обработка разделения аргументов xargs
Когда количество файлов слишком велико, xargs
может делить передачу аргументов на несколько вызовов javac
. В этих случаях, используйте GNU Parallel вместо xargs
, чтобы избежать проблем с разделением аргументов.
Визуализация
Взгляните на структуру проекта при выполнении рекурсивной компиляции с использованием javac
:
ProjectFolder (📂)
└── src (📂)
├── packageA (📂)
│ ├── Class1.java (📄⚙️)
│ └── Class2.java (📄⚙️)
├── packageB (📂)
│ ├── Class3.java (📄⚙️)
│ └── packageC (📂)
│ └── Class4.java (📄⚙️)
└── packageD (📂)
├── Class5.java (📄⚙️)
└── Class6.java (📄⚙️)
javac -d bin src/**/*.java
# Это как послать робота (🤖) за напитком в холодильник, а он по пути решает покрасить дом.
Данная визуализация показывает, как происходит рекурсивная компиляция каждого из .java
-файлов, вне зависимости от его размещения в структуре папок.
Освоим командную строку
Работа с пакетами
Если вам нужно скомпилировать Java-файлы, которые распределены по разным пакетам, используйте вайлдкарды (например, **
), чтобы javac
мог пройти через все соответствующие директории.
Используем команду exec вместе с find
Для более тонкого контроля применяйте find
в сочетании с exec
— это позволит компилировать каждый найденный файл по отдельности, минуя обработку xargs
:
find . -name "*.java" -exec javac -d bin {} \;
Компиляция с учётом зависимостей
Для корректной обработки импортированных зависимостей использование -sourcepath
обеспечивает указание исходного пути ресурсов для javac
:
javac -d bin -sourcepath src $(find src -name "*.java")
Автоматизация процесса сборки
С ростом сложности кода стоит задуматься о выборе подходящего вам инструмента для автоматизации сборки. Подобные инструменты помогают минимизировать влияние человеческого фактора и обеспечивают стабильные сборки. Они также являются ключевым элементом эффективной непрерывной интеграции и позволяют новим участникам команды в более короткие сроки интегрироваться в процесс разработки.
Полезные материалы
- javac — официальное руководство по
javac
от разработчиков Java. - FileSet Type — погрузитесь в работу со сводами файлов в Apache Ant.
- Apache Maven Compiler Plugin – Использование — узнайте больше о плагине компиляции Maven.
- Плагин Java для Gradle — обзор возможностей плагина Java для Gradle.
- Статья DZone о компиляции Java — подробный анализ процесса работы компилятора
javac
.