Java Tomcat中的公共JNDI资源

Java Tomcat中的公共JNDI资源,java,tomcat,resources,jndi,Java,Tomcat,Resources,Jndi,我正在Tomcat(5.5)中运行几个servlet应用程序。所有servlet都使用一个公共工厂资源,该资源使用JNDI共享。目前,我可以通过在/conf/server.xml文件中包含工厂资源作为GlobalNamingResource,然后让每个servlet的META-INF/context.xml文件包含一个指向该资源的ResourceLink,使一切正常工作。下面包含XML文件中的代码片段。注意:我对tomcat不太熟悉,所以我不是说这是一个好的配置 但是,我现在希望能够使用RPM将

我正在Tomcat(5.5)中运行几个servlet应用程序。所有servlet都使用一个公共工厂资源,该资源使用JNDI共享。目前,我可以通过在/conf/server.xml文件中包含工厂资源作为GlobalNamingResource,然后让每个servlet的META-INF/context.xml文件包含一个指向该资源的ResourceLink,使一切正常工作。下面包含XML文件中的代码片段。注意:我对tomcat不太熟悉,所以我不是说这是一个好的配置

但是,我现在希望能够使用RPM将这些servlet自动安装到多个tomcat实例中。RPM将首先将WAR复制到webapps目录,并将工厂的JAR复制到common/lib目录(这很好)。但它还需要确保工厂资源作为所有servlet的资源包含在内

在全球范围内添加资源的最佳方式是什么?我不太喜欢编写一个进入server.xml文件并以这种方式添加资源的脚本。 我是否有办法添加多个server.xml文件,以便编写一个新的server-app.xml文件,并将我的设置连接到server.xml?或者,最好将这个JNDI资源添加到所有servlet中,而不使用server.xml

p、 重新启动服务器不会成为问题,所以我不介意这些更改是否不会自动获取

谢谢

server.xml中的代码段

  <!-- Global JNDI resources -->
  <GlobalNamingResources>

  <Resource name="bean/MyFactory"
                auth="Container"
                type="com.somewhere.Connection"
                factory="com.somewhere.MyFactory"/> 
  </GlobalNamingResources> 

整个servlet的META-INF/context.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <ResourceLink global="bean/MyFactory"
                name="bean/MyFactory"
                type="com.somewhere.MyFactory"/>
  </Context>

这并不能直接回答您的问题,但您是否考虑过将所有配置放在context.xml文件中,而不是server.xml文件中?这使您的web应用程序更加完全独立,这听起来对您的部署需求很重要

我甚至想说,如果目前还不能做到这一点,那么考虑任何必要的重构都是值得的,以确保你的应用程序能够完全独立

我曾经参与过一些项目,在这些项目中我部署了/common/lib jar和公共资源,并以令人困惑和微妙的方式被它们咬了一口(我最终发现这些都是我自己的错,这里不怪Tomcat),现在我倾向于对我的Web应用程序采取一种完全保护性的方法:让它们完全独立


当然,我并不完全了解您的情况,只是一些建议。

自Tomcat 4以来,建议不要将任何JNDI信息放在server.xml文件中。检查:

对于Tomcat5,与Tomcat4.x不同,它是 不建议放置 元素直接存储在server.xml中 文件这是因为它使 修改上下文配置 更具侵入性 无法创建conf/server.xml文件 重新加载而不重新启动Tomcat

我知道您声称不关心这一点,但相信我,您的部署团队会关心这一点,维护团队稍后会感谢您。即使这意味着你最终会感谢自己

如果需要在服务器上的所有webapps之间共享JNDI设置,则应将其放入文件$CATALINA_HOME/conf/context.xml中。很有可能,该位置已经存在context.xml,但您应该能够编写一个简单的应用程序,通过您最喜欢的语言和附带的DOM builder添加资源节点。或者,如果您想继续使用命令行,请签出,它提供了一些XML处理shell脚本来帮助您


祝你好运

这就是我要做的,我使用的是Maven 3,我会将
server.xml
放在我的
resources
目录或其他一些目录中,我可以运行
过滤器
并在执行包时动态替换和生成适当的
server.xml
。然后,您可以使用maven rpm插件并自动生成rpm。

实际上,我们有一种情况,即我们无法在战争中使用(例如)jdbc配置:客户永远不会让我们知道生产服务器的用户名和密码,因此,我们必须在全局服务器配置中定义数据源,并在应用程序的context.xml中添加一个链接,就像op一样。
全局配置可以放在server.xml或tomcat的context.xml中(第二种方法似乎是windows平台上的首选方法)。

您必须将所有应用程序共享的内容放在
server.xml中。
没有其他方法,这就是OP所做的,因为他们提到了
,你必须将所有应用程序共享的东西放在
服务器中。xml
没有其他方法可以做到这一点,这就是OP所做的,因为他们提到了
正确,但是如果你再看一次我的回答,你会发现我建议OP考虑到他/她的部署需求,可能会重新考虑这个对象。我发现共享组件会导致完全独立的应用程序不会遇到的问题。有些东西必须以这种方式在应用程序之间共享,例如,共享嵌入式Derby数据库的唯一方法是将其放入
server.xml
,然后通过
引用
JNDI
。没有其他方法可以做到这一点,也没有其他方法可以重新考虑这些类型的东西,它们只能是每JVM类型资源中的一种?我有一个类似的情况,我正试图解决,但不知道如何解决。例如,是否可以只创建对象的一个实例?看见