Java: Как я могу скомпилировать всю структуру каталогов кода?

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

Как скомпилировать все это из терминала с помощью javac?

Ответ 1

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

javac dir1/*.java dir2/*.java dir3/dir4/*.java dir3/dir5/*.java dir6/*src/*.java

Ответ 2

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

shopt -s globstar

а затем do

javac **/*.java

Ответ 3

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

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

или

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

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

Ответ 4

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

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

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

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

Ответ 5

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

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

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

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

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

 ant compile

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

Ответ 6

Ниже приведен найденный метод:

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

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

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

javac @FilesList.txt -d classes

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

Теперь простой способ создать файлList.txt: Перейдите в исходный корневой каталог.

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

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

Ответ 7

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

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

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

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

Ответ 8

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

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

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

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

Ответ 9

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

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

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

javac src\\*.java -d bin