Как скомпилировать все java файлы во всех подпапках в Unix, используя javac?
Компиляция java файлов во всех подпапках?
Ответ 1
Используйте инструмент построения, например Ant или Maven. Оба позволяют управлять зависимостями намного лучше, чем это может быть выполнено с использованием, например, инструмент find
UNIX. И And и Maven также позволяют вам определять пользовательские задачи, которые должны выполняться в дополнение к компиляции. Кроме того, Maven предлагает соглашения для управления внешними зависимостями в удаленных репозиториях, а также соглашения для запуска модульных тестов и функций, которые поддерживают непрерывную интеграцию.
Даже если вам просто нужно скомпилировать исходные файлы раз в то время, вы, вероятно, обнаружите, что настройка простого файла Ant build.xml
может быть большой заставкой в конце.
Наконец, большинство популярных приложений IDE и редактора кода имеют некоторую интеграцию с скриптами Ant build, поэтому вы можете запускать все задачи Ant из редактора. NetBeans, Eclipse, IDEA и многое другое также имеет встроенную поддержку Maven.
Сначала прочтите этот, если вы новичок в Ant. Ниже приведен пример файла сборки из ссылки:
<project name="MyProject" default="dist" basedir=".">
<description>
simple example build file
</description>
<!-- set global properties for this build -->
<property name="src" location="src"/>
<property name="build" location="build"/>
<property name="dist" location="dist"/>
<target name="init">
<!-- Create the time stamp -->
<tstamp/>
<!-- Create the build directory structure used by compile -->
<mkdir dir="${build}"/>
</target>
<target name="compile" depends="init"
description="compile the source " >
<!-- Compile the java code from ${src} into ${build} -->
<javac srcdir="${src}" destdir="${build}"/>
</target>
<target name="dist" depends="compile"
description="generate the distribution" >
<!-- Create the distribution directory -->
<mkdir dir="${dist}/lib"/>
<!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file -->
<jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/>
</target>
<target name="clean"
description="clean up" >
<!-- Delete the ${build} and ${dist} directory trees -->
<delete dir="${build}"/>
<delete dir="${dist}"/>
</target>
</project>
Как только вы знакомы с Ant, вам будет легче перемещаться в Maven.
Ответ 2
В Windows...
Создайте пакетный файл:
for /r %%a in (.) do (javac %%a\*.java)
... затем выполните его в исходной папке верхнего уровня.
В Linux...
javac $(find ./rootdir/* | grep .java)
Оба ответа взяты из этой темы...
http://forums.oracle.com/forums/thread.jspa?threadID=1518437&tstart=15
Но, как предложили другие, инструмент построения, вероятно, окажется полезным.
Ответ 3
Я не знаю, если это лучший способ, но это должно работать:
find . -name "*.java" | xargs javac
Ответ 4
Используйте Ant, чтобы написать script для компиляции как можно большего количества исходных папок.
Ответ 5
Используйте Maven (как более современную альтернативу Ant).
Используйте IDE, например Eclipse (все IDE, которые, как я знаю, с радостью собирают для вас несколько исходных папок)
Ответ 6
Другой (менее гибкий) способ, если вы знаете, сколько уровней папок есть:
javac *.java */*.java */*/*.java */*/*/*.java */*/*/*/*.java ...
В зависимости от вашей оболочки вам, возможно, придется установить ее для расширения несогласованных шаблонов до нуля, в bash с помощью shopt -s nullglob
. Например, я использую следующую функцию оболочки для поиска текста в своих java файлах:
function jgrep ()
{
(
shopt -s nullglob
egrep --color=ALWAYS -n "[email protected]" *.tex *.java */*.java */*/*.java */*/*/*.java */*/*/*/*.java */*/*/*/*/*.java
)
}
jgrep String
Но на самом деле используйте инструмент построения, как говорили другие.