如何在连接时避免在 Eclipse 中与多个 JDBC 驱动程序发生 JAR 冲突?

Posted

技术标签:

【中文标题】如何在连接时避免在 Eclipse 中与多个 JDBC 驱动程序发生 JAR 冲突?【英文标题】:How do I avoid JAR Collision with multiple JDBC drivers in Eclipse on connect? 【发布时间】:2018-01-22 16:45:38 【问题描述】:

我的代码调用了两个不同的有点模糊的 JDBC 连接。这些 JARS 与 Jethro 和 Impala 有关,但我认为这个问题并不重要。如果我单独为 Jethro 添加外部 JAR,它就可以工作。黑斑羚也是如此。但是,如果我同时添加 Jethro 和 Impala 外部 jar,我似乎会发生碰撞。我希望能够在同一程序空间中调用任一 JDBC 库。出现以下异常:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/thrift/protocol/TProtocol
    at com.cloudera.impala.impala.core.ImpalaJDBCDriver.<clinit>(ImpalaJDBCDriver.java:24)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at com.cloudera.impala.dsi.core.impl.DSIDriverFactory.createDriver(DSIDriverFactory.java:52)
    at com.cloudera.impala.jdbc.common.AbstractDriver.doInitialize(AbstractDriver.java:471)
    at com.cloudera.impala.jdbc.common.AbstractDriver.connect(AbstractDriver.java:207)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
    at TestConnect.main(TestConnect.java:20)
Caused by: java.lang.ClassNotFoundException: org.apache.thrift.protocol.TProtocol
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

【问题讨论】:

【参考方案1】:

这个问题已经解决了。本质上,我没有 Impala 的所有依赖 JAR。我认为这无关紧要,因为我正在给 Jethro 打电话。确实很重要。

添加以下 jar 确实使它工作。 Maven 得一分。如果我使用 Maven,这将不会发生。为了后代的缘故,这里是依赖的 JARS:

libfb303 libthrift log4j TCLIServiceClient

【讨论】:

以上是关于如何在连接时避免在 Eclipse 中与多个 JDBC 驱动程序发生 JAR 冲突?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 Java Decompiler / JD / JD-Eclipse 在 Eclipse Helios 中运行

安装和使用JD-Eclipse插件

Eclipse如何安装JD-Eclipse反编译插件

AngularJS 多个表达式在插值中与 URL 连接

在eclipse中将实体映射到连接的问题

在eclipse里jdbc连接mysql 怎么安装