Java: Как я могу скомпилировать всю структуру каталогов кода? - PullRequest
74 голосов
/ 22 января 2011

Вариант использования прост.Я получил исходные файлы, которые были созданы с использованием Eclipse.Таким образом, существует глубокая структура каталогов, где любой класс Java может ссылаться на другой класс Java в той же папке, дочерней, дочерней или родительской.

Как мне скомпилировать все это из терминала, используя javac?

Ответы [ 9 ]

52 голосов
/ 22 января 2011

Вы должны знать все каталоги или использовать подстановочный знак.

javac dir1/*.java dir2/*.java dir3/dir4/*.java dir3/dir5/*.java dir6/*src/*.java
46 голосов
/ 05 ноября 2011

В Bash 4 вы можете просто включить globstar

shopt -s globstar

и затем сделать

javac **/*.java
36 голосов
/ 13 марта 2013

Если все, что вы хотите сделать, это запустить свой основной класс (без компиляции файлов .java, от которых основной класс не зависит), то вы можете сделать следующее:

cd <root-package-directory>
javac <complete-path-to-main-class>

или

javac -cp <root-package-directory> <complete-path-to-main-class>

javac автоматически разрешит все зависимости и также скомпилирует все зависимости.

12 голосов
/ 22 января 2011

Я бы взял предложение Джона и использовал бы Ant, поскольку это довольно сложная задача.

Однако, если вы полны решимости собрать все это в одну строку в терминалеВ Linux вы можете использовать команду find .Но я не рекомендую это вообще, так как нет гарантии, что, скажем, Foo.java будет скомпилирован после Bar.java, даже если Foo использует Bar.Примером может быть:

find . -type f -name "*.java" -exec javac {} \;

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

10 голосов
/ 27 марта 2013

Ниже приведен метод, который я нашел:

1) Составьте список файлов с относительными путями в файле (скажем, FilesList.txt) следующим образом (либо через пробел, либо через строку):

foo/AccessTestInterface.java
foo/goo/AccessTestInterfaceImpl.java

2) Используйте команду:

javac @FilesList.txt -d classes

Это скомпилирует все файлы и поместит файлы классов в директорию классов.

Теперь простой способ создать FilesList.txt таков: Перейдите в корневой каталог вашего источника.

dir *.java /s /b > FilesList.txt

Но это заполнит абсолютный путь. С помощью текстового редактора «Заменить все» путь до исходного каталога (включая \ в конце) с «» (т.е. пустой строкой) и «Сохранить».

9 голосов
/ 22 января 2011

Вы должны будете использовать что-то вроде Ant, чтобы сделать это иерархически:

http://ant.apache.org/manual/Tasks/javac.html

Вам нужно будет создать скрипт сборки с целью, называемой compile, содержащей следующее:

<javac sourcepath="" srcdir="${src}"
         destdir="${build}" >
    <include name="**/*.java"/>
</javac>

Тогда вы сможете скомпилировать все файлы, выполнив:

 ant compile

Либо импортируйте ваш проект в Eclipse, и он автоматически скомпилирует все исходные файлы для этого.проект.

8 голосов
/ 25 мая 2014

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

Хорошая ситуация в одну строку, которая рекурсивно получает все файлы * .java, а также включает файлы * .jar, необходимые для сборки:

javac -cp ".:lib/*" -d bin $(find ./src/* | grep .java)

Здесь bin-файл является местом назначения файлов классов, lib (и, возможно, текущий рабочий каталог) содержат библиотечные файлы, и все java-файлы в каталоге src и ниже компилируются.

2 голосов
/ 11 октября 2013

Решение для Windows: Предполагается, что все файлы, содержащиеся в подкаталоге 'src', и вы хотите скомпилировать их в 'bin'.

for /r src %i in (*.java) do javac %i -sourcepath src -d bin

Если src содержит файл .java сразу под ним, тогда этобыстрее

javac src\\*.java -d bin
2 голосов
/ 17 ноября 2012

Существует способ сделать это без использования символа канала, что удобно, если вы делаете процесс из другого языка программирования, чтобы сделать это:

find $JAVA_SRC_DIR -name '*.java' -exec javac -d $OUTPUT_DIR {} +

Хотя, если вы находитесь в Bash и /или не возражаете против использования трубы, тогда вы можете сделать:

find $JAVA_SRC_DIR -name '*.java' | xargs javac -d $OUTPUT_DIR
...