浅谈使用Eclipse和Tomcat开发项目过程中的文件操作

            注意:以下内容基于 Eclipse Galileo J2EE版和apache-tomcat-6.0.26.tar.gz。

 

            首先说明一下,Eclipse工作空间路径:D:/portal2_project/;项目源码路径:D:/portal2_project/ssh;解压apache-tomcat-6.0.26.tar.gz到C:/tomcat6。

 

 

一、分析Eclipse关联Tomcat时的文件操作

 

            在控制台show出“Servers”选项卡后,new一个Server。Eclipse会在当前工作空间新建一个“Servers”,我的是【Tomcat v6.0 Server at localhost】,自然Package Explorer也会有Servers这个目录显示。同时这个目录会有类似用刚才new server时用的名字,我的为【Tomcat v6.0 Server at localhost-config】。

 

            下面开始分析“D:/portal2_project/Servers”这个【Tomcat v6.0 Server at localhost-config】目录,对应Eclipse就是“Servers”下的“Tomcat v6.0 Server at localhost-config”。可以看到里面有

 

            看到这些,想到了”C:/tomcat6/conf“目录。确实,经过粗略的分析,Eclipse把除了logging.properties文件和Catalina目录没有复制过来,其余的6个文件都复制过来了。这个大家可以自己验证:在六个文件中放入E文字符或者数字当做标记。关于这个先谈到这里。下面回到Eclipse和我们新建工程上来。

 

 

二、字节码文件的生成和相关拷贝

 

            新建项目时,Eclipse会在当前工作空间下新建一个与你项目名相同的目录,比如我的【ssh】,这个大家都知道,就不多说了。要说的是里面的【build】的【class】目录。当大家在Eclipse面板选中你的项目,然后Project——Build Project,此时,Eclipse会编译你项目的java文件,得到的class文件就是放在里面的。大家可以证明的:写一个打印语句的main方法,编译后运行成功一次,然后删掉对应该目录下的class文件再运行一次,Consol就会显示“java.lang.NoClassDefFoundError: com/cmcc/dao/hibernate/Test”,还可以将[String path = Test.class.getResource("").getPath()] 打印出来,我得到的结果是“/D:/portal2_project/ssh/build/classes/com/cmcc/dao/hibernate/”。此过程就是希望大家明白在Eclipse里面运行web项目中一个类的main方法时,该类的class文件也就是字节码文件在什么地方。

 

             刚才谈到了Eclipse将源码java文件编译后得到class文件,而这个只是“RUN AS   Java Application”时所用的class文件,哪Tomcat所用的class文件在什么地方呢?下面来跟大家一起找出来。

  在当前工作空间下(我的是D:/portal2_project/)搜一我刚才写的Test这段测试小代码文件,大家很快发现在“D:/portal2_project/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/ssh/WEB-INF/classes/com/cmcc/dao/hibernate”有它的存在,把这个路径截断来看,前一段“D:/portal2_project/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps”可以粗略认作为是当前工作空间下的某个临时目录。后面的“ssh/WEB-INF/classes/com/cmcc/dao/hibernate”则是与我项目源码对应的路径。所以我在这认为当前工作空间下的“.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps”就是Tomcat所使用的虚拟目录了。请注意这段路径中的“tmp0”,这个不是唯一的,你的可能是“tmp1”或“tmp2”。

请大家保证自己的代码在Eclipse启动的Tomcat中能正常运行后再分析这个虚拟目录下的文件。

 

             下面是我分析的结果:Eclipse把项目中的WebContent下面的文件原封不动的拷贝到了虚拟目录中对应项目目录下。然后会把刚才谈到的【Build】下的【class】目录全部拷贝到【WEB-INF】下。在拷贝字节码这一过程中Eclipse会根据源码校验字节码文件或其他文件的数量上的一致性。证明过程如下:把【Build】目录删掉,然后尝试将项目publish到虚拟目录,我得到了“Publishing failed with multiple errors   File not found: D:/portal2_project/ssh/build/classes/com/cmcc/dao/hibernate/userinfo/service/IUserInfoHiberanteService.class.”

 

 

 

 

三、应用没有使用更新后代码的问题分析及解决方案

 

            刚才说到了数量上的一致性,为什么这样说呢?这个问题暂不谈,提另外一个开发中常见到的问题:为什么我更改代码后,跑application时还报一样的错?为什么用注解时有时候会报404(如果不知道404是什么,请补一下J2EE基础吧)?

 

             为了回答这个问题,那就把刚才谈的一些内容梳理一下:Eclipse一般会自动的把java源代码文件编译成class目标文件放在【Build】目录下的【class】中,然后当我们当我们发布项目到虚拟目录时会把【Build】目录中【class】Publish过去,而这个Publish只做了数量一致性校验。刚才说到“Eclipse一般会自动的把java源代码文件……”,请注意“一般”。既然有“一般”,那也应该有“特殊”。现实中确实有,当你的项目,不仅仅是当前项目,包括其他当前打开的项目中存在错误的话,这个编译就失败了。那【Build】下就不会有更新后的class文件了,而刚才谈到Publish时只做数量一致性校验,我没有对项目文件数量更改,所以Publish或clean只是把旧字节码文件复制过去了。既然虚拟目录中的文件没有变,那还报一样的错也就在清理之中了。

               碰见这样的情况(改代码还报一样的错)我是这样做的:show出“Problems”选项卡,把非当前项目全部close掉。然后右键当前项目Validate或Build一次。errors和warings情况会在“Problems”中出现。根据这个情况去fix项目后Eclipse就可以编译java文件了。

 

 

四、虚拟目录的使用和Application的Start

 

           当我们把自己的项目添加到新建的【Tomcat v6.0 Server at localhost】时。Eclipse会在上面一中谈到的【Tomcat v6.0 Server at localhost-config】下的【server.xml】文件中新增一条Context记录,我的是“<Context docBase="ssh" path="/ssh" reloadable="true" source="org.eclipse.jst.jee.server:ssh"/>”,然后大家肯定会去看虚拟目录下【conf】目录中的【server.xml】,我的为“<Context docBase="D:/portal2_project/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/ssh" path="/ssh" reloadable="true" source="org.eclipse.jst.jee.server:ssh"/>”,分析的结果是相对路径变成了绝对路径。大家根据这一现象,可以后自己设置Tomcat的server.xml文件。

 

      个人感觉是Application的Start是Eclipse联合了Tomcat下的部分“系统文件”和这个虚拟目录,而Application的 运行是由虚拟目录下的【conf】配置文件在支撑着。这个感觉未经求证。待闲时再做深入分析。

 

 

附流程图总结:

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值