如何使用 bnd/maven-bundle-plugin 从 jar 依赖项将资源文件包含到 osgi 包中?

Posted

技术标签:

【中文标题】如何使用 bnd/maven-bundle-plugin 从 jar 依赖项将资源文件包含到 osgi 包中?【英文标题】:How to include resource file into osgi bundle from jar dependency with bnd/maven-bundle-plugin? 【发布时间】:2016-09-21 02:26:12 【问题描述】:

我正在使用maven-bundle-pluginbnd 有效)。

从源中包含资源文件很简单。

例如,资源文件 (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

【问题讨论】:

我不明白这个问题。您是在问如何在运行时从包内的代码中引用 some.xml? 我只想将捆绑包jarsome.xml 从另一个(依赖项)jar 内部获取。最终,这将被代码引用,但在被代码引用之前,它应该被打包成输出jar 【参考方案1】:

您可以使用 maven-dependency-plugin 解压缩您的依赖项 jar,然后将资源包含在您的 jar 中。

<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

【讨论】:

老实说,我预计 maven-bundle-plugin/bnd 可能会有一个技巧来选择要移动到输出包中的资源 jar 类似于插件在使用包指定 Private-Package 指令时所做的那样(并且这些包成为输出包jar 的一部分)。然而,这个答案是直截了当的,并且通过从maven-bundle-plugin 的复杂性中删除一些责任来绕过。【参考方案2】:

如果你有对 jar 的文件引用,你可以这样做

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

您使用 @ 前缀表示资源在 jar 中,并使用 jar url 中的 !/ 语法。

棘手的部分是从我怀疑的项目依赖项中获取 jar 的路径。

【讨论】:

确实如此。我不知道如何可靠地引用被列为 Maven 依赖项的 jar 文件的副本。因此,maven-dependency-plugin 的答案是可以接受的,并暂时解决了问题。但是,我可能也需要你的信息——点赞。谢谢! 有关更多信息,您可以使用(我认为未记录的)repo 宏获取 jar 的路径,例如:-includeresource: @$repo;org.apache.felix.http;latest!/META-INF/LICENSE 您甚至可以这样做(但不能在 cnf项目,我猜 repos 还没有定义):-include: jar:$fileuri;$repo;bsn;version!/resource.properties 这个问题是关于一个 maven 构建的,所以它们不是 bnd 工作区,因此不太可能为 repo 宏配置任何 repos。 天哪,没错!我刚从谷歌来,遇到了一些稍微相关的问题,但没有正确理解上下文。好吧,希望它同样能帮助别人。

以上是关于如何使用 bnd/maven-bundle-plugin 从 jar 依赖项将资源文件包含到 osgi 包中?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?

WSARecv 如何使用 lpOverlapped?如何手动发出事件信号?