首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >找不到javax.sql.DataSource类的Tomcat9抱怨类

找不到javax.sql.DataSource类的Tomcat9抱怨类
EN

Stack Overflow用户
提问于 2020-07-22 22:03:30
回答 4查看 1.6K关注 0票数 3

在基于Linux的虚拟机上运行的Tomcat9,当Jdk11编译的war文件部署在tomcat中时,启动时会出现以下错误。在启动tomcat时,发生以下错误。如何解决此类找不到异常。是否要显式添加特定的模块java.sql?

代码语言:javascript
复制
Jul 22, 2020 1:49:45 AM org.apache.catalina.startup.Catalina start
SEVERE: The required Server component failed to start so Tomcat is unable to start.
org.apache.catalina.LifecycleException: Failed to start component [StandardServer[43004]]
    at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:440)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:633)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:343)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:474)
Caused by: java.lang.NoClassDefFoundError: javax/sql/DataSource
    at java.base/java.lang.ClassLoader.findBootstrapClass(Native Method)
    at java.base/java.lang.ClassLoader.findBootstrapClassOrNull(ClassLoader.java:1258)
    at java.base/java.lang.System$2.findBootstrapClassOrNull(System.java:2131)
    at java.base/jdk.internal.loader.ClassLoaders$BootClassLoader.loadClassOrNull(ClassLoaders.java:118)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:616)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:640)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:616)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:579)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:576)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)

我尝试在tomcat启动脚本中添加'--add-modules java.sql‘。但仍然没有区别。还有一件奇怪的事情是,当添加'-verbose: module‘选项时,它会清楚地显示模块java.sql已加载,但仍然以NoClassDefFoundError: javax/sql/DataSource结束。

代码语言:javascript
复制
find /usr/lib/jvm/adoptopenjdk-11-hotspot -name java.sql.jmod -exec jar tf '{}' \; | grep DataSource
classes/javax/sql/XADataSource.class
classes/javax/sql/ConnectionPoolDataSource.class
classes/javax/sql/DataSource.class
classes/javax/sql/CommonDataSource.class

java版本:

代码语言:javascript
复制
$ java -version
openjdk version "11.0.7" 2020-04-14
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.7+10)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.7+10, mixed mode)

我们在server.xml中有以下代码块

代码语言:javascript
复制
<Resource
    name="jdbc/ILOraclePool"
    auth="Container"
    factory="com.xyz.tomcat.ucp.UcpDataSourceFactory" (this class extends oracle.ucp.jdbc.PoolDataSourceImpl)
    type="oracle.ucp.jdbc.PoolDataSource"
    description="main DB"
    connectionFactoryClassName="oracle.jdbc.pool.OracleDataSource"
    ....
/>
EN

回答 4

Stack Overflow用户

发布于 2020-08-01 13:22:42

我认为tomcat正在使用其他的JVM。看看这个。

打开tomcat9/bin目录中的catalina.sh并导出JAVA_HOME。

代码语言:javascript
复制
export JAVA_HOME=/usr/lib/jvm/adoptopenjdk-11-hotspot
票数 2
EN

Stack Overflow用户

发布于 2020-08-01 13:35:12

对于应用服务器中的托管资源,最好复制相关的库(例如,JDBC驱动程序)复制到应用程序服务器特定的libs文件夹(例如,Tomcat的catalina/lib、Glassfish的域/yourdomain/lib等),并在服务器配置文件中将其注册为主机/域范围或全局注册。

据我所知,一些JDBC驱动程序在打包到部署到Tomcat中的可部署war中时无法工作。在使用Glassfish、Wildfly等时,我总是使用服务器工具(UI、CLI、Maven plugin等)。在服务器配置中注册JDBC/Datasource相关资源。

更新:我在Spring Boot中创建了一个新的存储库来演示这种用法,请查看here

这两项测试都包括对Java11、OracleXE18.4.0、JNDI DataSource的IT测试。

代码语言:javascript
复制
mvn verify -Pit
票数 2
EN

Stack Overflow用户

发布于 2020-08-02 23:22:34

首先,确保来自相同版本(例如12.2版)的Oracle JDBC jar ojdbc8.jarucp.jarons.jar存在于$CATALINA_HOME/lib中。确保所有三个jar文件来自相同的数据库版本。不要混合这些jars的版本。始终尝试使用最新的JDBC驱动程序和UCP,以便利用最新的功能和性能改进。

另外,我建议您将工厂类更改为oracle.ucp.jdbc.PoolDataSourceImpl

希望这能解决这个问题。如果没有帮助,请在web.xml中发布JNDI查找代码和DataSource配置。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63036098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档