【发布时间】:2011-03-04 14:19:23
【问题描述】:
如何使用 javac 编译 Unix 上所有子文件夹中的所有 java 文件?
【问题讨论】:
如何使用 javac 编译 Unix 上所有子文件夹中的所有 java 文件?
【问题讨论】:
在 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
但正如其他人所建议的那样,构建工具可能会很有帮助。
【讨论】:
%%a was unexpected at this time.
使用构建工具,例如 Ant 或 Maven。两者都可以让您以比使用例如更好的方式管理依赖项。 find UNIX 工具。 And 和 Maven 还允许您定义除编译之外要执行的自定义任务。此外,Maven 还附带了用于管理远程存储库中的外部依赖项的约定,以及用于运行单元测试和支持持续集成的功能的约定。
即使您只需要偶尔编译一次源文件,您也可能会发现设置一个简单的 Ant build.xml 文件最终可以节省大量时间。
最后,大多数流行的 IDE 和代码编辑器应用程序都与 Ant 构建脚本进行了某种集成,因此您可以在编辑器中运行所有 Ant 任务。 NetBeans、Eclipse、IDEA 等还内置了对 Maven 的支持。
如果您是 Ant 新手,请先阅读 this。以下是链接中的示例构建文件:
<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 会更容易。
【讨论】:
我不知道这是否是最好的方法,但这应该可行:
find . -name "*.java" | xargs javac
【讨论】:
使用Ant 编写脚本来编译任意数量的源文件夹。
【讨论】:
另一种(不太灵活)方式,如果您知道文件夹级别:
javac *.java */*.java */*/*.java */*/*/*.java */*/*/*/*.java ...
根据您的 shell,您可能必须将其设置为将不匹配的模式扩展为空,在 bash 中使用 shopt -s nullglob。例如,我使用以下 shell 函数在我的 java 文件中查找文本:
function jgrep ()
{
(
shopt -s nullglob
egrep --color=ALWAYS -n "$@" *.tex *.java */*.java */*/*.java */*/*/*.java */*/*/*/*.java */*/*/*/*/*.java
)
}
jgrep String
但实际上,正如其他人所说,使用构建工具。
【讨论】: