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


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

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

9 69

9 ответов:

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

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

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

shopt -s globstar

а потом сделать

javac **/*.java

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

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

или

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

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

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

однако, если вы решили получить все это в одной строке в терминале, на Linux вы можете использовать найти

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

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

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

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

javac @FilesList.txt -d classes

Это позволит скомпилировать все файлы и поместить файлы класса в каталог классов.

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

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

но, это заполнит абсолютный путь. С помощью текстового редактора "заменить все" путь до исходного каталога (include \ in the end) с "" (т. е. пустая строка) и сохранить.

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

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

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

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

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

 ant compile

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

уже существующие ответы, похоже, касаются только *.сами файлы 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 {} +

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

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 содержит a .java файл сразу под ним, то это быстрее

javac src\*.java -d bin