【问题标题】:java.lang.NoClassDefFoundError: com/google/cloud/sql/core/CoreSocketFactoryjava.lang.NoClassDefFoundError: com/google/cloud/sql/core/CoreSocketFactory
【发布时间】:2020-04-19 04:27:43
【问题描述】:

当我尝试运行通过 jdbc 连接到谷歌云实例的脚本时,我不断收到此错误。完全不确定如何解决它:

Exception in thread "main" java.lang.NoClassDefFoundError: com/google/cloud/sql/core/CoreSocketFactory
        at com.google.cloud.sql.postgres.SocketFactory.createSocket(SocketFactory.java:73)
        at org.postgresql.core.PGStream.<init>(PGStream.java:73)
        at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:93)
        at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:197)
        at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49)
        at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:211)
        at org.postgresql.Driver.makeConnection(Driver.java:459)
        at org.postgresql.Driver.connect(Driver.java:261)
        at java.sql.DriverManager.getConnection(DriverManager.java:664)
        at java.sql.DriverManager.getConnection(DriverManager.java:270)
        at App.main(App.java:12)
Caused by: java.lang.ClassNotFoundException: com.google.cloud.sql.core.CoreSocketFactory
        at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
        ... 11 more

连接到 db 的脚本(“..”引用了出于隐私原因未包括在内的实例名称和密码):

import java.sql.Connection;
import java.sql.DriverManager;

public class App
{
    public static void main(String args[])
    {
        Connection c = null;
        try
        {
           Class.forName("org.postgresql.Driver");
           c = DriverManager.getConnection("jdbc:postgresql:///<postgres>?cloudSqlInstance=<...:database>&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=<postgres>&password=<...>");
        }
        catch (Exception e)
        {
           e.printStackTrace();
           System.err.println(e.getClass().getName()+": "+e.getMessage());
           System.exit(0);
        }
        System.out.println("Opened database successfully");
     }
}

【问题讨论】:

    标签: java jdbc google-cloud-platform socketfactory


    【解决方案1】:

    您正在尝试将 socketFactory=com.google.cloud.sql.postgres.SocketFactory 参数传递给 JDBC 连接字符串,而在您的类路径中找不到类 com.google.cloud.sql.core.CoreSocketFactory。

    看起来您没有向类路径添加必需的依赖项。看看GCP github手册:https://github.com/GoogleCloudPlatform/cloud-sql-jdbc-socket-factory

    例如,如果您使用 Maven,请添加此依赖项

    <dependency>
        <groupId>com.google.cloud.sql</groupId>
        <artifactId>postgres-socket-factory</artifactId>
        <version>1.0.15</version>
    </dependency>
    

    【讨论】:

    • 当我使用命令 mvn -P jar-with-driver-and-dependencies clean package -DskipTests 重新编译时,我收到此错误:'dependencies.dependency. com.google.cloud.sql:postgres-socket-factory:1.0.15' 为 com.google.cloud.sql:postgres-socket-factory:1.0.15 引用自身。 @ 第 34 行,第 17 列
    • 我刚刚用gist.github.com/mih-kopylov/98c29173e00e8d30924cad7e96dc8577这个依赖创建了一个空的Spring Boot项目,它已经成功编译并用-P jar-with-driver-and-dependencies打包了
    • 这里是这个工件的来源:github.com/GoogleCloudPlatform/cloud-sql-jdbc-socket-factory/… - 它也不包含任何循环引用
    • 当我使用 -P jar-with-driver-and-dependencies 在您的 xml 文件中运行代码时,我收到以下错误:没有为此构建指定目标。您必须以 : 或 :[:]: 格式指定有效的生命周期阶段或目标.可用的生命周期阶段有:验证、初始化、生成源、流程源、生成资源、流程资源、编译、流程类、生成测试源、流程测试源、生成测试资源、流程-test-resources, test-compile, process-test-classes, test
    • 您似乎输入了错误的命令。 mvn package 工作正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2015-08-02
    • 2012-06-01
    • 2018-04-26
    • 2018-01-18
    • 2018-05-26
    相关资源
    最近更新 更多