Компиляция всех Java-файлов в папке: рекурсия в javac

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы выполнить рекурсивную компиляцию всех Java-файлов при помощи компилятора javac, используйте следующую команду:

Bash
Скопировать код
javac -d bin $(find . -name "*.java")

Эта команда определяет и компилирует все .java-файлы в текущей и подчинённых директориях, а результаты помещает в папку bin. Запустите эту команду из корневой директории вашего проекта.

Кинга Идем в IT: пошаговый план для смены профессии

Где и как применять правильные инструменты

Интегрированные среды разработки (Integrated Development Environments, IDE), такие как Eclipse и IntelliJ IDEA, предлагают функцию инкрементальной компиляции, автоматически отслеживающую изменения при сохранении файла. Эта функция требуется при работе над масштабными проектами на Java.

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

Большие проекты, как правило, требуют применения инструментов сборки, таких как Apache Maven и Apache Ant. Здесь Maven отлично выполнит работу по управлению жизненным циклом проекта. Если вы работаете в мультитехнологической среде, Sbt для проектов на Scala, Ivy для Ant и Gradle для Groovy-проектов станут надёжной опорой.

Автоматизированный процесс сборки делает его более надёжным, предсказуемым и облегчает реализацию методики непрерывной интеграции – это важный элемент современного программного процесса.

Использование возможностей командной строки

Рекурсивная компиляция с применением вайлдкарда

Для компиляции всех Java-файлов в директории и её поддиректориях с помощью javac воспользуйтесь командой find с вайлдкардом:

Bash
Скопировать код
find . -name "*.java" -print | xargs javac -d bin

Установка classpath для внешних зависимостей

Если в коде присутствуют внешние зависимости, укажите classpath, используя параметры -cp или -classpath:

Bash
Скопировать код
javac -d bin -cp "lib/*" $(find . -name "*.java")

Это позволит компилятору javac использовать JAR-файлы из директории lib в процессе компиляции.

Обработка разделения аргументов xargs

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

Визуализация

Взгляните на структуру проекта при выполнении рекурсивной компиляции с использованием javac:

Markdown
Скопировать код
ProjectFolder (📂)
└── src (📂)
    ├── packageA (📂)
    │   ├── Class1.java (📄⚙️)
    │   └── Class2.java (📄⚙️)
    ├── packageB (📂)
    │   ├── Class3.java (📄⚙️)
    │   └── packageC (📂)
    │       └── Class4.java (📄⚙️)
    └── packageD (📂)
        ├── Class5.java (📄⚙️)
        └── Class6.java (📄⚙️)
Bash
Скопировать код
javac -d bin src/**/*.java 
# Это как послать робота (🤖) за напитком в холодильник, а он по пути решает покрасить дом.

Данная визуализация показывает, как происходит рекурсивная компиляция каждого из .java-файлов, вне зависимости от его размещения в структуре папок.

Освоим командную строку

Работа с пакетами

Если вам нужно скомпилировать Java-файлы, которые распределены по разным пакетам, используйте вайлдкарды (например, **), чтобы javac мог пройти через все соответствующие директории.

Используем команду exec вместе с find

Для более тонкого контроля применяйте find в сочетании с exec — это позволит компилировать каждый найденный файл по отдельности, минуя обработку xargs:

Bash
Скопировать код
find . -name "*.java" -exec javac -d bin {} \;

Компиляция с учётом зависимостей

Для корректной обработки импортированных зависимостей использование -sourcepath обеспечивает указание исходного пути ресурсов для javac:

Bash
Скопировать код
javac -d bin -sourcepath src $(find src -name "*.java")

Автоматизация процесса сборки

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

Полезные материалы

  1. javac — официальное руководство по javac от разработчиков Java.
  2. FileSet Type — погрузитесь в работу со сводами файлов в Apache Ant.
  3. Apache Maven Compiler Plugin – Использование — узнайте больше о плагине компиляции Maven.
  4. Плагин Java для Gradle — обзор возможностей плагина Java для Gradle.
  5. Статья DZone о компиляции Java — подробный анализ процесса работы компилятора javac.