1

尝试使用与 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");

我试过 un-jar'ing jdbc jar,它们肯定有 com/teradata/jdbc/TeraDriver.class。

我不知所措。知道我做错了什么吗?

4

5 回答 5

2

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

作为已检查异常Class.forName()的throws ,您将需要处理它。ClassNotFoundException

您可以将异常包含在“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..
      }
   }
}
于 2012-10-26T18:06:43.647 回答
0

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

于 2012-10-26T18:04:21.930 回答
0

试试这个

 try {
    Class.forName("com.teradata.jdbc.TeraDriver").newInstance();

     } catch (Exception e) {
    e.printStackTrace();

     }
于 2012-10-26T18:16:55.207 回答
0

我懂了

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>

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

于 2017-09-26T21:44:01.700 回答
0

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

于 2018-04-27T11:10:35.430 回答