我想在Liferay 7 SP4 FP30模块中使用Elasticsearch的Client Java类,所以我写了这个build.gradle
:
dependencies {
compileOnly group: "com.liferay", name: "com.liferay.portal.search.elasticsearch", version: "2.1.14"
compileOnly group: "com.liferay", name: "org.elasticsearch", version: "2.2.0.LIFERAY-PATCHED-1"
compileOnly group: "biz.aQute.bnd", name: "biz.aQute.bndlib", version: "3.1.0"
compileOnly group: "com.liferay", name: "com.liferay.osgi.util", version: "3.0.0"
compileOnly group: "com.liferay", name: "com.liferay.portal.spring.extender", version: "2.0.0"
compileOnly group: "com.liferay.portal", name: "com.liferay.portal.kernel", version: "2.0.0"
compileOnly group: "com.liferay", name: "com.liferay.portal.security.audit.api", version: "2.0.0"
compileOnly group: "com.liferay", name: "com.liferay.portal.configuration.metatype", version: "2.0.0"
compileOnly group: "org.osgi", name: "org.osgi.compendium", version: "5.0.0"
}
...以及包含import com.liferay.portal.search.elasticsearch.connection.ElasticsearchConnectionManager;
和Client client = elasticsearchConnectionManager.getClient();
它建立得很好。
但是当我尝试启动模块时,会发生以下错误:
org.osgi.framework.BundleException: Could not resolve module: mymodule [548]
Unresolved requirement: Import-Package: com.liferay.portal.search.elasticsearch.connection
为什么会这样?我的build.gradle
未提及以.connection
和Maven does not seem to have any such module结尾的此模块。
答案 0 :(得分:1)
@gjoranv是正确的,只是因为你在 gradle.build ,它并不意味着它将在你的环境中。
首先,首先,错误是由于Java的常规意义上缺少使用过的包。因此,您需要一个模块,由jar文件表示,使该包公开。
由于liferay在弹性搜索方面非常依赖于版本,并且依赖于事故版本,因此您可能会通过Uber模块使用未暴露的软件包并强制进行曝光。
如果您感到幸运,您也可以使用compileInclude而不是compileOnly。以这种方式包含库可能会弄得一团糟,因为它会将jar嵌入jar中并暴露所有包。
另一种可能性较小的方法是嵌入jar,并在bundle中设置classpath。要执行此操作,您只需将依赖项声明为compile,并在bnd.bnd文件中添加类路径。 (听起来比它更难,应该是一个微不足道的过程)
要记住的另一个问题是与ElasticSearch和liferay部署的对齐:2.2-2.4.x但这只是因为如果您的对象被其他bundle使用或者当您的对象使用时,您可能会陷入类转换异常和API不匹配与旧的ES接口。
嵌入示例:
gradle.build
compile "org.apache.httpcomponents:httpclient"
compile "org.apache.httpcomponents:httpcore"
bnd.bnd
-includeresource: lib/httpclient.jar=httpclient-4.5.3.jar,\
lib/httpcore.jar=httpcore-4.4.6.jar
Bundle-ClassPath: ., lib/httpclient.jar, lib/httpcore.jar
答案 1 :(得分:0)
我对Liferay和gradle并不熟悉,但我已经和OSGi(apache felix)和maven合作了很长时间。该错误消息表明您的包使用包com.liferay.portal.search.elasticsearch.connection
,但运行时环境没有导出该包的包。有问题的包包含在build.gradle中提到的第一个依赖项中,但它不会被导出。如果您愿意,可以通过从the maven central repo下载来打开捆绑jar并查看其manifest.mf
。
由于未导出包(仅com.liferay.portal.search.elasticsearch.settings
),我认为这是一个不打算供外部使用的信号。所以也许你应该检查是否有另一种做你想做的事情。
通过查看Liferay docs使用第三方库,您似乎正在尝试将库扩展到您的模块中。如果您仍然需要使用.connection
包,也许可以尝试嵌入策略。