我在eclipse RCP应用程序中使用H2 bundle。它使用这样的java实现:
create alias MY_FUNCTION for "com.fun.MyFunctions.myFunction";
其中MyFunctions是公共类,myFunction是公共静态方法。
由于MANIFEST.MF中的以下声明,它适用于H2版本1.3.170或更早版本:
DynamicImport-Package: *
较新的H2版本不再具有此声明,因此我获得了ClassNotFound异常。
在H2的git日志中我发现以下注释(对于提交删除DynamicImport):
改进了OSGi支持。 H2现在将自己注册为DataSourceFactory 服务。修复问题365。
文档不是很有帮助: http://www.h2database.com/html/tutorial.html#osgi
您是否知道我现在如何添加我的依赖项?
答案 0 :(得分:1)
H2转而使用DataSourceFactory
,因为它是一种更好(并且独立于提供者)获取Driver
或DataSource
的方式。它实际上与DynamicImport-Package: *
的存在没有特别的关系。可能会特别添加使用通配符动态导入以解决您的用例,但它基本上是一个非常差的模块化实践,并且可以导致所有各种各样的问题。例如,在删除捆绑包之后,无法阻止H2尝试加载您的功能。
假设您的功能过于复杂,您可能最好将其注册为Java源代码。这解释为in the H2 docs并且不太复杂。实际上,您可以注册别名,但使用美元符号标记Java源:
CREATE ALIAS MY_FUNCTION AS $$
String myFunction(String arg) {
// Your implementation goes in here
return arg;
}
$$;