繁体   English   中英

java.lang.NoClassDefFoundError:无法初始化 class com.blacklight.common.DBManager

[英]java.lang.NoClassDefFoundError: Could not initialize class com.blacklight.common.DBManager

我正在尝试将我的服务文件连接到云 sql 实例。 但我正在接受 java.lang.NoClassDefFoundError: Could not initialize class com.blacklight.common.DBManager

这是我的 class

package com.blacklight.common;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

@WebListener("Initialize db upon initialization of application context")
public class DBManager implements ServletContextListener {

    private static final Logger LOGGER = LoggerFactory.getLogger(DBManager.class);

    private static final Object dataSourceLock = new Object();
    private static DataSource dataSource = null;

    static {
        dataSource = initDataSource();
    }

    private static DataSource initDataSource() {
        synchronized (dataSourceLock) {
            try  {
                String username = "aaaa";
                String password = "bbbb";

                String driverName = "com.mysql.jdbc.Driver";
                String instance = "project-Id:location:database-name";


                if (dataSource == null) {

                    HikariConfig config = new HikariConfig();
                    config.setUsername(username);
                    config.setPassword(password);

                    config.setJdbcUrl("jdbc:mysql:///Features");
                    config.setUsername(username);
                    config.setPassword(password);

                    config.setDriverClassName(driverName);
                    config.setConnectionInitSql("SET NAMES 'utf8mb4'");
                    config.addDataSourceProperty("socketFactory","com.google.cloud.sql.mysql.SocketFactory");
                    config.addDataSourceProperty("cloudSqlInstance", instance);
                    config.addDataSourceProperty("characterEncoding", "UTF-8");
                    config.addDataSourceProperty("useUnicode", "true");
//                    config.addDataSourceProperty("noAccessToProcedureBodies", "true");

                    config.addDataSourceProperty("useSSL", "true");
                    config.addDataSourceProperty("ipTypes", "PRIVATE,PUBLIC");

                    config.setMaximumPoolSize(50);
                    config.setMinimumIdle(5);
                    config.setConnectionTimeout(10000);
                    config.setIdleTimeout(600000);
                    config.setMaxLifetime(1800000);

                    dataSource = new HikariDataSource(config);
                }
                return dataSource;
            } catch (Exception e) {
                System.out.println("Error");
                LOGGER.error(e.getMessage(), e);
            }
            throw new RuntimeException("Couldn't initialize datasource");
        }
    }

    public static Connection getConnection() throws SQLException {
        if (dataSource == null) {
            dataSource = initDataSource();
        }
        return dataSource.getConnection();
    }

    @Override
    public void contextInitialized(ServletContextEvent event) {
        dataSource = initDataSource();
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        if (dataSource != null) {
            ((HikariDataSource) dataSource).close();
        }
    }

}

我的错误日志是 com.blacklight.common.DBManager initDataSource: Failed to initialize pool: Communications link failure

上一个成功发送到服务器的数据包是 0 毫秒前。 驱动程序尚未从服务器收到任何数据包。 com.zaxxer.hikari.pool.HikariPool$PoolInitializationException:初始化池失败:通信链接失败

上一个成功发送到服务器的数据包是 0 毫秒前。 驱动程序尚未从服务器收到任何数据包。 at com.zaxxer.hikari.pool.HikariPool.throwPoolInitializationException(HikariPool.java:596) at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:582) at com.zaxxer.hikari.pool.HikariPool.( HikariPool.java:115) at com.zaxxer.hikari.HikariDataSource.(HikariDataSource.java:81) at com.blacklight.common.DBManager.initDataSource(DBManager.java:71) at com.blacklight.common.DBManager.(DBManager .java:26) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java. lang.reflect.Constructor.newInstance(Constructor.java:423) 在 org.eclipse.jetty.server.handler.ContextHandler$StaticContext.createInsta nce(ContextHandler.java:2902) at org.eclipse.jetty.servlet.ServletContextHandler$Context.createInstance(ServletContextHandler.java:1299) at org.eclipse.jetty.server.handler.ContextHandler$StaticContext.createListener(ContextHandler.java: 2913) at org.eclipse.jetty.servlet.ListenerHolder.doStart(ListenerHolder.java:94) at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73) at org.eclipse.jetty.servlet .ServletContextHandler.startContext(ServletContextHandler.java:369) at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1449) at com.google.apphosting.runtime.jetty94.AppEngineWebAppContext.startWebapp(AppEngineWebAppContext.java:274 ) 在 org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1414) 在 org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler .java:916) at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:288) at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:524) at com.google.apphosting. runtime.jetty94.AppEngineWebAppContext.doStart(AppEngineWebAppContext.java:218) at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73) at com.google.apphosting.runtime.jetty94.AppVersionHandlerFactory.doCreateHandler( AppVersionHandlerFactory.java:207) at com.google.apphosting.runtime.jetty94.AppVersionHandlerFactory.createHandler(AppVersionHandlerFactory.java:125) at com.google.apphosting.runtime.jetty94.AppVersionHandlerMap.getHandler(AppVersionHandlerMap.java:82) at com .google.apphosting.runtime.jetty94.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:176) 在 8816897000 7088.google.apphosting.runtime.RequestRunner.dispatchServletRequest(RequestRunner.java:264) at com.google.apphosting.runtime.RequestRunner.dispatchRequest(RequestRunner.java:229) at com.google.apphosting.runtime.RequestRunner.run( RequestRunner.java:194) at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:273) at java.lang.Thread.run(Thread.java:750) Caused by: com.mysql.jdbc.exceptions .jdbc4.CommunicationsException:通信链接失败

