[英]How to include a jar of dependency in an OSGi bundle using maven bundle plugin?
[英]Build an osgi bundle with inline jar files from maven
我在将 maven jar 文件添加到 osgi 包时遇到了多个问题,但让我们从最重要的开始:我想在 osgi 包中包含所有相关的 jar 文件。
我知道这并不理想,但请耐心等待。
所以我的 pom.xml 列出了所有的依赖,都可以在 Eclipse 中编译。 当我使用目标 bundle:manifest 运行 maven 时,会创建一个清单文件,正确列出导入包。 但是大多数包都被错误地提示“没有可用的包导出”。
许多行之一的确切错误消息是: No available bundle exports package 'org.apache.commons.pool.impl'
明白了,它没有依赖包。 当然。 但它应该使用来自 maven 的 jar 文件。 并将 jar 文件复制到 ${project.home}/target 目录中。 但是 mvn install 不会在目标/依赖目录中添加任何内容。 还是空的。
我现在已经尝试了 5 个小时的多种方法,但无法使其正常工作。
任何提示任何人?
pom.xml 片段
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>4.2.0</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Import-Package>
*
</Import-Package>
<Export-Package>
</Export-Package>
<Bundle-Activator>
io.rtdi.sdiadapter.parquetadapter.Activator
</Bundle-Activator>
<Embed-Dependency>*;scope=compile|runtime</Embed-Dependency>
<Embed-Directory>target/dependency</Embed-Directory>
</instructions>
<manifestLocation>${project.basedir}/META-INF</manifestLocation>
</configuration>
</plugin>
生成的 manifest.mf
Manifest-Version: 1.0
Bnd-LastModified: 1562870469538
Build-Jdk: 1.8.0_212
Built-By: wdaehn
Bundle-Activator: io.rtdi.sdiadapter.parquetadapter.Activator
Bundle-ClassPath: .,target/dependency/parquet-column-1.10.0.jar,target/d
ependency/hadoop-client-3.2.0.jar,target/dependency/parquet-hadoop-1.10
.0.jar
Bundle-ManifestVersion: 2
Bundle-Name: ParquetAdapter
Bundle-SymbolicName: ParquetAdapter
Bundle-Version: 0.0.1.SNAPSHOT
Created-By: Apache Maven Bundle Plugin
Embed-Dependency: *;scope=compile|runtime
Embed-Directory: target/dependency
Embedded-Artifacts: target/dependency/parquet-column-1.10.0.jar;g="org.a
pache.parquet";a="parquet-column";v="1.10.0",target/dependency/hadoop-c
lient-3.2.0.jar;g="org.apache.hadoop";a="hadoop-client";v="3.2.0",targe
t/dependency/parquet-hadoop-1.10.0.jar;g="org.apache.parquet";a="parque
t-hadoop";v="1.10.0"
Import-Package: com.sap.hana.dp.adapter.sdk,com.sap.hana.dp.adapter.sdk.
parser,org.apache.commons.codec.binary;version="[1.10,2)",org.apache.co
mmons.pool;version="[1.6,2)",org.apache.commons.pool.impl;version="[1.6
,2)",org.apache.hadoop.classification,org.apache.hadoop.conf,org.apache
.hadoop.fs,org.apache.hadoop.io,org.apache.hadoop.io.compress,org.apach
e.hadoop.mapred,org.apache.hadoop.mapreduce,org.apache.hadoop.mapreduce
.counters,org.apache.hadoop.mapreduce.lib.input,org.apache.hadoop.mapre
duce.lib.map,org.apache.hadoop.mapreduce.lib.output,org.apache.hadoop.m
apreduce.task,org.apache.hadoop.util,org.apache.log4j;version="[1.2,2)"
,org.apache.parquet.bytes,org.apache.parquet.compression,org.apache.par
quet.format,org.codehaus.jackson;version="[1.9,2)",org.codehaus.jackson
.map;version="[1.9,2)",org.osgi.framework,org.slf4j;version="[1.7,2)",o
rg.xerial.snappy;version="[1.1,2)"
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.8))"
Tool: Bnd-4.2.0.201903051501
完整的pom:
<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>ParquetAdapter</groupId>
<artifactId>ParquetAdapter</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>bundle</packaging>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>4.2.0</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Import-Package>
*
</Import-Package>
<Export-Package>
</Export-Package>
<Bundle-Activator>
io.rtdi.sdiadapter.parquetadapter.Activator
</Bundle-Activator>
<Embed-Dependency>*;scope=compile|runtime</Embed-Dependency>
<Embed-Directory>target/dependency</Embed-Directory>
<Embed-Transitive>true</Embed-Transitive>
</instructions>
<manifestLocation>${project.basedir}/META-INF</manifestLocation>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.apache.parquet</groupId>
<artifactId>parquet-column</artifactId>
<version>1.10.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.parquet</groupId>
<artifactId>parquet-hadoop</artifactId>
<version>1.10.0</version>
</dependency>
</dependencies>
</project>
首先确定哪些传递依赖是 OSGi 包。 将它们添加为作用域运行时的显式依赖项,但将它们排除在 Embed-Dependency 指令中。
3 非 OSGi 依赖项应具有“提供”的范围,因此仅在构建期间考虑它们。 确保使用 Embed-Dependency 和 Embed-Transitive 指令将它们及其所有非 OSGi 依赖项添加到包中(检查生成的包 JAR 文件)。
您可能不需要使用 dependency:copy-dependencies 复制它们,因为它们可以通过这个包获得。
只需复制此包及其 OSGi 运行时依赖项。
确保应用程序中任何其他包所需的嵌入式 JAR 的每个包都被导出(目前,Export-Package 指令是空的,我不清楚哪个包正在寻找“org.apache.commons.pool”。 impl”包)。
确保使用 Import-Package 指令导入嵌入式 JAR 所需的 OSGi 运行时依赖项的每个包。 排除不需要的包。
好的,我发现了一部分。 maven 的目标是 dependency:copy-dependencies 来复制依赖。 :sight: 现在该文件夹包含 jar 文件....
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.