3

Tomcat9 在基于 Linux 的 VM 上运行,启动时出现以下错误,当 Jdk11 编译的 war 文件部署在 tomcat 中时。在启动 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)

我尝试在 tomcat 启动脚本中添加“--add-modules java.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 -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 中有以下块

<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

4 回答 4

2

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

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

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

两者都包括对 Java 11、Oracle XE 18.4.0、JNDI DataSource 的 IT 测试。

mvn verify -Pit
于 2020-08-01T05:35:11.607 回答
2

我认为tomcat正在使用其他一些JVM。检查那个。

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

export JAVA_HOME=/usr/lib/jvm/adoptopenjdk-11-hotspot
于 2020-08-01T05:22:41.627 回答
2

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

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

希望这应该可以解决问题。如果没有帮助,请将 JNDI 查找代码和 DataSource 配置发布到web.xml.

于 2020-08-02T15:22:33.893 回答
0

您是否尝试过将其移至 context.xml ?查看Tomcat_Servlet代码示例。

于 2020-08-07T18:00:27.623 回答