前些日子因为要搞自动编译需要用到Ant执行相关操作。Ant以前经常用,常常用来编译、打包、部署,以及用它来生成javadoc。可现如今,没想到Ant反倒给我出了一个不大不小的难题——编译失败且无任何提示!
大概4年以前,当时Eclipse还没有现在这么强大,对于打jar、war还不方便,我们经常使用Ant辅助Eclipse来完成这些操作,不曾记得有这些个古怪的问题。
先看build.xml
<javac srcdir="${src.dir}"
destdir="${classes.dir}"
encoding="UTF-8"
source="1.6"
target="1.6"
debug="true"
>
<classpath refid="build.classpath" />
</javac>
这里没有列出详细的build.xml,仅分析上述代码,只要路径正确,依赖包存在,编译应当正常通过。倘若路径、依赖包出现问题,至少能在控制台中获得相应提示。但是,问题还是出现了,执行上述任务,在控制台得不到任何提示,无法确认编译是否成功!
控制台输出结果:
引用
Buildfile: D:\work\workspace\xyz\build\build.xml
clean:
[echo] Clean
[delete] Deleting directory D:\work\workspace\xyz\build\classes
init:
[echo] Init
[mkdir] Created dir: D:\work\workspace\xyz\build\classes
compile:
[echo] Compile
[javac] Compiling 120 source files to D:\work\workspace\xyz\build\classes
控制台输出到此,什么提示也没有了,很诡异!
同样的build.xml在别的项目中就没有任何问题。
仔细检查classes目录,文件正常编译。
经过代码检查,发现非规范代码应用,如:
Date d = new Date("2009-01-01");
在JDK 1.1中,该构造函数被废弃,即加入了“@Deprecated”标识。
同理,代码中调用了废弃的方法,或某个类加上了废弃“@Deprecated”标识,都会有这个问题。不曾想到Ant居然对这些废弃标识有如此要求!
设想加入“-Xlint:unchecked -Xlint:deprecation”编译参数。
<javac srcdir="${src.dir}"
destdir="${classes.dir}"
encoding="UTF-8"
source="1.6"
target="1.6"
debug="true"
deprecation="false"
optimize="false"
failonerror="true"
>
<classpath refid="build.classpath" />
<compilerarg value="-Xlint:unchecked -Xlint:deprecation" />
</javac>
未果!看来只能对现有代码一一清理了!
去除所有非规范依赖应用,将废弃类代码清理,继续编译,未果!
发现代码中部分有非规范泛型应用,如下所示:
Enumeration headerNames = request.getHeaderNames();
这里没有强制使用泛型转换,导致编译失败,可加入“@SuppressWarnings("unchecked")”标识。
对代码一一排查,针对所有“黄标签”代码进行修正。
重新编译,通过!
引用
Buildfile: D:\work\workspace\xyz\build\build.xml
clean:
[echo] Clean
[delete] Deleting directory D:\work\workspace\xyz\build\classes
init:
[echo] Init
[mkdir] Created dir: D:\work\workspace\xyz\build\classes
compile:
[echo] Compile
[javac] Compiling 120 source files to D:\work\workspace\xyz\build\classes
BUILD SUCCESSFUL
Total time: 7 seconds
以前使用Ant都是针对新系统,代码要求极为严格,尤其是对于“黄标签类”有着很严格的要求,在提交代码时就有可能被清理掉。但此次主要是对遗留系统做相关调整,难免遇到这些奇怪的问题。
这也告诫大家,在书写代码时尽量按照相关规范书写:避免使用废弃的方法、类,避免声明无用变量。在使用聚合类时,注意使用泛型。如果泛型不明确,可强制使用“@SuppressWarnings("unchecked")”标识。
如果大家遇到此类问题可以参考上述方法对症下药,最关键之处还是在于代码的规范编写!