Javac для компиляции всех java файлов в данной директории рекурсивно

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

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

javac com/vistas/util/*.java com/vistas/converter/*.java
      com.vistas.LineHelper/*.java com/current/mdcontect/*.java

(в одной строке)

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

Ответ 1

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

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

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

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

# Linux / MacOS
$ find -name "*.java" > sources.txt
$ javac @sources.txt

:: Windows
> dir /s /B *.java > sources.txt
> javac @sources.txt
  • Преимуществом является то, что это быстрое и простое решение.
  • Недостатком является то, что вам необходимо восстановить файл sources.txt каждый раз, когда вы создаете новый источник, или переименовываете существующий файл, который легко забыть (таким образом, подвержен ошибкам) и утомительной задачей.

Использование инструмента построения

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

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

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

<project default="compile">
    <target name="compile">
        <mkdir dir="bin"/>
        <javac srcdir="src" destdir="bin"/>
    </target>
</project>

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

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

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

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

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

Использование среды IDE

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

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

Еще одно примечание

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

Ответ 2

find . -name "*.java" -print | xargs javac 

Добродетель жестокий, но работает как ад. (Используйте только на небольших программах, это абсолютно не эффективно)

Ответ 3

Если ваша оболочка поддерживает его, будет что-то вроде этой работы?

javac com/**/*.java 

Если ваша оболочка не поддерживает **, возможно,

javac com/*/*/*.java

работает (для всех пакетов с 3 компонентами - более или менее адаптируется).

Ответ 4

В обычном случае, когда вы хотите скомпилировать весь проект, вы можете просто предоставить javac вашему основному классу и позволить ему скомпилировать все необходимые зависимости:

javac -sourcepath . path/to/Main.java

Ответ 5

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

Вам просто нужно определить такой объект в файле build.xml:

<target name="compile">
    <javac srcdir="your/source/directory"
           destdir="your/output/directory"
           classpath="xyz.jar" />
</target>

Ответ 6

Я просто использую make с простым make файлом, который выглядит так:

JAVAC = javac -Xlint:unchecked
sources = $(shell find . -type f -name '*.java')
classes = $(sources:.java=.class)

all : $(classes)

clean :
        rm -f $(classes)

%.class : %.java
        $(JAVAC) $<

Он объединяет источники по одному и только при необходимости перекомпилирует.

Ответ 7

Команда javac не выполняет рекурсивный процесс компиляции, поэтому вы указываете каждый каталог при запуске команды или предоставляете текстовый файл с каталогами, которые вы хотите включить:

javac -classpath "${CLASSPATH}" @java_sources.txt

Ответ 8

Я использовал это в проекте JCI Xcode для рекурсивного создания моих тестовых классов:

find ${PROJECT_DIR} -name "*.java" -print | xargs javac -g -classpath ${BUILT_PRODUCTS_DIR} -d ${BUILT_PRODUCTS_DIR}

Ответ 9

javac -cp "jar_path/*" $(find. -name '*.java')

(Я предпочитаю не использовать xargs, потому что он может разделить их и запустить javac несколько раз, каждый с подмножеством java файлов, некоторые из которых могут импортировать другие, не указанные в одной и той же командной строке javac)

Если у вас есть точка входа App.java, лучше всего использовать freaker с помощью -sourcepath. Он компилирует каждый другой файл java, который ему нужен, следуя за импортом -d. например:

javac -cp "jar_path/*" -sourcepath src/src/com/companyname/modulename/App.java

Вы также можете указать целевой каталог файл: -d target/.

Ответ 10

Попробуйте сделать это: javac */*/*/*.java на Mac и Linux, но javac *\*\*\*.java в Windows.