2017-10-26 3 views
0

ich Elasticsearch-Client-Java-Klasse innerhalb eines Liferay 7 SP4 FP30-Modul verwenden möchten, so schrieb ich dieses build.gradle:"Ungelöste Anforderung: Import-Package" für ein Modul nicht in meinem 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" 
} 

. .. und eine Java-Klasse mit Code wie import com.liferay.portal.search.elasticsearch.connection.ElasticsearchConnectionManager; und Client client = elasticsearchConnectionManager.getClient();

Es baut gut.

Aber wenn ich versuche, das Modul zu starten, dieser Fehler passiert:

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

Warum ist das passiert? Mein build.gradle erwähnt dieses Modul nicht, das in .connection, und Maven does not seem to have any such module endet.

Antwort

0

Ich bin nicht vertraut mit Liferay und Gradle, aber ich habe mit OSGi (Apache Felix) und Maven für eine lange Zeit gearbeitet. Die Fehlermeldung weist darauf hin, dass Ihr Paket das Paket com.liferay.portal.search.elasticsearch.connection verwendet, aber in der Laufzeitumgebung ist kein Paket vorhanden, das dieses Paket exportiert. Das fragliche Paket ist in der ersten in Ihrem Build.gradle genannten Abhängigkeit enthalten, wird jedoch nicht exportiert. Wenn Sie möchten, können Sie das Bündelglas öffnen und in sein manifest.mf schauen, indem Sie es von the maven central repo herunterladen.

Da das Paket nicht exportiert wird (nur com.liferay.portal.search.elasticsearch.settings ist), nehme ich an, es ist ein Signal, dass es nicht für den externen Gebrauch gedacht ist. Also solltest du vielleicht nachsehen, ob es eine andere Möglichkeit gibt, das zu tun, was du willst.

Aus dem Blick auf die Liferay docs für die Verwendung von Drittanbieter-Bibliotheken scheint es, Sie versuchen, die Bibliothek in Ihr Modul zu erweitern. Vielleicht könnten Sie stattdessen die Einbettungsstrategie ausprobieren, wenn Sie noch das .connection Paket verwenden müssen.

1

@gjoranv ist korrekt, nur weil Sie in Ihrem Gradle.build es bedeutet nicht, dass es in Ihrer Umgebung sein wird.

Die ersten Dinge zuerst, ist der Fehler wegen des Fehlens eines verwendeten Pakets, in Java herkömmlichen Sinne. Sie benötigen also ein Modul, das durch eine JAR-Datei repräsentiert wird, die dieses Paket öffentlich macht.

Da liveray ziemlich versionsabhängig ist, wenn es um Elastic Search geht, und sich auf Unfallversionen stützt, könnten Sie ungeschützte Pakete verwenden und die Exposure normalerweise durch ein Uber-Modul erzwingen.

Wenn Sie Glück haben, können Sie auch compileInclude anstelle von compileOnly verwenden. Wenn Sie die Bibliothek auf diese Weise einbinden, wird das möglicherweise zu einem Durcheinander führen, da sie das Glas in Ihr Glas einbetten und alle Pakete freilegen wird.

Eine andere Möglichkeit, die normalerweise weniger aggressiv ist, besteht darin, das Glas einzubetten und den Klassenpfad in Ihr Bündel zu setzen. Um dies zu tun, müssen Sie nur Ihre Abhängigkeit als Kompilieren deklarieren und den Klassenpfad in Ihrer bnd.bnd-Datei hinzufügen. (es klingt härter als es ist, sollte es ein trivialer Prozess sein)

Ein weiteres Problem im Auge zu behalten ist die Ausrichtung mit Ihrem ElasticSearch und Sie liveray Bereitstellung: 2.2-2.4.x, aber das ist nur, weil Sie in fallen könnten Klassenkonvertierungsausnahmen und API-Abweichungen, wenn Ihre Objekte von anderen Bundles verwendet werden oder wenn sie mit einem alten ES interagieren.


Embedding Beispiel:

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 
+0

Ich denke 'compileInclude' im Liferay 7-Umgebung nicht verfügbar ist, oder ich bin falsch? Ich bekomme 'Konnte Methode compileInclude nicht finden. –

+0

Es sollte sein, könnten Sie überprüfen, ob Sie eine aktuelle Version des Arbeitsbereichs verwenden. Sogar der Quellcode von liferay ist voll von diesen. – Victor

+0

buildscript { Abhängigkeiten {Classpath "com.liferay: com.liferay.gradle.plugins.workspace: latest.release"} Repositories {Maven {url „https://cdn.lfrs.sl/repository.liferay. com/nexus/content/groups/public "}} } – Victor

Verwandte Themen