基于 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")