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

来源:百度文库 编辑:神马文学网 时间:2024/04/28 03:30:09
     注意:以下内容基于 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”。可以看到里面有view plaincopy to clipboardprint?
01.catalina.policy  
02.catalina.properties  
03.context.xml  
04.server.xml  
05.tomcat-users.xml  
06.web.xml 
    catalina.policy
    catalina.properties
    context.xml
    server.xml
    tomcat-users.xml
    web.xml             看到这些,想到了”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记录,我的是“”,然后大家肯定会去看虚拟目录下【conf】目录中的【server.xml】,我的为“”,分析的结果是相对路径变成了绝对路径。大家根据这一现象,可以后自己设置Tomcat的server.xml文件。      个人感觉是Application的Start是Eclipse联合了Tomcat下的部分“系统文件”和这个虚拟目录,而Application的 运行是由虚拟目录下的【conf】配置文件在支撑着。这个感觉未经求证。待闲时再做深入分析。附流程图总结:  本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jacarri/archive/2010/12/07/6061257.aspx