[英]User defined class available in CLASSPATH when starting H2 Database Server at command line
我从命令行启动 H2 服务器工具:
java -cp h2*.jar org.h2.tools.Server
我想使用一个用户定义的类一样Function
的显示一个用户自定义函数和存储过程章节。
我用我的用户功能做了几次尝试:
Function.class
文件acme/Function.class
文件acme.jar
文件中h2acme.jar
文件中并尝试了多种方法将它包含到类路径中,但没有成功。
例如:
[user@host h2]$ java -cp ./h2*.jar:./acme.jar org.h2.tools.Server -tcp -web
Error: Could not find or load main class org.h2.tools.Server
我已阅读此相关问题并遵循那里的指示。
但它似乎不起作用。
我能够完成这项工作的唯一方法是使用我的用户定义类更新h2*.jar
文件:
[user@host h2]$ jar uf h2-1.4.197.jar acme/Function.class
[user@host h2]$ jar tvf h2-1.4.197.jar | grep acme
421 Wed Sep 26 12:17:16 EEST 2018 acme/Function.class
然后从 H2 Shell:
[user@host h2]$ java -cp h2*.jar org.h2.tools.Shell -user sa -password sa -url jdbc:h2:tcp://localhost/~/mydb
Welcome to H2 Shell 1.4.197 (2018-03-18)
...
sql> CREATE ALIAS IS_PRIME FOR "acme.Function.isPrime";
(Update count: 0, 9 ms)
sql> CALL IS_PRIME(5);
PUBLIC.IS_PRIME(5)
TRUE
(1 row, 31 ms)
虽然我确实想将我的用户定义函数保存在一个单独的 jar 中。
如果有人知道如何做,将不胜感激。
我让 H2 服务器在用户定义的函数中使用我的 Java 和 Kotlin 函数。 有几个步骤必须正确完成才能使其工作。
首先,是用你的函数构建 jar(我有 Java 和 Kotlin 函数)。 在 H2 发出几条错误消息后,当它尝试编译和运行我的函数时,我意识到仅包含我项目的标准 jar 是不够的。 我必须包含它的所有依赖项。 幸运的是,Gradle 和 Maven 可以制作这种胖罐。 我使用maven-assembly-plugin
来制作我的。
其次,我告诉 H2 在我的本地 Maven 存储库中在哪里可以找到 H2 jar 和我的胖 jar。
H2_JAR=/Users/me/.m2/repository/com/h2database/h2/1.4.200/h2-1.4.200.jar
MY_JAR=/Users/me/.m2/repository/my/foo/app/1.0-SNAPSHOT/myfooapp-1.0-SNAPSHOT-jar-with-dependencies.jar
java -cp "$H2_JAR:$MY_JAR" org.h2.tools.Server -tcpPort 27777 -tcp
仅供参考:如果您希望 H2 调用 Kotlin 函数,那么 Kotlin 标准库必须位于 fat jar 中。 ( maven-assembly-plugin
将包含它。)。 此外,您的 Kotlin 函数将需要位于companion object
。 我还在那个 Kotlin 函数中添加了@JvmStatic
注释。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.