2016-05-24 10 views
1

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

Прямо включить файл ресурсов из источников.

Например, файл ресурса (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?

+0

Я не понимаю вопроса. Вы спрашиваете, как ссылаться на some.xml во время выполнения из кода внутри пакета? –

+0

Я просто хочу упаковать пакет 'jar' с' some.xml', взятый из другого (зависимого) 'jar'. В конечном счете на это будет ссылаться код, но прежде чем на него можно ссылаться по коду, он должен быть упакован в выходной файл 'jar'. – uvsmtid

ответ

1

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

<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 В инструкции должно быть П родственника, см Include-Resource, вы, вероятно, можете заменить target с ${project.build.directory}.

+0

Честно говоря, я ожидал, что из 'maven-bundle-plugin' /' bnd' может быть трюк, чтобы выбрать ресурсы, которые нужно переместить в выходной пакет 'jar', так же, как плагин, когда инструкция' Private-Package' указана с пакетами (и эти пакеты становятся частью выходного пакета 'jar'). Тем не менее, этот ответ прост и обходит, отсекая некоторые обязанности из-за сложности «maven-bundle-plugin». – uvsmtid

2

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

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

используется префикс @ сказать ресурс в банке и !/ синтаксис из баночки URLs.

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

+0

Действительно. Я не знаю, как надежно ссылаться на копию файла 'jar', который указан как зависимость от Maven.Таким образом, ответ с 'maven-dependency-plugin' был приемлемым и на данный момент исправил проблему. Тем не менее, мне может понадобиться и ваша информация - аванпость. Благодаря! – uvsmtid

+0

Для получения дополнительной информации вы можете получить путь к банке с помощью макроса 'repo' (я думаю, недокументированного), например: ' -includeresource: @ $ {repo; org.apache.felix.http; latest}!/META -INF/LICENSE' Вы можете даже делать такие вещи (но не в проекте cnf, так как я думаю, что репозитории еще не определены): '-ключить: jar: $ {fileuri; $ {repo; bsn; version}}!/resource.properties' –

+0

Этот вопрос касается сборки maven, поэтому их нет рабочей области bnd, поэтому маловероятно, что любые репозитории будут настроены для использования макроса репо. –