【问题标题】:Teradata and JDBC driver - classnotfoundexception ...but its there?Teradata 和 JDBC 驱动程序 - classnotfoundexception ...但它在那里?
【发布时间】:2012-10-17 00:29:36
【问题描述】:

尝试使用与 Teradata 的 JDBC 连接。当我在 Linux 中编译时,我已经加载了 tdgssconfig.jar 和 terajdbc4.jar 文件并使用 javac 将它们添加到类路径中。但是在尝试编译时我仍然得到一个 ClassnotFoundException 。

我已经有一段时间没有使用java了,但是我已经在网上搜索了一下,它看起来应该可以工作。

简单代码:

import java.sql.*;
class TDtest {
    public static void main(String[] args) {    
        System.out.println(classpath);

        Class.forName("com.teradata.jdbc.TeraDriver");
    }
}

*.jars 肯定在那里:

[user1@box java]# ls -l /home/user1/test/java/libs/*
-rwxrwxrwx 1 user1 user1 2405 Oct 26 12:00 /home/user1/test/java/libs/tdgssconfig.jar
-rwxrwxrwx 1 user1 user1 873860 Oct 26 12:00 /home/user1/test/java/libs/terajdbc4.jar

详细错误日志 - 看起来类路径对我来说是正确的:

javac -verbose -cp ".:/home/user1/test/java/libs/tdgssconfig.jar:/home/user1/test/java/libs/terajdbc4.jar" TDtest.java
[parsing started TDtest.java]
[parsing completed 21ms]
[search path for source files: .,/home/user1/test/java/libs/tdgssconfig.jar,/home/user1/test/java/libs/terajdbc4.jar]
[search path for class files: /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/resources.jar,/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/rt.jar,/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/sunrsasign.jar,/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/jsse.jar,/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/jce.jar,/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/charsets.jar,/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/classes,/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/ext/dnsns.jar,/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/ext/sunpkcs11.jar,/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/ext/localedata.jar,/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/ext/gnome-java-bridge.jar,/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/ext/sunjce_provider.jar,.,/home/user1/test/java/libs/tdgssconfig.jar,/home/user1/test/java/libs/terajdbc4.jar]
[loading java/lang/Object.class(java/lang:Object.class)]
[loading java/lang/String.class(java/lang:String.class)]
[checking TDtest]
[loading java/lang/Class.class(java/lang:Class.class)]
[loading java/lang/Error.class(java/lang:Error.class)]
[loading java/lang/ClassNotFoundException.class(java/lang:ClassNotFoundException.class)]
[loading java/lang/Exception.class(java/lang:Exception.class)]
[loading java/lang/Throwable.class(java/lang:Throwable.class)]
[loading java/lang/RuntimeException.class(java/lang:RuntimeException.class)]
TDtest.java:4: unreported exception java.lang.ClassNotFoundException; must be caught or declared to be thrown
        Class.forName("com.teradata.jdbc.TeraDriver");

我已经尝试对 jdbc jar 进行 un-jar'ing,它们肯定有 com/teradata/jdbc/TeraDriver.class。

我很茫然。知道我做错了什么吗?

【问题讨论】:

    标签: java linux classpath teradata


    【解决方案1】:

    编译器不是从您的 jar 文件中查找类 com.teradata.jdbc.TeraDriver,而是对 Class.forName() 语句作出反应。

    Class.forName() 抛出ClassNotFoundException 这是一个checked exception,你需要处理它。

    您可以将异常包含在 `try/catch' 块中,也可以抛出异常进行编译:

     class TDtest  {
       public static void main(String[] args) {    
          System.out.println(classpath);
    
          try {
             Class.forName("com.teradata.jdbc.TeraDriver");
          } catch (ClassNotFoundException e) {
             e.printStackTrace();
             // more error handling..
          }
       }
    }
    

    【讨论】:

      【解决方案2】:

      问题不在于您的类路径。只是你想用 try/catch 块包装你的 Class.forName 行并捕获检查的异常 ClassNotFoundException

      【讨论】:

        【解决方案3】:

        试试这个

         try {
            Class.forName("com.teradata.jdbc.TeraDriver").newInstance();
        
             } catch (Exception e) {
            e.printStackTrace();
        
             }
        

        【讨论】:

          【解决方案4】:

          我知道了

          Exception in thread "main" java.lang.ClassNotFoundException: 
          com.ncr.teradata.TeraDriver
              at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
          at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
          at java.security.AccessController.doPrivileged(Native Method)
          at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
          at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
          at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
          at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
          at java.lang.Class.forName0(Native Method)
          at java.lang.Class.forName(Class.java:191)
          at com.ebay.quality.bp.Z_Query_Teradata.main(Z_Query_Teradata.java:15)
          

          当我在 Dependency Hierarchy 选项卡下检查我的 pom.xml 文件时,我发现我在依赖项旁边有测试。

          <dependency>
            <groupId>com.thirdparty.teradata</groupId>
            <artifactId>terajdbc4</artifactId>
            <version>14.10.00.17</version>
            <scope>test</scope>
          </dependency>
          

          我删除了带有测试范围的行并且它起作用了。

          【讨论】:

            【解决方案5】:

            我有一个版本为 16.20.00.06 的 ClassNotFoundException。 我切换到 15.10.00.37 现在可以了。 我的猜测是 16.20.00.06 可以使用比我更新的 Java 版本。

            【讨论】:

              猜你喜欢
              • 2011-09-10
              • 2014-09-27
              • 1970-01-01
              • 1970-01-01
              • 2014-09-17
              • 2013-03-03
              • 1970-01-01
              • 1970-01-01
              • 2014-02-04
              相关资源
              最近更新 更多