#maven #osgi
#maven #osgi
Вопрос:
Я использую maven-bundle-plugin для создания плагина osgi из зависимостей, отличных от osgi, и я хочу включить исходный код из этой зависимости в сборку проекта.
Это пример, когда я создаю пакет OSGI из jfreechart, и когда я публикую его, я хочу включить исходные коды jfreechart.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.jfree.chart</groupId>
<artifactId>com.netappsid.org.jfree.chart</artifactId>
<version>1.0.13</version>
<name>JFreeChart OSGI</name>
<packaging>bundle</packaging>
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<Export-Package>org.jfree.chart.*;org.jfree.data.*</Export-Package>
<Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
<Embed-Dependency>jfreechart;inline=true</Embed-Dependency>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>jfree</groupId>
<artifactId>jfreechart</artifactId>
<version>1.0.13</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.jfree</groupId>
<artifactId>com.springsource.org.jfree</artifactId>
<version>1.0.12</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>com.springsource.javax.servlet</artifactId>
<version>2.5.0</version>
</dependency>
</dependencies>
</project>
Комментарии:
1. Используете ли вы IDE? Когда я запускаю Maven для этого POM, я получаю ожидаемый файл JAR, который содержит «META-INF …» и «org jfree …». Поскольку вы также использовали «Встроенную зависимость», я предполагаю, что вы также хотите включить JAR-файл jfreechart, и в этом случае удалите инструкцию «;inline = true», и это сработает.
2. этот pom работает, но я хочу добавить исходный код jfreechart с помощью maven-source-plugin в com.netappsid.org.jfree.chart-1.0.13-sources. jar, когда я его выпущу
3. Извините, я не понимал, что вам нужны фактические исходные файлы. Я не видел исходных файлов jfreechart ни в одном из репозиториев Maven, но вы можете загрузить их напрямую с их веб-сайта и использовать:
<scope>system</scope>
и<systemPath>${project.basedir}/lib/jfree-sources.jar</systemPath>
для зависимости вместе с maven-source-plugin. Я не использовал его раньше, хотя это не помогло бы с этим. Извините за недоразумение.
Ответ №1:
У меня была такая же проблема. Вот что я в итоге сделал:
-
распакуйте исходные тексты с помощью maven-dependency-plugin
<plugin> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>unpack-sources</id> <goals> <goal>unpack</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/sources</outputDirectory> <artifactItems> <artifactItem> <groupId>commons-httpclient</groupId> <artifactId>commons-httpclient</artifactId> <version>3.1</version> <classifier>sources</classifier> </artifactItem> </artifactItems> </configuration> </execution> </executions> </plugin>
-
прикрепите артефакт исходных текстов, созданный с помощью maven-assembly-plugin
<plugin> <artifactId>maven-assembly-plugin</artifactId> <executions> <execution> <id>source-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> <configuration> <descriptors> <descriptor>src.xml</descriptor> </descriptors> </configuration> </execution> </executions> </plugin>
со следующим дескриптором (обратите внимание, что идентификатор дескриптора используется в качестве классификатора; артефакт прикреплен по умолчанию):
<?xml version="1.0"?> <assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> <id>sources</id> <includeBaseDirectory>false</includeBaseDirectory> <formats> <format>jar</format> </formats> <fileSets> <fileSet> <directory>${project.build.directory}/sources</directory> <outputDirectory>/</outputDirectory> <useDefaultExcludes>true</useDefaultExcludes> </fileSet> </fileSets> </assembly>
Ответ №2:
Если я вас правильно понимаю…
Мне пришлось самому упаковывать множество банок без osgi для использования в приложении OSGi. При использовании maven-bundle-plugin
, если вы используете Export-Package
в манифесте (или osgi.bnd
файле), тогда его классы будут включены в созданный пакет.
Пример:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: ACME PostgreSQL Driver Bundle
Bundle-SymbolicName: com.acme.org.postgresql
Bundle-Version: 9.0.801.jdbc4
# NB: I've imported a little too much for what is required.
Import-Package: org.postgresql*;version="9.0-801.jdbc4",
javax*,
org.w3c.dom,
!org.ietf.jgss,
!org.dom.xml.views
Export-Package: org.postgresql*;version="9.0-801.jdbc4"
Private-Package: org.w3c.dom*, org.xml*, javax*
Здесь экспортированные пакеты будут включены в JAR из моих зависимостей Maven в POM.
Если вы также хотите включить JAR зависимостей, то вы можете использовать Embed-Dependency
:
Embed-Dependency: org.postgresql*;version="9.0-801.jdbc4"
Embed-Transitive: true
Если это то, что вы искали?
Тони
Комментарии:
1. Я уже использую maven-bundle-plugin, но когда я выпускаю проект, он не включает исходный код инструкции <Embed-Dependency> в myprojet-1.0.0-sources.jar
2. Все ли ваши другие поля попадают в ваш пакет выпуска, т. Е. Bundle-SymbolicName? Не могли бы вы добавить этот раздел вашего POM к вашему вопросу, пожалуйста, чтобы мы могли его увидеть?