Могу ли я поместить сторонние банки в karaf (любую конкретную папку) для разрешения транзитивных зависимостей?

У меня есть несколько самодельных проектов, которые имеют зависимости от сторонних библиотек. Я объединяю их для контейнера OSGI, но не могу разрешить глубокие зависимости в моих проектах. Сейчас я ищу папку karaf, в которую я могу поместить свои библиотеки, чтобы пакеты могли напрямую обращаться к ним, а не устанавливать их.

Более того, я использую Maven тоже.

РЕДАКТИРОВАТЬ: После выполнения вашего "функционального" решения я могу создавать манифестирующие транзитивные зависимости, но проблема в том, что теперь он также ищет очень распространенные java-файлы: например: ниже приведен список довольно больших зависимостей:

bsh -- Cannot be resolved
com.fasterxml.jackson.annotation -- Cannot be resolved
com.fasterxml.jackson.core -- Cannot be resolved
com.fasterxml.jackson.databind -- Cannot be resolved
com.fasterxml.jackson.databind.annotation -- Cannot be resolved
com.fasterxml.jackson.databind.module -- Cannot be resolved
com.gargoylesoftware.htmlunit -- Cannot be resolved
com.gargoylesoftware.htmlunit.util -- Cannot be resolved
com.google.protobuf -- Cannot be resolved
com.ibm.uvm.tools -- Cannot be resolved
com.ibm.websphere.uow -- Cannot be resolved
com.ibm.wsspi.uow -- Cannot be resolved
com.jamonapi -- Cannot be resolved
com.jamonapi.utils -- Cannot be resolved
com.jayway.jsonpath -- Cannot be resolved
com.jcraft.jzlib -- Cannot be resolved
com.mysema.query.types -- Cannot be resolved
com.sun.javadoc -- Cannot be resolved and overwritten by Boot Delegation
com.sun.jdmk.comm -- Cannot be resolved and overwritten by Boot Delegation
com.sun.net.httpserver -- Cannot be resolved and overwritten by Boot Delegation
com.sun.tools.javadoc -- Cannot be resolved and overwritten by Boot Delegation
com.sun.xml.fastinfoset.sax -- Cannot be resolved and overwritten by Boot Delegation
com.sun.xml.fastinfoset.stax -- Cannot be resolved and overwritten by Boot Delegation
com.typesafe.config -- Cannot be resolved
groovy.lang -- Cannot be resolved
groovy.xml -- Cannot be resolved
javassist -- Cannot be resolved
javax.activation from org.apache.felix.framework (0)
javax.annotation from org.apache.felix.framework (0)
javax.crypto from org.apache.felix.framework (0)
javax.crypto.spec from org.apache.felix.framework (0)
javax.ejb -- Cannot be resolved
javax.el -- Cannot be resolved
javax.enterprise.concurrent -- Cannot be resolved
javax.enterprise.context -- Cannot be resolved
javax.enterprise.context.spi -- Cannot be resolved
javax.enterprise.event -- Cannot be resolved
javax.enterprise.inject -- Cannot be resolved
javax.enterprise.inject.spi -- Cannot be resolved
javax.enterprise.util -- Cannot be resolved

2 ответа

Решение

Чтобы ответить на ваш вопрос: вы можете поместить все свои пакеты зависимостей в папку $KARAF_HOME/deploy, и Karaf развернет их для вас.

Тем не менее, это не очень удобно, так как это ручной процесс, который не управляется Maven. Вместо этого взгляните на концепцию репозиториев Карафа. Вы можете использовать плагин Karaf maven для создания репозитория объектов для ваших пакетов и их (переходных) зависимостей. Если вам нужно отправить ваше приложение как один артефакт, вы можете использовать тот же плагин для создания архива KAR, который представляет собой zip-файл, содержащий как репозиторий компонентов, так и необходимые зависимости в автономном модуле развертывания.

Для начала поместите файл шаблона feature.xml в src/main/feature:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<features xmlns="http://karaf.apache.org/xmlns/features/v1.3.0" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.3.0 http://karaf.apache.org/xmlns/features/v1.3.0"
        name="My feature">
    <feature name="${project.artifactId}" version="${project.version}" description="Describe feature here">
         <!-- Add "self" to the list of dependencies -->
         <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
    </feature>
</features>

Затем настройте плагин для заполнения шаблона объекта на основе ваших зависимостей maven:

<plugin>
    <groupId>org.apache.karaf.tooling</groupId>
    <artifactId>karaf-maven-plugin</artifactId>
    <configuration>
        <includeTransitiveDependency>true</includeTransitiveDependency>
    </configuration>
    <executions>
        <execution>
            <id>generate-features-descriptor</id>
            <goals>
                <goal>features-generate-descriptor</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Сборка вашего проекта создаст дополнительный артефакт maven вместе с вашим пакетом jar в вашем локальном репозитории maven: xxx-features.xml Вы можете сообщить локальному Karaf о вашем репозитории функций с помощью feature:repo-add команда. Затем добавьте свою функцию с feature:install команда. Это запустит ваш пакет и все его объявленные (транзитивные) зависимости Maven.

РЕДАКТИРОВАТЬ:

Как вы упомянули в комментариях, что некоторые (все?) Ваши зависимости являются обычными JAR-файлами, а не пакетами OSGi, возможно, вам лучше встроить эти не-OSGi-зависимости в ваш собственный пакет с помощью maven-bundle-plugin. Это может быть довольно утомительно, хотя. Большинство JAR-файлов не OSGi имеют импорт пакетов, который либо вообще не используется во время выполнения, либо не используется в вашем конкретном сценарии использования. Чтобы избежать взрыва вашего списка зависимостей OSGi за пределы списка транзитивных зависимостей maven, вам нужно предотвратить добавление этих "унаследованных" пакетов в список импорта пакетов в MANIFEST вашего собственного пакета. Например, у меня есть пакет, который использует библиотеку шаблонов httl, которая снова зависит от Javassist. Также не являются комплекты OSGi. Поэтому я встраиваю оба и подавляю импорт пакетов, объявленных либо в коде httl, либо в коде javassist, но не обязательных во время выполнения:

<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <extensions>true</extensions>
    <configuration>
        <instructions>
            <Embed-Dependency>*;scope=compile|runtime;inline=false;artifactId=httl|javassist</Embed-Dependency>
            <Embed-Transitive>false</Embed-Transitive>
            <Import-Package>
                !com.alibaba.*,
                !com.thoughtworks.*,
                !javassist.*,
                !net.htmlparser.*,
                !org.apache.commons.logging.*,
                !org.codehaus.jackson.*,
                !org.joda.convert.*,
                !com.sun.jdi.*,
                !javax.servlet.*,
                *
            </Import-Package>
        </instructions>
    </configuration>
</plugin>

Если я правильно понимаю ваш вопрос, вы хотите создать свой артефакт, но не включать сторонние библиотеки. Вы пытались установить сторонние библиотеки, в которые вы не хотите входить в комплект поставки?

например

    <dependency>
        <artifactId>commons-logging</artifactId>
        <groupId>commons-logging</groupId>
        <version>[1.0,]</version>
        <scope>provided</scope>
    </dependency>
Другие вопросы по тегам