【问题标题】:Build an osgi bundle with inline jar files from maven使用来自 maven 的内联 jar 文件构建 osgi 包
【发布时间】:2019-11-21 12:34:58
【问题描述】:

我在将 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 sn-p

<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>

生成的清单.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>

【问题讨论】:

  • 请发布确切的错误消息/日志和预期的行为。
  • 请发布完整的 pom 文件。
  • 用请求的信息更新了帖子。错误消息突出显示,底部添加了完整的 pom.xml。期望在 Eclipse 问题视图中没有错误消息,并且在运行时没有 class-not-found 错误。并且有像清单 target/dependency/parquet-column-1.10.0.jar 中指定的 jar 文件。但是那个目录是空的。

标签: java osgi maven-bundle-plugin


【解决方案1】:

首先确定哪些传递依赖是 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 运行时依赖项的每个包。排除不需要的包。

【讨论】:

    【解决方案2】:

    好的,我发现了一部分。 maven 的目标是 dependency:copy-dependencies 复制依赖项。 :视线: 现在该文件夹包含 jar 文件....

    【讨论】:

      猜你喜欢
      • 2013-01-04
      • 2019-11-22
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-12
      • 2016-07-20
      相关资源
      最近更新 更多