Jbulder2005太“智能”,导致Class.fromName()出错

2 篇文章 0 订阅

Jbulder2005太“智能”,导致Class.fromName()出错

 

用不熟悉的语言和开发工具做开发,会遇到很多意思不到的难题。

虽然以前对javaJSP有所了解,但一直没有深入去学习。这次因为项目的需要,不得不从.net转到java行列上来。从过了元旦接到任务开始,就闭门苦读J2EE的书和资料,过了年一开就项目就正式开始了。

从这2个多月对java平台的了解来看,java平台在易操作性方面跟.net平台还是有几个量级的差别。

以前用javaBean都是直接在jsp文件中这样调用
<jsp:useBean id="xx" scope="application" class="web.testBean"></jsp:useBean>
或是显式的声明一个testBean对象
web.testBean test = new web.testBean();
这样使用是没什么问题的。

昨晚看到一篇Command模式的贴(http://www.cnjbb.org/thread.jsp?boardid=3&threadid=43224&pageno=last),想尝试一下,问题就出现了:老是抛出ClassNotFoundException异常!贴出Servlet的主要代码

    String className = request.getParameter("className");

    if (className == null)

    {

      throw new ServletException("No 'className' parameter![?className=]");

    }

    Class c = null;

    try

    {

      c = Class.forName(className);

      web.Controller.IController ctl = (IController) c.newInstance();

      ctl.execute(request, response);

    }

    catch (ClassNotFoundException ex)

    {

      request.setAttribute(appConfig.ControllerExecuteError,

                           "ClassNotFoundException:"+className);

    }

    catch (IllegalAccessException ex)

    {

      request.setAttribute(appConfig.ControllerExecuteError,

                           "IllegalAccessException");

    }

    catch (InstantiationException ex)

    {

      request.setAttribute(appConfig.ControllerExecuteError,

                           "IllegalAccessException");

    }

开始以为是packe或类名写错,在确认过NclassName没错后问题还是不能解决。

突然想到去看一下WEB-INF/classes目录,发现问题了!

WEB-INF/classes/web/Controller目录下没有login.class。我代码包如下图

WEB-INF/classes/web/Controller目录下却找不到login.class,项目的src目录下的确有login.java,在项目的class目录下也找到到了login.class,但为什么在发布目录中去没有login.class呢?这个文件跑哪儿去了?

googlebaidu搜索了很久也没有找到答案。

问了周围几个用java的朋友也说没见过这种问题,他们用的是jBuilderX,我还以为是jBuilder2005BUG。拿到另一台机上用jBbuilderX来编译也不行!

难道真的要我每次rebuild之后手动把class目录下的.class文件拷贝到WEB-INF/classes目录中?!

翻遍了jBilder的所有配置,终于找到了答案。右键点web->Properties

web模块的属性中content的选项,borland对这页配置的作用这样说的

The Content page of the Module Properties dialog box is where you choose which packages, classes, and resources to include in the archive file. You can accept the default which includes everything in the project, or you can choose specific packages, classes, files, and resources. You can also create custom filters that include or exclude specific items.

在这页里可以配置哪些文件包含在发布包(.war)里。这里有几个先项

Include All Classes And Resources

All classes and resources are included in the archive.

Include Specified Filtered Files And Their Dependencies

Only the files you specify using the Required Filters and Files list box and the Only Include Module Specific Java Classes option, and the dependencies of those files, are included in the archive.

Include Specified Filters And Files Only

Only the filters and files you specify using the Required Filters and Files list and the Only Include Module Specific Java Classes option are included in the archive

可以选择第一个Include All Classes And Resources或是选第二个Include Specified Filtered Files And Their Dependencies然后再Add files,加入你需要的文件就OK了。

有一点不知道为什么如果是<jsp:usebean/>的话就会自动把相应的.class拷贝到WEB-INF/classes目录下,但如果在所有的.jsp.java文件中都没有显式使用过某个类的话就不会拷贝过去。如果我刚才说的login是实现了Icontroller接口,而在代码中只有这样使用

      c = Class.forName(className);

      web.Controller.IController ctl = (IController) c.newInstance();

      ctl.execute(request, response);

JB就认为我没有使用过login这个类,就“智能”把这个类从war文件中排除掉了。就是这个“智能”把这给害惨了。

战斗才刚刚开始,不知做到后面还会有什么大麻烦。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值