我有一个奇怪的问题,其中两个带有Oracle JDBC驱动程序的Web应用程序会相互冲突.我必须将JDBC驱动程序JAR放在公共文件夹TOMCAT_HOME/lib中.这是什么原因?
我对tomcat中类加载的发生方式感到困惑.如果我的问题听起来很愚蠢,请耐心等待.
我们在单个tomcat服务器上部署多个spring webapps.为了减少内存占用,我们考虑在tomcat lib文件夹中安装spring,hibernate和数据库驱动程序jar,以便所有webapp共享.
我首先将spring依赖关系标记为,provided然后将这些jar复制到tomcat lib.但是,在服务器启动时,我开始越来越多ClassNotFoundErrors,像commons-logging,commons-fileupload,jackson,所以我必须将这些罐子以及到Tomcat的lib.
但后来开始感觉很可疑.如果将来我在项目中添加另一个spring依赖项,比如spring-data-cassandra.我是否还需要移动它的依赖罐子?这可能是无止境的.另外,我可能会在运行时遇到CNF错误.
我试图按照这个链接,将spring-context和spring-web带回应用程序之战.但它没有用,在WebApplicationIntializer初始化期间在某些类上得到了ClassNotFound .我试图理解在tomcat中加载的类的顺序,但是不太了解.
然后我找到了一个完全不同的JDBC驱动程序加载解释,这与所有其他解释相矛盾,让我完全糊涂了.
在我阅读更多内容时,我认为将弹簧罐移动到tomcat lib并不是一种正确的方法,但仍然没有一个好的推理.然后为什么JDBC驱动程序有效?有人可以解释一下吗?每个webapp的classloader也会创建每个类的副本吗?
编辑1:我开始知道optional春季罐子中有很少的依赖项,如果在我的webapp中使用它将是必需的.所以spring-web依赖于jackson库,但对于我的应用程序是可选的.因此,我需要找出我的项目所需的所有罐子,并且春天也需要这些罐子,这些罐子需要移动到tomcat lib.
我即将在单个Tomcat服务器上部署多个grails应用程序,我有以下疑问:
谢谢
我需要对Web服务器执行所有收到请求的预处理和后处理.该功能既是网址级访问限制又是语言翻译,还包括需要全局处理的其他特殊情况.
通常,这可以通过servlet过滤器实现,但是当Web应用程序数量增长时,不希望将过滤器与每个应用程序捆绑在一起,因为在更改过滤器时需要重建和重新部署所有应用程序.
相反,我想在服务器上全局安装过滤器,我找到了两种可能的解决方案,我对它们中的任何一种都不满意.
在Tomcat上,可以在"lib"目录中部署服务器范围的过滤器,并配置服务器web.xml以将它们映射到传入请求.我看到的问题是任何过滤依赖性也需要在lib目录中全局部署.据我所知,这可能导致很难解决与已安装应用程序的依赖冲突.(如果Tomcat位于两个Web应用程序中,它们是否会将相同的库文件加载到内存中两次?)
在主要充当代理的简单Web应用程序中部署过滤器至少会将过滤器与其相应的依赖项捆绑在一起.然后,可以在服务器上部署此应用程序,并使用crossContext配置参数将所有传入请求转发到目标应用程序之前.(Tomcat实例之间的RequestDispatcher转发)但是,这需要摆弄url,以便所有链接指向"代理".
这些解决方案似乎都不令人满意.它们都依赖于平台,因为它们依赖于Tomcat.他们似乎都有可能的问题,需要特殊的依赖处理.
使用服务器范围的功能时最佳做法是什么?
我正在尝试恢复我们的tomcat服务器,但是这个应用程序没有正确连接到MySQL.
这是发生了什么:
我有一个Java + Flex应用程序.整个应用程序放在一个目录(不是.war文件)中.
$TOMCAT_WEBAPP/myflex_app/WEB-INF/lib/ -> JDBC mysql driver goes here.
Run Code Online (Sandbox Code Playgroud)
这是我的应用程序配置:
<database>
<rpgByMoodle user="moodle" password="moodle">
<url>jdbc:mysql://localhost:3306/rpgbymoodle</url>
</rpgByMoodle>
<moodle user="moodle" password="moodle">
<url>jdbc:mysql://localhost:3306/moodle</url>
</moodle>
</database>
Run Code Online (Sandbox Code Playgroud)
所以,我能够通过命令行客户端连接mysql,但应用程序没有.
我发现在互联网上人们告诉使用一些Netbeans(或Eclipse)菜单"添加新连接"..但是,我无法访问应用程序的源代码.
我在Linux上运行tomcat.我已经检查了tomcat日志文件,但/var/log/tomcat6/没有发现jdbc.
我的卡塔琳娜日志:
Aug 4, 2011 9:24:25 AM org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/6.0.20
Aug 4, 2011 9:24:26 AM org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-8080
Aug 4, 2011 9:24:26 AM org.apache.catalina.startup.Catalina start
INFO: Server startup in 977 ms
Run Code Online (Sandbox Code Playgroud) 问题
无论何时我通过Eclipse启动我的Tomcat服务器,总是会遇到Class not found错误:
SEVERE: Exception processing Global JNDI Resources
javax.naming.NamingException: Class not found: oracle.jdbc.xa.client.OracleXADataSource
at org.apache.naming.factory.BeanFactory.getObjectInstance(BeanFactory.java:136)
Run Code Online (Sandbox Code Playgroud)
安装程序
我的server.xml文件有一个资源设置,如:
<GlobalNamingResources>
<Resource name="sub1" auth="Container"
type="oracle.jdbc.xa.client.OracleXADataSource"
factory="org.apache.naming.factory.BeanFactory"
user="****" password="*****"
URL="**************************************" />
</GlobalNamingResources>
Run Code Online (Sandbox Code Playgroud)
context.xml有一个如下所示的条目:
<ResourceLink name="dataSource/sub1" global="sub1" type="javax.sql.DataSource" />
Run Code Online (Sandbox Code Playgroud)
在我的应用程序中,我使用的是Oracle的JDBC驱动程序 - classes12.jar
问题
我需要在Tomcat服务器上修复什么才能找到合适的类 - oracle.jdbc.xa.client.OracleXADataSource.我的第一个猜测是需要将classes12.jar复制到服务器上的某个文件夹中.我甚至不完全确定Windows for Eclipse上的文件夹...任何帮助将不胜感激.
谢谢!