在命令行启动H2数据库服务器时,用户定义的类在CLASSPATH中可用

时间:2018-09-26 10:14:05

标签: java classpath h2

我从命令行以以下方式启动H2服务器工具:

interface{}

我正在尝试使用User-Defined Functions and Stored Procedures section.

中显示的用户定义类,例如java -cp h2*.jar org.h2.tools.Server

我已经使用用户功能进行了几次尝试:

  • 将其编译为Function文件
  • 将其编译为Function.class文件
  • 将其打包为acme/Function.class文件
  • 将其打包为acme.jar文件

并尝试了几种将其包含到类路径中的方法,但是没有运气。
例如:

h2acme.jar

我已阅读this related issue,并按照那里的指示进行操作。
但这似乎不起作用。

2 个答案:

答案 0 :(得分:0)

我能够进行这项工作的唯一方法是使用用户定义的类更新[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

然后从H2 Shell:

[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

尽管我确实希望将用户定义的函数保存在单独的jar中。
如果有人知道该怎么做,将不胜感激。

答案 1 :(得分:0)

我有H2服务器在用户定义的函数中使用Java和Kotlin函数。要使其正常工作,必须正确完成几个步骤。

首先,用您的函数(我同时拥有Java和Kotlin函数)构建jar。在收到来自H2的几条错误消息之后,当它尝试编译并运行我的函数时,我意识到仅包含项目的标准jar是不够的。我必须包括其所有依赖项。幸运的是,Gradle和Maven可以制造这种胖子。我用maven-assembly-plugin做我的。

第二,我告诉H2在本地Maven存储库中的哪里可以找到H2罐和我的胖罐。

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标准库必须位于胖子罐中。 (maven-assembly-plugin将包含它。)另外,您的Kotlin函数将必须位于companion object中。我还向该Kotlin函数添加了@JvmStatic注释。