![](/img/trans.png)
[英]Exception in thread "Build Event Notification" java.lang.NoClassDefFoundError: Could not initialize class sun.security.ssl.SSLContextImpl$TLSContext
[英]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;
}
所以实际上它是以这种方式发生的:
这区分java.lang.ClassNotFoundException
和java.lang.NoClassDefFoundError
,其中 ClassNotFoundException 显示 class 在类路径中未找到,这意味着我们正在尝试加载 class 定义; 并且 class 在我们的类路径中不存在。
但是,在您的情况下,当JVM 在其内部 class 定义数据结构中查找 class 的定义时并没有找到它。
这意味着我们之前尝试从类路径加载 class,但由于某种原因失败了- 现在我们再次尝试使用 class(因此需要加载它,因为它上次失败了),但我们甚至不会尝试加载它,因为我们之前加载它失败了(并且有理由怀疑我们会再次失败)。
可能的解决方案:-
资源
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.