【问题标题】:How to update a bundle from Maven artifact with running Apache Felix如何使用运行 Apache Felix 从 Maven 工件更新包
【发布时间】:2018-09-07 22:50:26
【问题描述】:

目前我有一种情况,我开发了一个项目,然后运行 ​​mvn install 并将它作为一个简单的 JAR 文件放入我的本地 Maven 存储库中

然后,我有一个由其他人制作的“环境”,其中包括很多捆绑包和东西,最终通过mvn pax:run 运行,运行大约需要 5 分钟

我希望能够只运行 felix:update <bundle-name>,但我无法填补本地 Maven 存储库中的 Maven JAR 工件和我可以放置在某个地方运行 felix:update 的准备好供应包之间的空白或者其他什么,也许是uninstall/install

当我尝试对我的项目运行 mvn pax:create-bundle 时,它会引发 Containing project does not have packaging type 'pom' 异常

非常感谢任何帮助

更新:我注意到重新安装捆绑包的问题始于它的激活器,带有 ClassNotFoundException(尽管提到的类始终存在于捆绑包中,因此它必须与类路径、类加载器设置或其他问题有关)

at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation BundleWiringImpl.java:1574 at org.apache.felix.framework.BundleWiringImpl.access$400 BundleWiringImpl.java:79 at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass BundleWiringImpl.java:2018 at java.lang.ClassLoader.loadClass ClassLoader.java:357 at some.external.adapters.package.guice.SomeModule.configure SomeModule.java:46 at com.google.inject.AbstractModule.configure AbstractModule.java:59

【问题讨论】:

  • 迄今为止我最接近的是从项目根目录运行mvn bundle:bundle,然后在gogo控制台中:uninstall <bundle id>install file:<path>start <new bundle-id>但是,它没有被正确发布portalCore。我也怀疑为什么osgi_container/bundles/original-bundle-name 根本没有更新(可能是因为它包含在容器启动之前“下载”的包,所以这不是什么大问题,但仍然)跨度>
  • 尝试启动一个包会导致一种错误 ` 15:35:08.375 [DEBUG] [NO_AUTH:NO_SESSION] [Gogo shell] roafbactivator.SomeActivator - 为 SOME 配置 servlet 支持 Guice 模块-External-Ad apter 15:35:08.397 [ERROR] [NO_AUTH:NO_SESSION] [Gogo shell] roafbactivator.SomeActivator - 捆绑 SOME-External-Adapter。未能启动。 java.lang.No ClassDefFoundError 由 java.lang.ClassNotFoundException (some.external.adapters.package.service.callback.SomeReplyReceiver not found by SOME-External-Adapter [150 ]) at ...`
  • 在 org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation BundleWiringImpl.java:1574 在 org.apache.felix.framework.BundleWiringImpl.access$400 BundleWiringImpl.java:79 在 org.apache.felix。 framework.BundleWiringImpl$BundleClassLoader.loadClass BundleWiringImpl.java:2018 at java.lang.ClassLoader.loadClass ClassLoader.java:357 at some.external.adapters.package.guice.SomeModule.configure SomeModule.java:46 at com.google.inject .AbstractModule.configure AbstractModule.java:59
  • 再次尝试重新安装捆绑包导致重新注册捆绑包时出现“地址已在使用中”错误。所以,没有 ClassNotFound 问题。不过需要更多调查
  • 如果您有重要的附加信息,请勿将其发布在格式无法处理的 cmets 中。请编辑原始问题以添加信息。

标签: maven osgi apache-felix osgi-bundle pax-runner


【解决方案1】:

我很高兴接受@neil-bartlett 的回答,但我必须添加更多上下文:

1) 我最初遇到的最大问题之一是本地 Maven 存储库中的 JAR 文件与 OSGi 包不同。为了创建包,我必须在mvn install 之后运行mvn bundle:bundle。并且捆绑包是在target/ 文件夹中创建的。

2) 之后,在 GoGo shell 中,我确实可以运行 felix:update <bundle-id> file:C:/Users/blablabla/bundle-SNAPSHOT-2.0.jar,并且由于某些原因,现在它可以正常工作。原始帖子更新中提到的异常确实正在发生,但它们不会阻止正确安装更新的捆绑包。

【讨论】:

    【解决方案2】:

    如果你有一个新构建的包文件的路径,你可以从 Gogo shell 更新它,如下所示:

    felix:update <bundleid> file:/path/to/file
    refresh
    

    &lt;bundleid&gt; 是您要更新的捆绑包的数字 ID。需要refresh 命令以防任何捆绑包依赖或从您正在更新的捆绑包中导入包;此命令将导致框架尝试使用新的依赖项重新解析它们。

    【讨论】:

    • 谢谢,我打算发表我自己的答案,但会研究你的食谱,它少了一行
    • 很高兴听到您解决了问题。如果你告诉我你必须做什么,我也许能够确定真正出了什么问题。
    猜你喜欢
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-19
    相关资源
    最近更新 更多