servlets和classpath

时间:2010-10-05 00:39:10

标签: java tomcat servlets

我为这个糟糕的主题道歉。

我上周开始在一家新公司工作,并立即被扔进狮子窝。我们有一个即将投入生产的应用程序...我的一个人已经运行了应用程序和QA'ed所以我没有深入研究他正在做什么的细节。

我们有这个:

../legacy/ROOT/
..............index.jsp
..............WEB-INF/
.....................lib/
.........................(libs)
.....................classes/
............................x.class

conf / server.xml中有一个虚拟主机,它将根定义为ROOT。

新应用程序似乎已经开始作为旧应用程序的复制/粘贴。它在server.xml中没有条目。可以说,即使它是完全独立的,它也会依赖于遗留应用程序。新应用程序植根于legacy / ROOT / NewApp:

../legacy/ROOT/
..............index.jsp
..............WEB-INF/
.....................lib/
........................(libs)
.....................classes/
............................x.class
..............NewApp/
....................index.jsp
....................WEB-INF/
...........................lib/
..............................(libs)
...........................classes/
..................................x.class

要访问旧版应用,请浏览http://theUrl。要访问NewApp,请浏览到http://theUrl/NewApp。一切正常。也许

我们在星期六晚上安装了新的应用程序。星期一早上,我们发现虽然NewApp运行良好,但我们的用户无法登录旧网站。他们收到应用程序生成的“错误用户名”错误。

我不知道为什么NewApp可以工作。我没有更改web.xml。所以我猜测Tomcat通过查看HOST定义找到它喜欢的URL,然后在URL中看到/ NewApp并且很高兴遍历到它找到index.jsp的legacy / ROOT / NewApp子目录,我们就是参加比赛。

现在我很困惑。遗留代码具有WEB-INF文件夹,并且还存在NewApp / WEB-INF。我不知道Tomcat为什么要用NewApp / WEB-INF做任何事情。然而,这是因为NewApp运行良好。更糟糕的是,两个应用程序中的libs和类文件在名称和内容上几乎完全相同。 NewApp中的x.class文件与旧版本中的x.class文件略有不同 - NewApp有一个新的登录方法。 NewApp的x.class仍然有旧的登录方法,但是,NewApp中没有任何东西使用它。

我正在尝试确定遗产的失败与我们的部署有何关系。它一定是 - 但很难看出如何。我们检查了文件日期。遗产中的任何内容都没有改变。我认为这是一个类路径问题。

那么,我这里有一个应用程序,还是两个?我以为是后者。但我不太确定。我很困惑,甚至不能问一个好问题: - /

唯一的另一个奇怪之处是Tomcat没有爆炸WAR文件,尽管配置看起来应该有。我们必须手工完成 - 而且它有效。


当您的首席开发人员说“3个月”并且管理层说“不,1个月”时,会发生这种情况。这是它的功能所在。

2 个答案:

答案 0 :(得分:1)

哇!绝对是一个面对你的时刻。 : - (

这是我对它的理解,当然我可能是非常错误的:在运行时Tomcat并不一定关心文件系统上与应用程序root相同的级别,只要它找到它认为的是什么根目录中的有效WAR。而且,在查看是否是webapp中的文件夹之前,Tomcat会检查URL中的给定文件夹结构是否与webapp匹配是有意义的。这样可以解释“新”应用程序。

对于原始应用程序,如果它根本没有引用“NewApp”文件夹,那么Tomcat就没有理由在那里查看,如果确实如此,它将忽略它看起来像webapp的事实。它只是另一个文件夹。 我怀疑你可以通过手工构建一个URL来直接访问那里的任何文件。便利。 :-p (编辑:可能不会,再考虑一下,Tomcat可能只会采用任何'NewApp'引用来表示新应用,而不是旧应用中的文件。)

所以......你有两个webapps。我认为 Tomcat会将它们分开。但是......它会让我觉得我在生产中有类似的东西......

答案 1 :(得分:1)

我赞同罗德尼所说的话。 Tomcat查找WAR文件并将它们视为单独的webapp(我认为......)。在你的情况下,正如罗德尼所说,从Tomcat的角度来看,你所拥有的只是一个webapp,它恰好有一个包含一些类文件的文件夹。

我怀疑正在发生的事情是NewApp与旧版有相同的软件包/类名,因此有人会覆盖另一个(因为Tomcat可能会拿起NewApp WEB-INF文件夹 - 我我不太明白你怎么走。)

这不是您或您的公司想要听到的内容,但它们绝不应该捆绑在一起作为两个单独的应用程序。如果NewApp依赖于Legacy,那么您可以从Legacy获取JAR,并将其作为NewApp的依赖项包含在内。但是,正如你现在所做的那样,它们应该是分开的,我会说Tomcat变得非常困惑。

但也许其他人有办法解决它,因为它现在存在......但我会很生气地说道。

相关问题