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

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

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

start at Unresolved requirement: Import-Package: ch.ethz.sis.openbis.generic.asapi.v3 Это в вашем пути к классам, где-нибудь в зависимостях, особенно в их экспорте? Кроме того, прочтите meta.stackexchange.com/questions/141823/… и действуйте соответственно

Olaf Kock 15.05.2018 18:17

Импорт-пакет: *

Victor 15.05.2018 23:27

Извините, я не знал о кросс-постинге. @OlafKock Файл .jar находится в папке на том же уровне, что и исходная папка проекта.

EyedPeas 16.05.2018 10:14

@Victor К сожалению, это ничего не изменило ..

EyedPeas 16.05.2018 10:16

Думали ли вы о создании для него uber-пакета?

Victor 16.05.2018 16:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
5
1 068
3

Ответы 3

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

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

Я понимаю, как это будет работать, если я напишу несколько классов, экспортировал их, а затем импортировал в другой модуль. Как это будет работать, если я хочу экспортировать нужную библиотеку?

EyedPeas 17.05.2018 13:39

Похоже, пакет ch.ethz.sis.openbis.generic.asapi.v3 является частью библиотеки. Вы должны были скомпилировать свой пакет, используя эту библиотеку в пути к классам, поэтому найдите этот файл JAR. Если этот JAR уже является пакетом, тогда отлично, просто разверните его в OSGi. В противном случае вам, возможно, придется обернуть библиотеку в виде пакета, чтобы это работало.

Neil Bartlett 17.05.2018 16:50

Я оставлю вам здесь пример 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 было единственным, что мне нужно было сделать. Огромное спасибо.

Amine 20.03.2019 01:02

Другие вопросы по теме