当前位置: 首页 > 知识库问答 >
问题:

osgi包中动态加载类

聂风史
2023-03-14

我有OSGI bundle(比方说A),它依赖于非OSGI库(比方说B)。B正在使用class.ForName加载一个类(库A中的ClassA是库B中的ClassB类型)。我已经包装了库B,使其成为osgi捆绑包,并导入了库A中所需的包,但我无法使用class.forname加载该类。请注意,库B是第三方库,我没有任何控制这一点。

下面是我创建的支持OSGI的库B的清单文件-

manifest-version:1.0
bnd-lastmodified:1420745798993
build-jdk:1.6.0_51
build-by:xyz
bundle-manifestversion:2
bundle-name:dapclient
bundle-name:dapclient
bundle-vendor:dapclient
bundle-vendor:dapclient
bundle-version:1.0.0.snapshot
created-by:Apache实体;version=“2.0.2.8”,com.intuit.xxx.yyy.persistence.utils;version=“2.0.2.8”,com.xxx.platform.yyy.persistence.parser.domain;version=“2.0.2.8”,com.xxx.platform.yyy.persistence.parser.domain;version=“2.0.2.8”,co m.xxx.platform.yyy.persistence.persize.persion=“2.0.2.8”,co 30426-122213

在这个库中,我们使用classpathhelper.forpackage(packageName)加载这个包,其中packageName是“com.xxx.zzz.wi.shared.datacache.model”。ClasspatheHelper是从反射库中使用的。

共有1个答案

微生令
2023-03-14

classForName使用“当前类的定义类加载器”,因此您可能必须在A和B中导入包才能实现这一工作。所以一般来说,ClassA必须在一个单独的包中。但是,如果您与lib的耦合非常紧密,那么使用'b'int Bundle a可能会更好。

除此之外,您还可以向B的创建者打开一张票,以允许更通用的类加载,比如提供类本身而不是字符串,支持某种解析器钩子,或者至少使用上下文类加载,在这种情况下,您可以使用类似

Thread thread = Thread.currentThread();
ClassLoader oldLoader = thread.getContextClassLoader();
try {
    thread.setContextClassLoader(getClass().getClassLoader());
    //call lib here that supports context-class-loading
} finally {
    thread.setContextClassLoader(oldLoader);
}
 类似资料:
  • 我如何实现这一点?我尝试将OSGi捆绑包作为JarInputstream读取,并读取捆绑激活器完全限定的类路径,并尝试使用class.forName(“”)和转换到BundleActivator接口的类型来实例化它。但是在启动它的同时,它将bundle上下文作为参数来启动方法。 有没有办法,我可以把OSGi包实用地交给容器,这样它就会负责安装和启动包,然后我的UI就会自动在显示中获取这个新的包名。

  • 问题内容: 是否可以在运行时加载特定的程序包?我想要一种插件,每个插件具有与其他插件相同的功能,但行为不同,并根据配置文件加载一个或另一个。 问题答案: 您可能会考虑在运行时执行“插件”程序包,方法是编写一个新程序(例如到temp目录),然后通过exec.Command执行,类似于 您将在此处看到一些类似的代码。

  • 我在JBoss 7.1.1中部署了一个简单的OSGi测试包,并尝试通过以下方式动态实例化Jacorb ORB 我所得到的只是 我已经做了: > 我添加了到我的中,内容如下 我还对类加载器进行了实验,发现ContextClassLoader是。但最后,我不能将其作为非测试代码,因为不能更改为使用特定的类加载器。 那么,为什么我得到这个ClassNotFoundExcema? 提前谢谢 亚历克斯

  • 问题内容: OSGi无法找到我的DLL文件,而且我似乎也找不到原因。 目前,我的包根目录中有DLL文件(),我也尝试将其放在目录中。 有关捆绑商品的清单看起来像这样: 然后在我的JNA界面中,执行loadLibrary(根据文档): 然后在另一个类中,我尝试使用JNA接口 我通过另一个捆绑软件提供了JNA(该捆绑软件输出com.sun.jna和上面导入的其他软件包),但也尝试过使用此处定义的捆绑软

  • 我正在创建一个运行在Eclipse之外的无头OSGI服务器。我使用Jetty作为我的Servlet容器,使用Equinox作为我的OSGI容器。我正在使用包将Jetty添加到OSGi中。如果我从提示符手动启动jetty和org.eclipse.equinox.http.registry,那么它就可以正常运行。但是,我希望这是在无人值守的情况下运行的,所以我需要在OSGi启动时自动(或者至少是编程方

  • 问题内容: 我正在尝试为我的网站创建页面主题功能。我想使用单独的CSS文件在页面上动态加载相应的主题。 我正在使用此代码: 效果很好,但是如果CSS文件未加载,它不会返回任何信息。 加载时,有什么方法可以捕捉吗?也许通过使用ajax? 问题答案: 加载CSS文件(或其任何其他更改)时,Internet Explorer会触发一个事件。其他浏览器不会触发任何事件,因此您将必须手动检查样式表是否已加载