【问题标题】:java ClassNotFoundException for org.h2.Driverorg.h2.Driver 的 java ClassNotFoundException
【发布时间】:2011-04-29 19:27:44
【问题描述】:

我正在尝试使用 H2 连接到 Java 中的数据库(使用 Eclipse 作为 IDE)。该示例确实(如下)引发了ClassNotFoundException。问题是,我确实将 h2 jar 文件添加到系统 CLASSPATH。我什至通过控制台中的printenv 多次检查它是否存在。我是否省略了一个步骤?

代码:

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 复制到其中,然后右键单击并选择“构建路径 > 添加到构建路径”。
  • 您能否正确格式化您的代码 - 选择代码并在编辑模式下使用编辑工具栏上的第 5 个按钮(代码示例)。
  • 你是如何运行你的代码的?在 Eclipse 内部还是从命令行?你是如何在类路径中添加 h2.jar 的?您如何检查类路径中是否存在 h2.jar?
  • 我使用控制台将它添加到 CLASSPATH 中:sudo gedit /etc/environment,然后手动添加一行 key="value"。然后我注销并登录,检查,它就在那里。
  • Neeme - 我正在使用 RUN 菜单从 Eclipse 内部运行代码。

标签: java jdbc h2 classnotfoundexception


【解决方案1】:

这适用于 testRuntimeOnly 'com.h2database:h2:1.4.200'

在 application.yaml 属性中 删除或注释掉 #driverClassName: org:h2:Driver

根据 springboot 最新文档 jdbc 驱动程序不需要,因为它是自动检测的。

【讨论】:

    【解决方案2】:

    我使用 sbt。 在 build.sbt 中,我删除了“h2”依赖项并包含了这个: “com.h2.database”%“h2”%“1.4.200” 它奏效了!

    【讨论】:

    • 这对我来说似乎是stackoverflow.com/a/48676896/1392312 的副本
    • 不,那个人刚刚从依赖项中删除了“test”。我刚刚添加了“h2”依赖项,并且添加了一些更改。请仔细阅读两个答案。
    【解决方案3】:

    我正在使用 IntelliJ。我在 lib 文件夹中有“h2-1.4.200”。我尝试了每一个建议,范围从 , 到 。奇怪的是,我的问题只有去这些地方才能解决: 项目结构 -> 工件 -> 输出布局 -> 可用元素 然后展开文件夹的内容,然后右键单击“h2-1.4.200”,最后选择“提取到输出根目录”。 :) The strange solution

    【讨论】:

      【解决方案4】:

      我在h2数据库中使用时遇到了同样的问题: 2次,因为驱动管理器无法识别正确的连接类型

      • 当你使用“jdbc:h2:localhost:123/db”时,它分为“jdbc”、“h2:localhost”、“123/db”,
      • 所以这里的预期值是 h2,但由于核心正则表达式中的问题,用于从加载的驱动程序列表中识别驱动程序类而得到 h2:localhost

      使用完整路径,例如:

      • 不要:“jdbc:h2:testdb”,         应该:“jdbc:h2:/c:/.../testdb”
      • 不要:“jdbc:h2:localhost:123/db”,要:“jdbc:h2://localhost:123/db”

      【讨论】:

        【解决方案5】:

        如果你在 build.gradle 中使用 Gradle 改变依赖:

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

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

        【讨论】:

        • 这对我有帮助。 :)
        【解决方案6】:

        我遇到了以下错误(使用 Intellij)

        org.h2.Driver 的 java ClassNotFoundException

        通过从我的 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 快速入门项目作为对另一个项目的依赖项来实现时,会出现这种类型的错误。大多数情况下仅作为 junit 的测试。所以在应用中它不会起作用。

        【讨论】:

          【解决方案7】:

          就我而言,这实际上是连接字符串问题。我看到了this

          在我在下面的 URL 字符串中添加 mem 之后,它就起作用了。

          String url = "jdbc:h2:mem:~/test";
          

          【讨论】:

            【解决方案8】:

            使用发布版本。

                <dependency>
                    <groupId>com.h2database</groupId>
                    <artifactId>h2</artifactId>
                    <version>RELEASE</version>
                    <scope>compile</scope>
                </dependency>
            

            【讨论】:

              【解决方案9】:

              使用&lt;scope&gt;test&lt;/scope&gt; 不应该在逻辑上起作用。用&lt;scope&gt;runtime&lt;/scope&gt;&lt;scope&gt;provided&lt;/scope&gt; 试试,除非你只在测试阶段需要它。

              在 maven 文档上,它说 &lt;scope&gt;test&lt;/scope&gt; 依赖项对于应用程序的正常使用不是必需的,仅适用于测试编译和执行阶段
              https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html p>

              【讨论】:

              • 我不知道谁对此投了反对票,但删除 test 确实对我有用。
              【解决方案10】:

              最近在 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.4.197 降级来解决这个问题,仍然不知道为什么。
              【解决方案11】:

              就我而言(我使用 sbt) 改变

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

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

              【讨论】:

                【解决方案12】:

                在我的情况下(有点无关,但值得一提),我将它添加到我的 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>
                

                【讨论】:

                • 可能需要添加&lt;scope&gt;test&lt;/scope&gt;,因为这可能是最常用的方式。最新版本在这里:h2database.com/html/main.html
                【解决方案13】:

                &lt;scope&gt;[database_name]&lt;/scope&gt; 应包含您正在使用的数据库。如果您将数据库从一个更改为另一个,请确保也更改范围。一旦我更改它,错误就消失了。

                【讨论】:

                  【解决方案14】:

                  示例确实(如下)引发了 ClassNotFoundException

                  那么驱动程序不在类路径中。

                  问题是,我确实将 h2 jar 文件添加到了系统 CLASSPATH。我什至通过控制台中的“printenv”检查了它是否存在多次。

                  你是怎么做到的?请显示获得的输出。

                  我是否省略了一个步骤?

                  我不能说提供的信息。但是依赖CLASSPATH 环境变量无论如何都是不好的做法,如果您在命令行上运行Java,则应该使用-cp 选项。像这样:

                  java -cp h2.jar com.acme.Program
                  

                  有没有办法让我在使用 RUN 菜单时将 Eclipse 设置为使用 jar 文件,这样我就不必一直从控制台运行?

                  是的。在 Eclipse 下,将 JAR 添加到项目构建路径:右键单击您的项目,然后 Properties > Java Build Path > Libaries > Add JARS...(假设 H2 JAR 在与您的项目相关的目录中可用)。其他 IDE 也有类似的方法。

                  【讨论】:

                  • 谢谢。我不知道 CLASSPATH 是糟糕的策略。有没有办法让我在使用 RUN 菜单时将 Eclipse 设置为使用 jar 文件,这样我就不必一直从控制台运行?
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-11-26
                  • 1970-01-01
                  • 2011-11-11
                  • 1970-01-01
                  相关资源
                  最近更新 更多