Ответ 1
Вы должны знать все каталоги или иметь возможность использовать подстановочный знак.
javac dir1/*.java dir2/*.java dir3/dir4/*.java dir3/dir5/*.java dir6/*src/*.java
Пример использования прост. Я получил исходные файлы, созданные с помощью Eclipse. Таким образом, существует глубокая структура каталогов, где любой Java-класс может ссылаться на другой Java-класс в той же папке, дочерней, родной или родительской.
Как скомпилировать все это из терминала с помощью javac?
Вы должны знать все каталоги или иметь возможность использовать подстановочный знак.
javac dir1/*.java dir2/*.java dir3/dir4/*.java dir3/dir5/*.java dir6/*src/*.java
С Bash 4 вы можете просто включить globstar
shopt -s globstar
а затем do
javac **/*.java
Если все, что вы хотите сделать, это запустить ваш основной класс (без компиляции файлов .java
, от которых не зависит основной класс), вы можете сделать следующее:
cd <root-package-directory>
javac <complete-path-to-main-class>
или
javac -cp <root-package-directory> <complete-path-to-main-class>
javac
автоматически разрешит все зависимости и скомпилирует все зависимости.
Я бы предложил Jon и использовал Ant, так как это довольно сложная задача.
Однако, если вы решите получить все в одной строке в терминале, на Linux вы можете использовать find. Но я не рекомендую это вообще, так как нет гарантии, что, скажем, Foo.java будет скомпилирован после Bar.java, хотя Foo
использует Bar
. Примером может служить:
find . -type f -name "*.java" -exec javac {} \;
Если все ваши классы еще не были скомпилированы, если есть один основной провод или класс драйвера (в основном тот, который содержит ваш основной метод), компиляция этого основного класса по отдельности должна скомпилировать большую часть проекта, даже если они находятся в разных папок, поскольку Javac будет стараться изо всех сил разрешать проблемы с зависимостями.
Вам нужно использовать что-то вроде Ant для этого иерархически:
http://ant.apache.org/manual/Tasks/javac.html
Вам нужно будет создать конструкцию script с объектом, называемым компилятором, который содержит следующее:
<javac sourcepath="" srcdir="${src}"
destdir="${build}" >
<include name="**/*.java"/>
</javac>
Тогда вы сможете скомпилировать все файлы, выполнив:
ant compile
В качестве альтернативы импортируйте проект в Eclipse, и он автоматически скомпилирует все исходные файлы для этого проекта.
Ниже приведен найденный метод:
1) Составьте список файлов с относительными путями в файле (например, FilesList.txt) следующим образом (либо разделенное пробелом, либо разделенное по строке):
foo/AccessTestInterface.java
foo/goo/AccessTestInterfaceImpl.java
2) Используйте команду:
javac @FilesList.txt -d classes
Это скомпилирует все файлы и поместит файлы классов внутри классов.
Теперь простой способ создать файлList.txt: Перейдите в исходный корневой каталог.
dir *.java /s /b > FilesList.txt
Но это будет заполнять абсолютный путь. Используя текстовый редактор "Заменить все" путь к исходному каталогу (включая\в конце) с помощью "(т.е. Пустой строки) и" Сохранить".
Уже существующие ответы, похоже, касаются только самих файлов *.java, а не того, как легко это сделать с библиотечными файлами, которые могут понадобиться для сборки.
Хорошая однострочная ситуация, которая рекурсивно получает все *.java файлы, а также включает *.jar файлы, необходимые для построения:
javac -cp ".:lib/*" -d bin $(find ./src/* | grep .java)
Здесь файл bin является местом назначения файлов классов, lib (и, возможно, текущий рабочий каталог) содержит файлы библиотеки, и все java файлы в каталоге src и ниже компилируются.
Существует способ сделать это, не используя символ канала, что удобно, если вы выполняете процесс с другого языка программирования, чтобы сделать это:
find $JAVA_SRC_DIR -name '*.java' -exec javac -d $OUTPUT_DIR {} +
Хотя если вы находитесь в Bash и/или не возражаете, используя трубку, вы можете сделать:
find $JAVA_SRC_DIR -name '*.java' | xargs javac -d $OUTPUT_DIR
Решение для Windows: Предположим, что все файлы, содержащиеся в подкаталоге 'src', и вы хотите скомпилировать их в "bin".
for /r src %i in (*.java) do javac %i -sourcepath src -d bin
Если src содержит файл .java сразу под ним, это быстрее
javac src\\*.java -d bin