【问题标题】:Include redshift jdbc driver: Unable to instantiate driver class "com.amazon.redshift.jdbc.Driver": java.lang.NoClassDefFoundError包括 redshift jdbc 驱动程序:无法实例化驱动程序类“com.amazon.redshift.jdbc.Driver”:java.lang.NoClassDefFoundError
【发布时间】:2018-07-27 07:32:28
【问题描述】:

我们使用带有 postgres 数据源的 Wildfly 10(postgres 驱动程序在 /modules 文件夹中提供),此外,还应附加一个 Redshift DB。

所以我关注了Configure a JDBC Connection with Apache Maven :
因此,我的父 POM 包括:

<repositories>
    ...
    <repository>
        <id>redshift</id>
        <url>http://redshift-maven-repository.s3-website-us-east-1.amazonaws.com/release</url>
    </repository>
</repositories>

<dependencies>
    ...
    <dependency>
        <groupId>com.amazon.redshift</groupId>
        <artifactId>redshift-jdbc42</artifactId>
        <version>1.2.10.1009</version>
    </dependency>
</dependencies>

如果我知道部署我的 .war 文件,日志中很早就会出现以下警告:

INFO  [org.jboss.as.connector.deployers.jdbc] (MSC service thread 1-3) WFLYJCA0004: Deploying JDBC-compliant driver class org.h2.Driver (version 1.4)
INFO  [org.jboss.as.connector.deployers.jdbc] (MSC service thread 1-3) WFLYJCA0005: Deploying non-JDBC-compliant driver class org.postgresql.Driver (version 9.2)
WARN  [org.jboss.as.connector.deployers.jdbc] (MSC service thread 1-3) WFLYJCA0003: Unable to instantiate driver class "com.amazon.redshift.jdbc.Driver": java.lang.NoClassDefFoundError: com/amazon/redshift/core/jdbc42/PGJDBC42DriverImpl

所以难怪以后,如果我尝试访问数据库,我会得到

ERROR [stderr] (default task-64) java.sql.SQLException: No suitable driver found for jdbc:redshift://....
ERROR [stderr] (default task-64)    at java.sql.DriverManager.getConnection(DriverManager.java:689)
ERROR [stderr] (default task-64)    at java.sql.DriverManager.getConnection(DriverManager.java:208)

那我做错了什么?驱动打包在 .war 中,这是肯定的,否则,在部署期间将不会尝试实例化它。 任何帮助都非常感谢!

【问题讨论】:

    标签: java jdbc amazon-redshift


    【解决方案1】:

    显然redshift-jdbc42 依赖项已与“内部”JAR 文件打包在一起,这会在某些情况下导致类加载问题。换个试试

        <dependency>
            <groupId>com.amazon.redshift</groupId>
            <artifactId>redshift-jdbc42</artifactId>
            <version>${amazon.redshift.version}</version>
        </dependency>
    

        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-redshift</artifactId>
            <version>${amazonaws.sdk.version}</version>
        </dependency>
        <dependency>
            <groupId>com.amazon.redshift</groupId>
            <artifactId>redshift-jdbc42-no-awssdk</artifactId>
            <version>${amazon.redshift.version}</version>
        </dependency>
    

    (来源:https://forums.aws.amazon.com/thread.jspa?threadID=263573

    【讨论】:

    • 非常感谢!一点说明:${amazonaws.sdk.version} 两者不一样;版本编号不同。
    • 是的。可以看到,上面使用了${amazonaws.sdk.version}${amazon.redshift.version}
    • 哦,是的,对不起...我太盲目了,看不出区别 ;-)
    【解决方案2】:

    在 build.gradle 中更新 Redshift 依赖解决了我的问题

              // AWS
            dependency "com.amazon.redshift:redshift-jdbc42-no-awssdk:1.2.54.1082"
            dependencySet(group: "com.amazonaws", version: "1.11.688") {
                entry "aws-java-sdk-s3"
                entry "aws-java-sdk-sts"
                entry "aws-java-sdk-redshift"
    
            };
    

    【讨论】:

      猜你喜欢
      • 2015-03-23
      • 2012-08-27
      • 1970-01-01
      • 2017-05-17
      • 2021-06-05
      • 2020-06-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多