有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Tomcat9未找到javax的类。sql。数据源类

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

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)

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

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版本:

$ 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)

我们在服务器中有以下块。xml

<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"
    ....
/>

共 (4) 个答案

  1. # 1 楼答案

    我认为tomcat正在使用其他JVM。检查一下

    打开卡塔琳娜。sh出现在tomcat9/bin目录中,并将JAVA_导出到主页

    export JAVA_HOME=/usr/lib/jvm/adoptopenjdk-11-hotspot
    
  2. # 2 楼答案

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

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

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

  3. # 3 楼答案

    你有没有试过把它移到上下文中去。xml?查看Tomcat_Servlet代码示例

  4. # 4 楼答案

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

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

    更新:我创建了一个新的repo来演示Spring Boot中的这种用法,请检查here

    两者都包括对Java11、OracleXE18.4.0和JNDI数据源的IT测试

    mvn verify -Pit