Liferay — Использование сторонней библиотеки не работает

Я новичок в Liferay. Для моего первого проекта мне нужно создать модуль, который использует стороннюю библиотеку. Эта библиотека была разработана университетом и используется не очень часто, поэтому ее нет ни в одном репозитории maven или что-то в этом роде. Поэтому я скопировал его в свой проект Liferay и пытаюсь понять, как решить проблемы с зависимостями. Я прочитал бесчисленное количество тем и блогов, но я все еще немного запутался.

Я надеюсь, что кто-то может указать мне правильное направление, чтобы решить мою проблему.

build.gradle модуля

dependencies {
    compileOnly group: "com.liferay.portal", name: "com.liferay.portal.kernel", version: "2.0.0"
    compileOnly group: "com.liferay.portal", name: "com.liferay.util.taglib", version: "2.0.0"
    compileOnly group: "javax.portlet", name: "portlet-api", version: "2.0"
    compileOnly group: "javax.servlet", name: "javax.servlet-api", version: "3.0.1"
    compileOnly group: "jstl", name: "jstl", version: "1.2"
    compileOnly group: "org.osgi", name: "osgi.cmpn", version: "6.0.0"
    compile files('lib/openBIS-API-V3-16.05.7-r1522065804.jar')
} 

settings.gradle

buildscript {
    dependencies {
        classpath group: "com.liferay", name: "com.liferay.gradle.plugins.workspace", version: "1.5.0"
        classpath group: "net.saliman", name: "gradle-properties-plugin", version: "1.4.6"
    }

    repositories {
        maven {
            url "https://cdn.lfrs.sl/repository.liferay.com/nexus/content/groups/public"
        }
    }
}

apply plugin: "net.saliman.properties"

apply plugin: "com.liferay.workspace"

bnd.bnd

Bundle-Name: my-dbdisplayer-project
Bundle-SymbolicName: de.mpi.prototype.dbdisplayer
Bundle-Version: 1.0.0
Export-Package: \
    de.mpi.prototype.dbdisplayer.constants,\
Conditional-Package: \
    ch.*
Bundle-Classpath:\
    .,\
    lib/openBIS-API-V3-16.05.7-r1522065804.jar
-includeresource:\
    lib/openBIS-API-V3-16.05.7-r1522065804.jar

Вывод терминала при развертывании модуля с помощью blade deploy

BUILD SUCCESSFUL

Total time: 1.768 secs
stop 505
update 505 file:/home/liferay/MPI/liferay-prototype/modules/my-dbdisplayer-project/build/libs/de.mpi.prototype.dbdisplayer-1.0.0.jar
start 505
org.osgi.framework.BundleException: Could not resolve module: de.mpi.prototype.dbdisplayer [505]
  Unresolved requirement: Import-Package: ch.ethz.sis.openbis.generic.asapi.v3
Updated bundle 505

person EyedPeas    schedule 15.05.2018    source источник
comment
начать с Unresolved requirement: Import-Package: ch.ethz.sis.openbis.generic.asapi.v3 Это в вашем пути к классам, где-нибудь в зависимостях, особенно в их экспорте? Кроме того, прочитайте meta.stackexchange.com/questions/141823/ и действовать соответственно   -  person Olaf Kock    schedule 15.05.2018
comment
Импортный пакет: *   -  person Victor    schedule 16.05.2018
comment
Извините, я не знал о кросспостинге. @OlafKock Файл .jar находится в папке на том же уровне, что и исходная папка проекта.   -  person EyedPeas    schedule 16.05.2018
comment
@Victor К сожалению, это ничего не изменило..   -  person EyedPeas    schedule 16.05.2018
comment
Думали ли вы о создании пакета uber для него?   -  person Victor    schedule 16.05.2018


Ответы (3)


Вместо того, чтобы использовать -includeresource и настраивать Bundle-ClassPath самостоятельно, рассмотрите возможность использования конфигурации compileInclude в своем gradle.properties.

Как многие указывали, вам, вероятно, также потребуется предоставить библиотеку, содержащую пакет ch.ethz.sis.openbis.generic.asapi.v3. Вы, вероятно, не хотите/не можете предоставлять его как модуль и хотите включить его в свой пакет, так же, как вы включаете openBIS-API.jar. Это будет что-то вроде этого:

compileInclude files('lib/openBIS-API-V3-16.05.7-r1522065804.jar')
compileInclude files('lib/openBIS-asapi.jar')

или даже:

compileInclude fileTree(dir: 'lib', include: '*.jar')

Конечно, вам нужен другой openBIS-asapi.jar, содержащий недостающий пакет. Если этого пакета нигде нет, возможно, вы могли бы поместить это в свой bnd.bnd:

Import-Package: *;resolution:=optional

ИЗМЕНИТЬ

Я только что нашел в http://svnsis.ethz.ch/repos/cisd/openbis_api/trunk, что пакет уже есть в openbis_api, но у него много зависимостей. Видеть:

compileInclude должен скопировать и настроить все зависимости для вас, но я предвижу больше проблем с загрузкой классов...

ИЗМЕНИТЬ 2

Эти две записи в блоге Дейва Небингера объясняют, как использовать зависимости в модулях Liferay.

Кстати, во второй записи в блоге я нашел кое-что, что кажется неправильным. Там написано, что пакеты, используемые вашим кодом Java из зависимости compileOnly, не будут перечислены как записи манифеста Import-Package, но у меня есть проект с зависимостью compileOnly, для которого была создана указанная запись.

person AdrianRM    schedule 13.12.2018
comment
После 3 часов поиска, compileInclude был единственным, что мне нужно было сделать. Спасибо большое. - person Amine; 20.03.2019

Ваш комплект импортирует пакет ch.ethz.sis.openbis.generic.asapi.v3. Это связано с тем, что этот пакет является зависимостью кода внутри пакета.

Вам необходимо установить пакет, который экспортирует пакет ch.ethz.sis.openbis.generic.asapi.v3.

person Neil Bartlett    schedule 16.05.2018
comment
Я понимаю, как это будет работать, если я напишу несколько классов, экспортирую их, а затем импортирую в другой модуль. Как это будет работать, если я хочу экспортировать нужную мне библиотеку? - person EyedPeas; 17.05.2018
comment
Похоже, что пакет ch.ethz.sis.openbis.generic.asapi.v3 является частью библиотеки. Вы должны были скомпилировать свой пакет, используя эту библиотеку в пути к классам, поэтому найдите этот файл JAR. Если этот JAR уже является пакетом, отлично, просто разверните его в OSGi. В противном случае вам, возможно, придется обернуть библиотеку как пакет, чтобы заставить это работать. - person Neil Bartlett; 17.05.2018

Я оставлю для вас пример uber jar с несколькими библиотеками внутри.

В бнд.бнд

Bundle-RequiredExecutionEnvironment: JavaSE-1.8

Import-Package: *

Export-Package: javax.mail.*;version=1.5.6,\
                javax.activation; version=1.1.1,\
                com.sun.activation.*; version=1.1.1,\
                com.sun.mail.*;version=1.5.6


-snapshot: ${tstamp}
-dsannotations: *
-check: all

-includeresource: lib/activation.jar=activation-1.1.1.jar,\
                 lib/javax.mail.jar=javax.mail-1.5.6.jar,\
                 lib/javax.mail-api.jar=javax.mail-api-1.5.6.jar

Bundle-ClassPath: ., lib/activation.jar, lib/javax.mail-api.jar, lib/javax.mail.jar
person Victor    schedule 22.05.2018