如何使用javac编译Unix上所有子文件夹中的所有java文件?
答案 0 :(得分:27)
在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
但正如其他人所说,构建工具可能会有所帮助。
答案 1 :(得分:17)
使用Ant或Maven等构建工具。两者都可以以比使用例如使用例如更好的方式更好的方式管理依赖关系。 find
UNIX工具。 And和Maven还允许您定义除编译之外要执行的自定义任务。 Maven还提供了管理远程存储库中外部依赖关系的约定,以及运行单元测试和支持持续集成的功能的约定。
即使您只需要偶尔编译源文件,您也可能会发现设置一个简单的Ant build.xml
文件最终可以节省大量时间。
最后,大多数流行的IDE和代码编辑器应用程序都与Ant构建脚本进行了某种集成,因此您可以在编辑器中运行所有Ant任务。 NetBeans,Eclipse,IDEA等内容也为Maven提供了内置支持。
首先阅读this,如果您是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 :(得分:8)
我不知道这是不是最好的方法,但这应该有效:
find . -name "*.java" | xargs javac
答案 3 :(得分:2)
使用Ant编写脚本以编译任意数量的源文件夹。
答案 4 :(得分:1)
答案 5 :(得分:0)
另一种(不太灵活)的方式,如果您知道文件夹级别有多少:
javac *.java */*.java */*/*.java */*/*/*.java */*/*/*/*.java ...
根据您的shell,您可能必须将其设置为在使用shopt -s nullglob
的bash中将不匹配的模式扩展为空。例如,我使用以下shell函数在我的java文件中查找文本:
function jgrep ()
{
(
shopt -s nullglob
egrep --color=ALWAYS -n "$@" *.tex *.java */*.java */*/*.java */*/*/*.java */*/*/*/*.java */*/*/*/*/*.java
)
}
jgrep String
但实际上,正如其他人所说的那样,使用构建工具。