上一个成功发送到服务器的数据包是 0 毫秒前。 驱动程序尚未从服务器收到任何数据包。 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor .newInstance(Constructor.java:423) at com.mysql.jdbc.Util.handleNewInstance(Util.java:408) at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1117) at com.mysql.jdbc.MysqlIO.(MysqlIO.java :350) at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2416) at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2450) at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.8821 3246945888:2235) at com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:818) at com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:46) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl .newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at com.mysql.jdbc.Util.handleNewInstance( Util.java:408) at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:404) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:307) at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSo urce.java:138) at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:364) at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) at com.zaxxer.hikari .pool.HikariPool.createPoolEntry(HikariPool.java:476) 位于 com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561)... 31 更多 原因:java.net.outConnect(异常:连接超时连接超时) 在 java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 在 java.net.AbstractPlainSocketImpl.socketConnect(Native Method) 在 java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) .AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 在 java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 在 java.net.Socket.connect(Socket.java:607) 在 sun.security.883592873连接(SSLSoc ketImpl.java:293) at sun.security.ssl.BaseSSLSocketImpl.connect(BaseSSLSocketImpl.java:173) at com.google.cloud.sql.core.CoreSocketFactory.createSslSocket(CoreSocketFactory.java:275) at com.google.cloud .sql.core.CoreSocketFactory.connect(CoreSocketFactory.java:229) at com.google.cloud.sql.core.CoreSocketFactory.connect(CoreSocketFactory.java:188) at com.google.cloud.sql.mysql.SocketFactory.connect(SocketFactory .java:41) 在 com.mysql.jdbc.MysqlIO.(MysqlIO.java:300)

这是在您的代码中存在 class 文件时引起的,该文件在编译时存在但在运行时找不到 查找构建时间和运行时类路径中的差异。

这是一个简单的代码来说明您的错误实际上是什么:

NoClassDefFoundErrorDemo.java

public class NoClassDefFoundErrorDemo {
    public static void main(String[] args) {
        try {
            // The following line would throw ExceptionInInitializerError
            SimpleCalculator calculator1 = new SimpleCalculator();
        } catch (Throwable t) {
            System.out.println(t);
        }
        // The following line would cause NoClassDefFoundError
        SimpleCalculator calculator2 = new SimpleCalculator();
    }

}

简单计算器.java

public class SimpleCalculator {
    static int undefined = 1 / 0;
}

所以实际上它是以这种方式发生的:

NoClassDefFoundError

这区分java.lang.ClassNotFoundExceptionjava.lang.NoClassDefFoundError ,其中 ClassNotFoundException 显示 class 在类路径中未找到,这意味着我们正在尝试加载 class 定义; 并且 class 在我们的类路径中不存在。

但是,在您的情况下,当JVM 在其内部 class 定义数据结构中查找 class 的定义时并没有找到它。

这意味着我们之前尝试从类路径加载 class,但由于某种原因失败了- 现在我们再次尝试使用 class(因此需要加载它,因为它上次失败了),但我们甚至不会尝试加载它,因为我们之前加载它失败了(并且有理由怀疑我们会再次失败)。


可能的解决方案:-

  1. class 在 Java 类路径中不可用。
  2. 如果您在 J2EE 环境中工作,那么 Class 在多个 Classloader 中的可见性也会导致 java.lang.NoClassDefFoundError,请参阅示例和场景部分进行详细讨论。
  3. 检查日志文件中的 java.lang.ExceptionInInitializerError。 由于 static 初始化失败导致的 NoClassDefFoundError 很常见。
  4. 因为 NoClassDefFoundError 是 java.lang.LinkageError 的子类,所以如果其中一个依赖项(如本机库)可能不可用,它也会出现。
  5. 任何启动脚本都会覆盖类路径环境变量。
  6. 您可能正在使用 jar 命令运行您的程序,而 class 未在清单文件的 ClassPath 属性中定义。

资源

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 线程“构建事件通知”中的异常 java.lang.NoClassDefFoundError:无法初始化 class sun.security.ssl.SSLContextImpl$TLSContext java.lang.NoClassDefFoundError: scala/Product$class 使用从 PySpark 读取 function Pyspark s3 错误:java.lang.NoClassDefFoundError:com/amazonaws/AmazonServiceException PYSPARK 连接到 aws S3 时出错:py4j.protocol.Py4JJavaError:java.lang.NoClassDefFoundError:com/amazonaws/AmazonClientException Java Lambda spring-cloud 版本到 3.2.3/3.1.7 org/springframework/boot/ApplicationContextFactory: java.lang.NoClassDefFoundError 在 AWS Lambda 上上传一个胖子 jar 但 java.lang.NoClassDefFoundError 不断出现 java.lang.NoClassDefFoundError:解析失败:Lcom/google/firebase/iid/FirebaseInstanceId on pusher api org.apache.spark.SparkException:无法初始化 class com.google.cloud.spark.bigquery.SparkBigQueryConnectorUserAgentProvider NoClassDefFoundError:com/google/common/util/concurrent/internal/InternalFutureFailureAccess 运行时异常 java.lang.NoSuchMethodError:com.google.common.base.Optional.toJavaUtil()L 与 Spark-BigQuery 连接器
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM