最近在修改公司的一个旧项目,经常需要修改其中一个Source Folder里面的部分java代码。修改完成后还要编译打包。最后再把jar包上传到服务器,重启服务器以进行调试。本来任务不难,但里面代码有点儿复杂。这样修改调试就显得十分繁琐。在尝试使用ant自动打包的过程中,我遇到了如下的问题:项目下有多个Source Folder,现在只需要将其中一个Source Folder下面的所有java文件编译并打成jar包。而这些java文件有可能依赖于其他Source Folder里面的类。想了半天没有结果,我又找同学请教、上网搜索。经过一系列不懈努力,我终于完成了该任务。
主要思路是:分两次编译。第一次编译所有java文件并将class文件保存在临时目录,第二次引用临时目录中的class文件来编译指定目录下的java文件以生成需要的class文件,最后把这些class文件打包。任务分解成这三步之后,每一步都挺简单的了。
下面贴出该任务的代码:
<?xml version= "1.0"?>
<project default="defaultTarget" basedir=".">
<!-- 基本属性定义 -->
<property name="base" value="." />
<!-- 该项目是WEB项目,第三方jar包默认保存在该路径下 -->
<property name="lib" value="WebRoot/WEB-INF/lib" />
<!-- javaEE包 -->
<property name="javaeeLib" value="D:/soft/lib/javaee/javaee.jar" />
<!-- 指定的Source Folder,即:将该目录下的类对应的class文件打包 -->
<property name="src.1.dir" value="vendue-src" />
<property name="src.2.dir" value="${base}" />
<property name="classes.1.dir" value="vendue-classes" />
<property name="classes.2.dir" value="other-classes" />
<!-- jar文件的保存位置,这里暂时保存在桌面,可以根据自己需要重新指定 -->
<property name="jarFile" value="C:/Documents and Settings/Administrator/桌面/vendue_KernlEngine.jar" />
<!-- 定义编译时需要的第三方jar包 -->
<path id="Third-Part Lib">
<fileset dir="${lib}">
<include name="**/*.jar" />
</fileset>
</path>
<!-- 初始化:创建两个临时目录 -->
<target name="init">
<mkdir dir="${classes.1.dir}" />
<mkdir dir="${classes.2.dir}" />
</target>
<!-- 编译所有java文件,供第二次编译时引用 -->
<target name="compileAll" depends="init">
<javac srcdir="${src.2.dir}" destdir="${classes.2.dir}" encoding="gbk">
<classpath refid="Third-Part Lib">
</classpath>
<classpath path="${javaeeLib}">
</classpath>
</javac>
</target>
<!-- 编译指定源文件夹下的java文件 -->
<target name="compile" depends="compileAll">
<javac srcdir="${src.1.dir}" destdir="${classes.1.dir}" encoding="gbk">
<classpath refid="Third-Part Lib" />
<classpath path="${classes.2.dir}" />
<classpath>
<fileset dir="${baseLib}">
<include name="**/*.jar" />
</fileset>
</classpath>
</javac>
</target>
<!-- 打包生成jar文件-->
<target name="defaultTarget" depends="compile">
<jar destfile="${jarFile}" basedir="${classes.1.dir}" />
</target>
<!-- 清理临时目录以及该目录下的所有临时文件 -->
<target name="clean">
<delete dir="classes.1.dir" />
<delete dir="classes.2.dir" />
</target>
</project>
参考文章
标题:Multiplesource folders: Avoid implicit compilation with Ant
地址:http://stackoverflow.com/questions/4627913/multiple-source-folders-avoid-implicit-compilation-with-ant
截图:
