解惑

解己之惑,解人之惑

标签:Ant

java.lang.ClassCastException: com.sun.tools.javadoc.ClassDocImpl

这个是在生成Javadoc的时候发现的,google了下,不少问的,第一个是说这个是个bug,其实以前也google过,看到那个说是bug而且优先级是4-Low,状态也不是close就没有去理会这个问题,这次又搜索了下,耐着性子看了几个帖子,发现这个不是bug,而是有解决方案,因为我是在ant脚本里面加的,解决方案就是在javadoc的task指定classpath或者classpathref,只要和你编译那些类使用一样的classpath或者classpathref就行。

Ant下通过FTP删除目录

一个很简单的问题,但是google了下竟然发现没有太多的答案,仔细看了下Ant的文档,自己摸索出来了方法:

        <ftp action="del" server="${remote.host}" port="${ftp.port}" remotedir="${remote.dir}" userid="${user}" password="${password}">
            <fileset>
                <include name="test/**/*"/>
            </fileset>
        </ftp>
        <ftp action="rmdir" server="${remote.host}" port="${ftp.port}" remotedir="${remote.dir}" userid="${user}" password="${password}">
            <fileset>
                <include name="test/**/*"/>
                <include name="test"/>
            </fileset>
        </ftp>

好像必须得这样才行,第一步先得把文件全部删除,使用的action是del,然后删除全部的子目录,使用的action是rmdir,删除目录的时候把要删除的那个目录连带也删除。

JUnit4和Ant的恩怨

今天继续写build脚本,加JUnit的target,但是我开始用的是Ant1.6.2,但是JUnit用的是4.1,发现编译正常,但是运行的时候出错,报的错是ClassNotFoundException,google了下,发现很多人有类似的问题,但是没有多少好的答案,最后在同事的一起努力下搞定,有两种情况:

  • 使用Ant1.6.2或者1.6.5的情况下,修改Test类,增加下面的方法:

public static junit.framework.Test suite() {
                return new JUnit4TestAdapter(TestXxxx.class);
}

还有就是注意ClassPath的定义:

    <path id="classpath">
        <fileset dir="${basedir}">
             <include name="lib/**/*.jar"/>
        </fileset>
        <fileset dir="${web.dir}">
              <include name="WEB-INF/lib/**/*.jar"/>
        </fileset>
  <pathelement path="${class.dir}"/>
    </path>

开始的时候,那个pathelement部分也是和其他的一样使用的fileset,不知道为什么必须使用pathelement才好使。

  • 使用Ant1.7.0的情况下,就不需要修改Test用那个什么JUnit4TestAdapter了。注意,好像Ant1.7.1有问题,可能是我的那个classpath搞的,没有仔细试过,报的错误是Can not open zip file,没有具体指出是那个zip文件找不到,根据google的一些结果建议回滚到Ant1.7.0。

太复杂了!!!

今天总算是把工程在Eclipse下配置好了,而且没有任何错误,从Oneal那里拷贝来的工程文件一堆错误,我这个人又是那种容不得满眼全是错误的人,花了一个小时搞定这个问题,开始熟悉项目,结果是:真是太复杂了!
系统的大部分都是通过Web Service调用的,包括和其他的系统集成以及和工作流引擎集成,而Web Service又是通过Session Bean调用DAO,DAO再调用hibernate,而Session Bean用到了版本2和版本3(也就是同时使用了EJB2和EJB3),因此工程有N个EJB的模块,源代码也分布在几十个大大小小的目录中,同时Web工程也是N个模块,另外还使用到了LDAP完成用户登陆,Eclipse工程目前只是用于远程调试和编译,最主要是写代码,完全失去了IDE最重要的功能。(这个是目前的理解,不排除遗漏的东西以及误解)

如果发现问题或者要修改Bug,抱歉,不能Hot Deploy,必须修改代码后使用Ant编译并发布好,然后重启Jboss,Ant一般情况下至少需要5分钟,即使是修改一个properties也要2分钟才能跑完,然后重启Jboss需要8分钟(我的是新安装的机器,比较快,其他的人的需要10分钟左右),天啊,开发效率怎么可能高啊!
不过这也正好给我一个机会,上一家公司的情况也是类似,大家修改什么也是先Ant再重启Jboss,一般也至少要10分钟,后来我就在Eclipse下配置了可以Hot Deploy的工程,如果只是修改代码内容,不新增EJB类或者方法就不用Ant编译了,修改了代码保存下就更新了,开发速度提高很多,我这个月的任务就是在这个公司也把这个工程搞出来,这样弄完以后对项目的熟悉程度也会上一个台阶。

删除指定时间之前的文件

我们的自动测试会生成报告,原来的实现比较简单,就是删除32天前的那个目录,问题是可能某些天的build会失败,那么task不会被调用,这样可能保存的历史记录大于31了,偏离我们的目的了。查看了下ant的手册,发现有一个selector可以用,得到如下的内容:
    <target name="backup-report">
        <tstamp>
            <format locale="en" property="deletedDir" pattern="MM/dd/yyyy hh:mm aa" offset="-32" />
          </tstamp>
        <tstamp>
            <format property="thisDir" pattern="yyyy-MM-dd" />
          </tstamp>
        <mkdir dir="${reports-dir}/${thisDir}"/>
        <copy todir="${reports-dir}/${thisDir}">
            <fileset dir="${report-dir}">  
                <include name="**/*"/>
            </fileset>             
        </copy>       
        <delete>
            <fileset dir="${reports-dir}" includes="*">
                <date datetime="${deletedDir}" when="before"/>
            </fileset>
        </delete>
    </target>

问题是这个似乎不能删除目录,只有1.6.2以后才支持删除目录。
最终一个简单的方法就是在最开始就删除32天前的目录,这样就不会有太老的记录保留下来了。

Ant+JUnit+Cobertura

看标题就知道,这个是开发一个Java应用的利器组合,使用Ant完成工程的构建(Build),使用JUnit完成单元测试,使用Cobertura完成代码覆盖测试,也可以辅助查找性能瓶颈一些类型的BUG,下面是一个完整的build.xml范例,可以完全拿来用,不需任何修改,只要你的目录和这里的目录一致(应该也是很通用的):

下载下面的build.xml文件

文件内容:
阅读全文

© 2024 解惑

本主题由Anders Noren提供向上 ↑