【问题标题】:Compiling java files in all subfolders? [duplicate]编译所有子文件夹中的java文件? [复制]
【发布时间】:2011-03-04 14:19:23
【问题描述】:

如何使用 javac 编译 Unix 上所有子文件夹中的所有 java 文件?

【问题讨论】:

    标签: java javac


    【解决方案1】:

    在 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

    但正如其他人所建议的那样,构建工具可能会很有帮助。

    【讨论】:

    • 谢谢。我收到此错误消息:javac: invalid flag: ./lucene/org/apache/lucene/.svn/prop-base/LucenePackage.java.svn-base
    • 哎呀,该文件似乎具有 .java 扩展名,而您不想编译它,它可以与 grep --include=.java 一起使用吗?它还编译你的其他文件吗?
    • for /r %a in (*.java) do (jikes.exe -d bin\ -cp jre6\lib\rt.jar;WEB-INF\lib\*.jar "%a ")
    • for /r %a in (*.java) do (java -jar ecj.jar -d bin\ -cp jre6\lib\rt.jar;WEB-INF\lib*.jar " %a")
    • 在win10上,出现这个错误:%%a was unexpected at this time.
    【解决方案2】:

    使用构建工具,例如 AntMaven。两者都可以让您以比使用例如更好的方式管理依赖项。 find UNIX 工具。 And 和 Maven 还允许您定义除编译之外要执行的自定义任务。此外,Maven 还附带了用于管理远程存储库中的外部依赖项的约定,以及用于运行单元测试和支持持续集成的功能的约定。

    即使您只需要偶尔编译一次源文件,您也可能会发现设置一个简单的 Ant build.xml 文件最终可以节省大量时间。

    最后,大多数流行的 IDE 和代码编辑器应用程序都与 Ant 构建脚本进行了某种集成,因此您可以在编辑器中运行所有 Ant 任务。 NetBeansEclipseIDEA 等还内置了对 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 会更容易。

    【讨论】:

    • 不应该是正确的答案:“你这样做......但 Ant/Maven 会更适合你”?真正试图掌握如何使用 javac(问题的目的)的人不会在此找到答案。
    【解决方案3】:

    我不知道这是否是最好的方法,但这应该可行:

    find . -name "*.java" | xargs javac
    

    【讨论】:

    • 呃,它不起作用。可能是因为 find 命令在 mac 上的工作方式不同? (-name 标志不存在)
    • 即使支持 -name,如果当前文件夹中存在 .java 文件,它也不起作用,因为 shell 会扩展通配符。使用引号(又名 find -name "*.java")。
    • 我修改了答案以添加引号和要使用的路径。这次它应该可以在 Mac OS X 上运行。它在没有引号的 Debian 上工作: $ find 。 -name *.java ---> ./test.java
    • 不鼓励将 java 文件放在“默认”包中。您不能从任何其他包中导入该类。
    【解决方案4】:

    使用Ant 编写脚本来编译任意数量的源文件夹。

    【讨论】:

      【解决方案5】:

      使用 Maven(作为 Ant 的更现代替代品)。

      使用 IDE,例如 Eclipse(我知道的所有 IDE 都会很乐意为您编译多个源文件夹)

      【讨论】:

        【解决方案6】:

        另一种(不太灵活)方式,如果您知道文件夹级别:

        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
        

        但实际上,正如其他人所说,使用构建工具。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-19
          • 1970-01-01
          • 2020-03-08
          • 2020-07-08
          • 1970-01-01
          相关资源
          最近更新 更多