Я новичок в 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
Вывод терминала при развертывании модуля с лезвие развернуть
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
Импорт-пакет: *
Извините, я не знал о кросс-постинге. @OlafKock Файл .jar находится в папке на том же уровне, что и исходная папка проекта.
@Victor К сожалению, это ничего не изменило ..
Думали ли вы о создании для него uber-пакета?
Ваш комплект импортирует пакет ch.ethz.sis.openbis.generic.asapi.v3
. Это потому, что этот пакет является зависимостью кода внутри пакета.
Вам необходимо установить пакет, который экспортирует пакет ch.ethz.sis.openbis.generic.asapi.v3
.
Я понимаю, как это будет работать, если я напишу несколько классов, экспортировал их, а затем импортировал в другой модуль. Как это будет работать, если я хочу экспортировать нужную библиотеку?
Похоже, пакет ch.ethz.sis.openbis.generic.asapi.v3
является частью библиотеки. Вы должны были скомпилировать свой пакет, используя эту библиотеку в пути к классам, поэтому найдите этот файл JAR. Если этот JAR уже является пакетом, тогда отлично, просто разверните его в OSGi. В противном случае вам, возможно, придется обернуть библиотеку в виде пакета, чтобы это работало.
Я оставлю вам здесь пример uber jar с несколькими библиотеками внутри.
В bnd.bnd
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
Вместо того, чтобы использовать -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
, для которого была создана указанная запись.
После 3 часов поиска compileInclude было единственным, что мне нужно было сделать. Огромное спасибо.
start at
Unresolved requirement: Import-Package: ch.ethz.sis.openbis.generic.asapi.v3
Это в вашем пути к классам, где-нибудь в зависимостях, особенно в их экспорте? Кроме того, прочтите meta.stackexchange.com/questions/141823/… и действуйте соответственно