опция javac для рекурсивной компиляции всех java-файлов в данном каталоге - PullRequest
114 голосов
/ 08 июля 2011

Я использую компилятор 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-каталога?

Ответы [ 9 ]

196 голосов
/ 07 января 2012

Я бы также предложил использовать какой-нибудь инструмент для сборки ( 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

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

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

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

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

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

Одна дополнительная заметка

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

39 голосов
/ 01 декабря 2011
find . -name "*.java" -print | xargs javac 

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

27 голосов
/ 08 июля 2011

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

javac com/**/*.java 

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

javac com/*/*/*.java

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

23 голосов
/ 02 июля 2015

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

javac -sourcepath . path/to/Main.java

3 голосов
/ 05 декабря 2018

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

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

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

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

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

3 голосов
/ 08 июля 2011

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

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

<target name="compile">
    <javac srcdir="your/source/directory"
           destdir="your/output/directory"
           classpath="xyz.jar" />
</target>
2 голосов
/ 03 апреля 2015

Я просто использую 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) $<

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

1 голос
/ 08 января 2014

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

javac -classpath "${CLASSPATH}" @java_sources.txt
0 голосов
/ 27 марта 2014

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

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