Как включить файл ресурсов в пакет osgi из зависимости jar с помощью bnd/maven-bundle-plugin?

Я использую maven-bundle-plugin (эффективно bnd).

Включить файл ресурсов из источников несложно.

Например, файл ресурсов (src/main/resources/some.xml) перемещается в каталог target (target/classes/some.xml) во время сборки и может быть включен в комплект с помощью инструкции <Include-Resource>:

<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <version>3.0.1</version>
    <extensions>true</extensions>
    <configuration>
        <instructions>
            <Include-Resource>
                some.xml=target/classes/some.xml,
            </Include-Resource>
        </instructions>
    </configuration>
</plugin>

Пусть у нас есть зависимость:

<dependency>
    <groupId>com.example</groupId>
    <artifactId>library</artifactId>
    <version>1.0.0</version>
</dependency>

Как сослаться на файл ресурсов внутри зависимого jar?

Другими словами, как

  • указать что-то вроде этого:

    com.example:library:1.0.0:jar/some.xml
    
  • вместо этого:

    target/classes/some.xml
    

чтобы ресурс из одной из зависимостей появился в выходном пакете jar?


person uvsmtid    schedule 24.05.2016    source источник
comment
Я не понимаю вопроса. Вы спрашиваете, как ссылаться на some.xml во время выполнения из кода внутри пакета?   -  person BJ Hargrave    schedule 24.05.2016
comment
Я просто хочу упаковать пакет jar с some.xml, взятым из другой (зависимости) jar. В конечном счете, на него будет ссылаться код, но прежде чем на него можно будет ссылаться в коде, он должен быть упакован в выходной файл jar.   -  person uvsmtid    schedule 24.05.2016


Ответы (2)


Вы можете использовать maven-dependency-plugin, чтобы распаковать банку зависимостей, а затем включить ресурс в банку.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>unpack-dependencies</id>
            <phase>generate-resources</phase>
            <goals>
                <goal>unpack</goal>
            </goals>
            <configuration>
                <markersDirectory>${project.build.directory}/dependencies/dependency-maven-plugin-markers</markersDirectory>
                <artifactItems>
                    <artifactItem>
                        <groupId>DEPENDENCY_GROUPID</groupId>
                        <artifactId>DEPENDENCY_ARTIFACTID</artifactId>
                        <type>OPTIONAL_DEPENCENCY_TYPE</type>
                        <outputDirectory>${project.build.directory}/dependencies/DEPENDENCY_ARTIFACTID</outputDirectory>
                    </artifactItem>
                </artifactItems>
            </configuration>
        </execution>
    </executions>
</plugin>
...
<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <configuration>
        ...
        <instructions>
            ...
            <Include-Resource>target/dependencies/DEPENDENCY_ARTIFACTID/some.xml</Bundle-Activator>
        </instructions>
    </configuration>
</plugin>

Предполагается, что инструкции Include-Resource относятся к pom, см. Include-Resource, вероятно, вы можете заменить targetна ${project.build.directory}.

person Alexandre Cartapanis    schedule 24.05.2016
comment
Честно говоря, я ожидал, что от maven-bundle-plugin/bnd может быть трюк, чтобы выбрать ресурсы для перемещения в выходной пакет jar аналогично тому, как это делает плагин, когда инструкция Private-Package указана с пакетами (и эти пакеты становятся частью выходного пакета jar). Тем не менее, этот ответ прост и обходит стороной, отсекая некоторые обязанности от сложности maven-bundle-plugin. - person uvsmtid; 24.05.2016

Если у вас есть ссылка на файл jar, вы можете сделать

-includeresource: @path/to/file.jar!/some.xml

Вы используете префикс @, чтобы сказать, что ресурс находится в банке, и синтаксис !/ из URL-адресов банки.

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

person BJ Hargrave    schedule 24.05.2016
comment
Конечно. Я не знаю, как надежно сослаться на копию файла jar, который указан как зависимость Maven. Итак, ответ с maven-dependency-plugin был приемлемым и решил проблему на данный момент. Тем не менее, мне может понадобиться и ваша информация - голосование. Спасибо! - person uvsmtid; 26.05.2016
comment
Для получения дополнительной информации вы можете получить путь к банке с помощью (я думаю, недокументированного) макроса repo, например: -includeresource: @${repo;org.apache.felix.http;latest}!/META-INF/LICENSE Вы даже можете делать такие вещи (но не в проекте cnf, поскольку я думаю, репозитории еще не определены ): -include: jar:${fileuri;${repo;bsn;version}}!/resource.properties - person Elias Vasylenko; 05.01.2017
comment
Этот вопрос касается сборки maven, поэтому у них нет рабочей области bnd, и поэтому маловероятно, что какие-либо репозитории настроены для использования макроса репо. - person BJ Hargrave; 05.01.2017
comment
О, дорогой, ты прав! Я только что пришел из Google со своей немного связанной проблемой, не понимая контекста должным образом. Ну, надеюсь, кому-нибудь все-таки поможет. - person Elias Vasylenko; 24.03.2017