最近要做一个Swing的程序,要求运行在jdk1.4下,久闻Netbeans的guibuilder的大名,因此想用它做界面设计。从网上下了netbeans5.0的安装程序,之所以装5.0版本是因为它是能够运行在jdk1.4下的最高版本。果然如大家所说它的guibuilder做得相当出色,不过我认为netbeans的速度和编辑功能远不如eclipse,我是拿netbeans5.0和eclipse3.3做比较,当然一点也不公平。
程序接近尾声,总要写一个build.xml来自动编译,发布我的程序,当然不能用netbeans自己生成的build.xml,因为它依赖于netbeans特有的jar包,我希望用户没有netbeans也能用ant来编译,并且自带的可能也不能满足我的功能,但是我也不想重新再写一个build.xml,于是需要自定义netbeans生成的build.xml,幸运的是,netbeans生成的build.xml相当具有扩展性。
netbeans生成的build.xml的主要功能由build-impl.xml来完成,里面对每一个功能xxx都由_pre_xxx, _do_xxx, _post_xxx来完成,一般_do_xxx完成主要的功能,而_pre_xxx和_post_xxx是扩展点,它们分别在_do_xxx之前和之后调用。build-impl.xml中也定义了大量的宏,像javac,java,javadoc,debug都有对应的宏,这使得只需要修改一处,其它的地方就自动修改了。
在自定义Netbeans生成的build.xml时要注意,最好不要改变build-impl.xml文件,因为它由netbeans自动生成,并且每次做某种设置时(如添加类库)时就可能改变。
功能一:
加载自己的属性文件,其中定义的属性能够覆盖默认的属性。
在项目目录下建立一个build.properties文件,其中定义自己的属性。然后在build.xml中加入
<target name="-pre-init">
<property file="build.properties"/>
</target>
它重新定义了build-impl.xml中的-pre-init目标,任何其它目标运行之间都会先调用这个目标。
功能二:
设置javac编译的源文件编码为utf-8格式。由于不指定编译时,javac用的是本地操作系统的编码,一般windows的文件编码是gb2312,而我的java源文件一般使用utf-8的编码格式,可是build-impl.xml中并没有提供这一选项,不得已只能copy build-impl.xml中的javac宏,然后再加上编码:
<!-- add encoding support -->
<target name="-init-macrodef-javac">
<macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute name="srcdir" default="${src.dir}"/>
<attribute name="destdir" default="${build.classes.dir}"/>
<attribute name="classpath" default="${javac.classpath}"/>
<attribute name="debug" default="${javac.debug}"/>
<attribute name="encoding" default="utf-8"/>
<element name="customize" optional="true"/>
<sequential>
<javac srcdir="@{srcdir}" destdir="@{destdir}" debug="@{debug}" deprecation="${javac.deprecation}" source="${javac.source}" target="${javac.target}" includeantruntime="false" encoding="@{encoding}">
<classpath>
<path path="@{classpath}"/>
</classpath>
<compilerarg line="${javac.compilerargs}"/>
<customize/>
</javac>
</sequential>
</macrodef>
</target>
幸好build-impl.xml中使用了宏,这样我们不必在每个使用javac的地方都作改动了。
功能三:
去除对netbeans特定包的依赖(如swing-layout.jar)。
首先在项目目录下建立一个lib目录,在其中放入swing-layout.jar,如果还有其它的依赖也需要放入其它的依赖,为每一个依赖在build.properties(这是我们自己加入的文件)加入相应的属性,如:
libs.swing-layout.classpath=lib/swing-layout-1.0.jar
左边的名字可以在project.properties中找到,右边的值就是库对应的路径。
最后还要加上:
libs.CopyLibs.classpath=lib/build/org-netbeans-modules-java-j2seproject-copylibstask.jar
netbeans用这个库来copy lib,你需要将它copy到项目目录/lib/build(当然其它的目录也可以)下,这个库的原来路径是netbeans安装目录\ide6\ant\extra\org-netbeans-modules-java-j2seproject-copylibstask.jar。
功能四:
运行jar目标是添加额外的文件。重新定义-post-jar目标就可以了。
功能五:
添加新的目录,直接加在build.xml后面就可以了