基于 Java 的 H2 数据库无法在 CLASSPATH 中找到项目

Posted

技术标签:

【中文标题】基于 Java 的 H2 数据库无法在 CLASSPATH 中找到项目【英文标题】:Java-based H2 Database cannot locate items in CLASSPATH 【发布时间】:2014-10-27 03:26:16 【问题描述】:

我有一个使用以下命令编译的 scala 文件:

scalac -cp ".:*" AcmeTrigger.scala

在包含.scala 文件的目录中,我有一些.jar 文件,其中包含我正在使用的电子邮件和短信服务的API。这里没有问题。

当有人修改数据库中的表时,scala 文件本质上会发送文本消息和电子邮件。我使用以下命令启动数据库:

java -cp ".:*" -jar h2-1.4.182.jar

基本上告诉它使用目录中的.class.jar 文件并将它们添加到类路径中。我已经做了很多变化。不带 .class,带“.:*”和完全键入的名称。不管我做什么,H2 都不认识这个类。

所以在这个数据库中有一个操作将数据库连接到一个类:

CREATE TRIGGER ALERT AFTER INSERT ON "event" FOR EACH ROW CALL "AcmeTrigger"

当我运行它时,我收到一个错误,指出它找不到类

Error creating or initializing trigger "ALERT" object, class "AcmeTrigger", cause: "org.h2.message.DbException: Class ""AcmeTrigger"" not found [90086-182]"

我不认为错误出在查询语法中,而是我使用类路径的方式,并希望有更多 Java/Scala 经验的人可以在这里帮助我。我尝试了许多启动 .jar 文件的变体,但似乎没有任何帮助。

【问题讨论】:

你的 jar 是在运行 H2 本身,还是通过 JDBC 或其他方式连接到另一个进程? @ChrisMartin .jar 包含一个扩展 org.h2.api.Trigger 的类“AcmeTrigger”。根据 H2 文档,您指出每次运行我在上面发布的 SQL 语句时都应该调用该文件。 SQL 语句返回在类路径中找不到该类。 Cannot call trigger in H2 DB 的可能重复项 @ChrisMartin 不幸的是,那里的答案只是声明将类添加到类路径中,但这似乎不起作用。我不确定我是否错误地使用了类路径,因为在使用 -verbose 时,我从来没有看到我的类被 H2 加载。 啊,抱歉,我没有注意到您在哪里包含了用于启动 H2 的命令。 【参考方案1】:

H2 jar 的默认 main 方法会导致奇怪的类加载器行为(需要更多研究来确定是什么)。我和OP有完全相同的经历。

将编译后的类复制到您选择的目录(例如libs)以及 H2 jar 后,像这样运行 H2 服务器:

java -cp "/libs:/libs/h2-1.4.197.jar" org.h2.tools.Server

这应该会导致触发器引用的类的正确解析。

【讨论】:

【参考方案2】:

AFAIK 您不能将单个 .class 文件添加到类路径中。试试java -cp ".:*.jar"(即使用这个目录作为类路径上的一个条目,而不是单独的.class文件)

另请注意,scalac 隐含包括例如类路径上的 scala 库。确保您拥有适当的scala-library.jar

【讨论】:

尝试了不同的变体,并添加了 scala-library.jar。

以上是关于基于 Java 的 H2 数据库无法在 CLASSPATH 中找到项目的主要内容,如果未能解决你的问题,请参考以下文章

h2 数据库的 ClassNotFound 异常 class.forname("org.h2.Driver")

我在扩展使用视图的基于 h2 的 Java 应用程序时遇到问题

内存模式下的H2数据库无法被Console访问

无法浏览 H2 数据库文件?

无法解析类或包 H2

无法在 mac 上打开 h2.jar