Java中针对org.h2.Driver的ClassNotFoundException异常

43

我正在尝试使用H2在Java中连接数据库(使用Eclipse作为IDE)。下面的代码样本引发了一个ClassNotFoundException异常。问题是,我确实将h2 jar文件添加到系统CLASSPATH中。我甚至通过控制台中的printenv多次检查了它是否存在。我有遗漏步骤吗?

CODE:

import java.sql.*;

public class Program {

 /**
  * @param args
  */
 public static void main(String[] args) 
  throws Exception{

  try{
   System.out.println("hello, world!");
   Class.forName("org.h2.Driver");
   Connection conn = DriverManager.getConnection("jdbc:h2:~/testdb", "sa", "");
   // add application code here
   conn.close();
  }catch(ClassNotFoundException ex){
   System.out.println( "ERROR: Class not found: " + ex.getMessage() );

  }
  System.exit(0);

 }

}

你是怎么将Jar包添加到类路径中的?为了确保,我会在你的项目中创建一个名为“lib”的文件夹,将jar包复制到其中,然后右键单击并选择“Build path > Add to build path”来添加到构建路径中。 - William
请您把代码格式化一下 - 在编辑模式下选择代码,然后使用编辑工具栏上的第五个按钮(代码示例)。 - Neeme Praks
你是如何运行你的代码的?在Eclipse中还是从命令行中? 你是如何将h2.jar添加到类路径中的? 你是如何检查类路径中是否存在h2.jar的? - Neeme Praks
我使用控制台将它添加到了CLASSPATH中:sudo gedit /etc/environment,然后手动添加了一行形式为key="value"的代码。然后我退出并重新登录,检查发现它已经存在了。 - Ashton Wilkins
Neeme - 我正在使用Eclipse内部的RUN菜单运行代码。 - Ashton Wilkins
William - 谢谢,我是Java开发的新手(我承认自己是C#程序员,但Java正在逐渐吸引我)。你的建议很有效:即我将jar文件添加到Eclipse的构建路径中,重新构建后,ClassNotFoundException错误不再出现。再次感谢! - Ashton Wilkins
16个回答

42
在我的情况下(与主题稍有不同,但值得一提),我将这个添加到了我的Maven POM文件中,错误信息便消失了:
  <dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>xxx</version> <!-- ex: 1.2.140 -->
  </dependency>

如果你只在单元测试中使用 h2:

  <dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>xxx</version> <!-- ex: 1.2.140 -->
    <scope>test</scope>
  </dependency>

1
最好加上<scope>test</scope>,因为这可能是它最常用的方式。最新版本在此处可用:http://www.h2database.com/html/main.html - GlenPeterson

21

我在使用Intellij时遇到了以下错误:

java ClassNotFoundException for org.h2.Driver

通过从我的POM中移除作用域来解决了这个问题。

现在:

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.197</version>
        <scope>test</scope>
    </dependency>

改为:

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.197</version>
    </dependency>

在将Maven Quickstart项目作为另一个项目的依赖项时,会出现此类型的错误。主要只出现在junit的测试中,因此在应用程序中将无法正常工作。


16

最近在使用IntelliJ IDEA 2017.2 EAP时,遇到了java.lang.ClassNotFoundException: org.h2.Driver的异常情况,使用最新版本(1.4.196)的H2驱动程序。解决方法是降级到1.4.195。

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.195</version>
    <scope>test</scope>
</dependency>

1
我不得不降级到1.4.197来解决这个问题,但仍然不知道原因。 - Ivana

8
以下示例会抛出ClassNotFoundException异常。 那么,驱动程序不在类路径上。 问题是,我确实将h2 jar文件添加到系统CLASSPATH中。我甚至通过控制台中的“printenv”多次检查了它是否存在。 您是如何做到这一点的?请展示获得的输出。 提供的信息不足以确定是否省略了步骤。但是,依赖于CLASSPATH环境变量是一种不好的做法,如果您在命令行上运行Java,则应使用-cp选项。像这样:
java -cp h2.jar com.acme.Program

有没有一种方法可以设置Eclipse在使用RUN菜单时使用jar文件,以便我不必一直从控制台运行?
是的。在Eclipse下,将JAR添加到项目构建路径中:右键单击您的项目,然后属性> Java构建路径>库>添加JARS...(假设H2 JAR相对于您的项目可用于一个目录中)。其他IDE也有类似的做法。

谢谢。我不知道CLASSPATH是糟糕的政策。有没有办法可以设置Eclipse在使用RUN菜单时使用jar文件,这样我就不必一直从控制台运行了? - Ashton Wilkins

4
在我的情况下(我使用sbt),更改为:
libraryDependencies += "com.h2database" % "h2" % "1.4.196" % Test

为了

libraryDependencies += "com.h2database" % "h2" % "1.4.196"

3

如果您使用Gradle,请在build.gradle文件中更改依赖项:

testCompile group: 'com.h2database', name: 'h2', version: '1.4.199'

to

compile group: 'com.h2database', name: 'h2', version: '1.4.199'

这帮了我。 :) - GreenROBO

2

<scope>[database_name]</scope>应该包含您正在使用的数据库。如果您从一个数据库更改到另一个数据库,请确保同时更改作用域。一旦我更改了它,错误就消失了。


1
使用发布版本。
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>RELEASE</version>
        <scope>compile</scope>
    </dependency>

1

移除作用域标签

<scope>test</scope>

1
在我的情况下,实际上是连接字符串的问题。我看到了 this
在我下面的URL字符串中添加mem后,它就可以工作了。
String url = "jdbc:h2:mem:~/test";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接