对于不在我的build.gradle中的模块,“未解决的要求:Import-Package”

时间:2017-10-26 03:56:04

标签: elasticsearch gradle liferay osgi

我想在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();

等代码的Java类

它建立得很好。

但是当我尝试启动模块时,会发生以下错误:

org.osgi.framework.BundleException: Could not resolve module: mymodule [548]
  Unresolved requirement: Import-Package: com.liferay.portal.search.elasticsearch.connection

为什么会这样?我的build.gradle未提及以.connectionMaven does not seem to have any such module结尾的此模块。

2 个答案:

答案 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包,也许可以尝试嵌入策略。