osgi - Karaf 4.1 - 如何在第三方 osgi jar 包中添加 DynamicImport-Package 标签?

标签 osgi classloader shiro apache-karaf karaf

我在 Karaf 4.1 中执行自己的包时遇到问题,我使用 Shiro 来保存用户 session ,但是当我恢复保存的 session 时,出现异常:

Caused by: java.lang.ClassNotFoundException: io.twim.models.User
at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[?:?]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[?:?]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[?:?]
    at org.apache.felix.framework.BundleWiringImpl.doImplicitBootDelegation(BundleWiringImpl.java:1782) ~[?:?]
    at org.apache.felix.framework.BundleWiringImpl.searchDynamicImports(BundleWiringImpl.java:1717) ~[?:?]
    at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1552) ~[?:?]
    at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:79) ~[?:?]

我理解我的情况下的问题,Shiro 正在执行(强制转换)反序列化持久 session 对象,但在 Shiro 的 ClassLoader 中没有我的类 io.twim.models.User。我的 karaf 实例已安装此 bundle :

karaf@twim()> list
START LEVEL 100 , List Threshold: 50
ID │ State  │ Lvl │ Version             │ Name
───┼────────┼─────┼─────────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
51 │ Active │  80 │ 3.1.0               │ DataStax Java Driver for Apache Cassandra - Core
52 │ Active │  80 │ 19.0.0              │ Guava: Google Core Libraries for Java
73 │ Active │  50 │ 2.16.1              │ camel-blueprint
83 │ Active │  80 │ 1.3.0               │ Apache Shiro :: Core
86 │ Active │  80 │ 1.0.0.SNAPSHOT      │ twim-cache :: Distributed cache for TWIM
87 │ Active │  80 │ 1.0.0.SNAPSHOT      │ twim-cassandra :: Implementation Cassandra to TWIM
88 │ Active │  80 │ 1.0.0.SNAPSHOT      │ twim-common :: Bundle utility for all models, utilities, constants
89 │ Active │  80 │ 1.0.0.SNAPSHOT      │ twim-core-model :: Bundle utility for all models used in TWIM
90 │ Active │  80 │ 1.0.0.SNAPSHOT      │ twim-db :: Utilitaries to persitence into TWIM
91 │ Active │  80 │ 1.0.0.SNAPSHOT      │ twim-jaas :: JAAS authentication module for TWIM

我需要在 bundle 83 处添加标签 DynamicImport-Package:

83 │ Active │  80 │ 1.3.0               │ Apache Shiro :: Core

在karaf中执行dynamic-import命令,我已经解决了这个问题:

karaf@twim()> dynamic-import 83

但我想在我的功能安装程序中自动执行此操作,添加此标签DynamicImport-Package:io.twim.models,现在我的 features.xml 如下所示:

<feature name="twim-auth" version="${project.version}">
    <feature>twim-cassandra</feature>
    <bundle>mvn:org.apache.shiro/shiro-core/1.3.0</bundle>

    <bundle>mvn:io.twim/twim-core-model/${project.version}</bundle>
    <bundle>mvn:io.twim/twim-jaas/${project.version}</bundle>
</feature>

如何在 features.xml 中执行此操作?

最佳答案

wrap protocol可用于从 jar 即时构建 osgi 包。您可能可以使用它向现有包添加一些指令,但我从未以这种方式使用过它。尝试这样的事情:

<bundle>wrap:mvn:org.apache.shiro/shiro-core/1.3.0$DynamicImport-Package=io.twim.models</bundle>

关于osgi - Karaf 4.1 - 如何在第三方 osgi jar 包中添加 DynamicImport-Package 标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39071269/

相关文章:

java - 无法使用 Httpclient-osgi-4.5.2。缺少要求

java - 加载.jar资源时使用ClassLoader

java - Apache ·希罗. WebUtils.isWeb(...) 和 WebUtils.isHttp(...) 有什么区别?

java - Eclipse插件: Order of Native Libraries in the "Bundle-NativeCode" Section

java - 在osgi中使用jackson提供程序和cxf(未找到消息正文编写器)

unit-testing - 如何在 Maven 中使用不同的 JAR 进行编译和测试?

java - Apache Shiro 的动态实例级权限

apache-spark - 带有企业安全包的 HDInsight 上的 Zeppelin 笔记本

java - PAX-CDI : how to get reference to BeanManager in bundle without using CDI

java - 在 java web 应用程序中加载 xml 文件