概述
最近项目测试的时候,发现一个问题,用ant将几个项目发布,则一切正常。但我使用Eclipse发布后,程序在某处时间显示有问题。排查到最后,终于发现,原来是jar包的问题。使用ant发布的时候,两个插件包中的jar包,新jar包覆盖掉了旧jar包。但我用Eclipse发布的时候,只是简单的将项目加到了发布路径下,却没注意插件包发布的顺序,因此旧的jar包覆盖掉了新的jar包,所以导致显示一直有问题。
这两天抽空研究了一下Eclipse的web项目发布。
网上搜了好久,可并没有找到太多了关于Eclipse对于web项目发布顺序的文章。自己只能一遍遍的动手测试。
Eclipse版本是luna4.4.1
总结出来的结论是:
众所周知,Eclipse在发布web项目的时候,其实是读取org.eclipse.wst.common.component 这个配置文件的wb-module节点,然后依次部署。
但他部署时有一定顺序的,优先部署wb-module 节点中的wb-resource(即当前项目的资源文件,使用Eclipse的folder linked到的硬盘的资源,也放在该节点下,当做当前项目的资源)节点,然后再行部署dependent-module(即对应的插件包)节点下的内容。
猜测一:在部署当前项目的资源的时候,据我的测试,Eclipse先是自上而下扫描wb-resource节点,分别取出其中的“deploy-path” 属性(即发布的最终位置),具有相同“deploy-path”属性的节点归为一组,然后依次读取这些节点中的“source-path”属性(即原始文件位置),然后将这些属性值一一取出,然后压入一个类似“栈”的集合(先进后出)。解析完成后,当前发布的概况变为:org.eclipse.wst.common.component 这个配置文件中的 “wb-module” 节点中所有“deploy-path”相同的节点被一一准备好,这些节点在配置文件中的顺序是自上而下的,但是由于被放入了 “栈” 则当Eclipse执行部署的时候,具有相同 “deploy-path” 属性的节点对应的资源文件被从栈中取出,自下而上的扫描,然后发布到tomcat的发布路径下。
猜测二:部署完 wb-resource 节点后,Eclipse再去扫描 dependent-module 节点,这些节点对应的是一个个的插件包项目,这些插件包项目最终被打为jar包发布到tomcat的路径之下,而这些项目中所使用到的jar包也将一并被发布到tomcat的WEB-INF/lib 下。 此时,可这样理解:dependent-module节点也被压入一个集合,不过这个集合类似于“队列”(先进先出)。dependent-module 节点全部扫描完成后,Eclipse再去解析这个队列,然后从中取出每个插件包对应的第三方jar包, 放入到tomcat的发布目录下。这时候, org.eclipse.wst.common.component这个配置文件中的dependent-module 就会被按照文件中的顺序自上而下被发布了,即下面的节点对应的jar包将覆盖上面节点对应的jar包了。
理论如上,需要有项目测试一下。
新建五个项目。分别是:一个web项目。四个普通java项目。这四个普通java项目中,两个是需要link到web项目的,另外两个用作插件包使用。
先测试猜测一的想法。
新建三个项目,一个web项目:test。两个普通java项目:lib_plug和lib_plug1。
在这两个java项目中,分别新建文件夹 jsp和WEB-INF/lib ,在这两个文件夹下,放置test.txt和sqljdbc4.jar包,但是对应的内容不同。
lib_plug的test.txt的内容是lib。sqljdbc4.jar里面,新建一个文件夹,名称为:libfrom
lib_plug1的test.txt的内容是lib1。sqljdbc4.jar里面,新建一个文件夹,名称为:lib1from
然后将两个java项目link到这个web项目。
然后设置test项目,使之发布另外两个java项目。
完成后结果如下:
我一般是先在这里add好,然后再去配置文件修改其对应顺序。这里的显示只是按照字母顺序排列的,和配置文件里面的顺序毫无关联。配置文件的顺序和add的相关顺序有关。
然后修改配置文件。
按照猜测一的说法,最终发布的结果应该是,test项目下,有个名为“jsp”的文件夹,里面应该有一个test.txt,这里面应该是 /lib_plug1/jsp的内容,即lib1,同时WEB-INF下面应该有一个lib的文件夹,里面只有一个sqljdbc4.jar的jar包,里面对应的文件夹应该是 lib1from
执行clean。结果如下:
正确。
然后将配置文件中,上下的节点交换位置:即变成如下样式:
推理结果应为: test.txt文件内容为lib,jar包对应的应该是libfrom
执行clean。检查,结果如下:
结果如预期。
验证第二个猜测:
在之前的基础上,在新建两个普通java项目:test_plug和test_plug1
这两个项目分别引入一个第三方jar包,即sqljdbc4.jar,内部分别建一个文件夹。 取名为:plugfrom 和plug1from
然后将这两个项目,当做test这个web项目的插件包发过去。最终配置为:
从这幅图可以清晰的看到,两个项目所引用的第三方jar包,其实最终是被发送到tomcat对应项目的WEB-INF/lib下面的。
配置文件最终如图:
首先验证猜测二,为了不和猜测一产生异议,我先将web-resource这个节点的配置到/WEB-INF的这段删掉。这样的话,发布目录的lib下的jar包,一定是我这两个插件项目的jar的某一个。于是:配置文件变成:
预期结果应是,/jsp文件夹下,的test.txt的内容应该是lib ,而lib下的sqljdbc4.jar的文件夹的名字应该是plug1from
clean, 查看:
验证无误。
将两个节点的顺序交换,配置文件变为:
预期结果应该是,/jsp下的test.txt为lib ,lib下的sqljdbc4.jar 的文件夹应是plugfrom
clean 查看。
至此,猜测二也验证完毕。
再去验证,dependent-module 的发布顺序在wb-resource 之后。
修改配置文件,如下:
如猜测属实,则最终在lib下的jar包应该是test_plug1的jar包,即其文件夹应该是:plug1from
clean 查看:
结果如预期。
最后
以上就是聪慧钢笔为你收集整理的Eclipse发布web项目的顺序问题的全部内容,希望文章能够帮你解决Eclipse发布web项目的顺序问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复