Tag: osgi

在OSGi Bundle中使用JavaCompiler

我正在重构Java应用程序以使用OSGi。 该应用程序的一个function是使用javax.tools.JavaCompiler Java编译。 在原始应用程序中,此过程通过向编译器提供现有类路径来完成,就像这样。 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); String[] options = {“-classpath”, System.getProperty(“java.class.path”)}; DiagnosticListener listener = new DiagnosticListener() {…}; StandardJavaFileManager fileManager = compiler.getStandardFileManager(listener, null, null); Iterable fileObjects = fileManager.getFileObjects(sourceFile); CompilationTask task = compiler.getTask(null, fileManager, listener, Arrays.asList(options), null, fileObjects); task.call(); 但是,这在OSGi包中不起作用,因为类路径不再包含所需的路径。 在重构的OSGi版本的应用程序中,编译器需要访问与上述代码在同一个包中的类,以及来自其他包的类。 如何让编译器知道这些类? 我想到了两种可能的解决方案: 为编译器提供包含上述代码的bundle使用的类加载器,因为它知道所有必需的类。 但是,从我在这里和这里读到的内容来看,这似乎不是一个可行的解决方案。 使用已安装捆绑包的物理位置构建类路径。 我查看了org.osgi.framework.Bundle.getLocation()但我不确定这是否是一个可靠的解决方案。 我得到的路径(至少在Eclipse中部署时)是相对的,我不确定它们是否可以安全地在所有平台和情况下使用。 上面的选项2似乎可能吗? 有更好的解决方案吗?

Log4j2 api在OSGi环境中找不到Log4j2核心

我正在尝试使用log4j2 OSGi包,但似乎log4j2 api在OSGi环境中找不到log4j2核心。 我不断得到以下exception: ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console 我发现在很少的地方讨论了同样的例外,但我仍然无法弄清楚这个问题。 Isuspect我遇到了这个问题,因为log4j2 api无法在log4j2核心的META-INF目录中找到log4j-provider.properties。 有什么线索为什么我得到这个例外,我该如何纠正这个问题? (如果有人有正确的pom文件添加log4j依赖项和捆绑请与我分享) 这些是我使用的依赖项 org.apache.logging.log4j log4j-api 2.2 org.apache.logging.log4j log4j-core 2.2 我使用apache felix作为bundle插件。 发生此错误的原因是log4j2-core的META-INF内部的资源特别是log4j-providoer.properties文件对log4j api不可见。 谢谢!

OSGi Configuration Admin Service的现有实现?

我们正在考虑使用Configuration Admin Service作为主要API来配置基于OSGi的应用程序中的组件。 如果我们可以重用一些现有的实现,那将是很好的,所以我试图调查和评估最流行的实现。 我知道有: Apache Felix配置管理员 (org.apache.felix.cm) Equinox配置管理员 (org.eclipse.equinox.cm) 是否还有其他实现需要考虑? 此外,我无法找到这些实现的任何好文档。 我将主要关注特定于实现的细节。 例如,我想知道不同的实现如何持久保存配置数据(例如,多个属性文件?XML文件?多个XML文件?数据库?,…)。

OSGi容器中的Camel:将InterceptStrategy应用于所有驼峰上下文

我有几个软件包(A,B和C)部署到OSGi容器,每个包含一个CamelContext和一些路由。 我有另一个包(M),带有一个CamelContext ,一个路由(用于收集监控数据)和一个InterceptStrategy bean。 我希望M中的InterceptStrategy bean能够自动应用于容器中的所有其他CamelContext (即A,B和C中的那些),而不必修改其他bundle。 最终,目标是将每个CamelContext数据窃听到M中的路由,而无需对A,B或C进行任何更改以显式路由Exchange 。 这种方法或类似的方法是否可行? 所有CamelContext都是使用Spring XML配置的。 更新:附加上下文 捆绑包A,B和C包含负责处理数据的核心产品。 Bundle M包含一个可选的监控工具,用于测量流经A,B和C的数据的某些参数。目前,添加可选工具需要更改A,B和C中的路由以添加额外的Processor以丰富Exchange与监控数据并在端点之前读取监控数据。 目标是能够将Bundle M放入已经过validation的A,B和C系统; 并使其自动应用于现有路由,而无需修改现有工作包的配置。 只要更改不会导致A,B和C依赖于M来运行(即,ABC必须仍然在没有M的情况下运行),对A,B和C进行修改以支持这一点是可以接受的。 如果有比使用拦截器更好的方法,我对此持开放态度。 主要目标是: 保持A,B和C与M分离(特别是在开发期间) 确保将M与A,B和C集成在一起尽可能简单 允许集成M而无需手动更改A,B或C.

在Osgi中以编程方式注册ServletContainer

我正在开发一个带有OSGI的JAX-RS应用程序,其中资源是动态加载的。 为此,我需要以编程方式注册ServletContainer,然后我可以调用方法ServletContainer.reload(ResourceConfig)。 我正在运行OSGI环境,支持servlet 3.x,使用PAX-WEB 3.0.2和Jersey 2.4。 问题是当我想访问实现Server Sent Event的资源时,Jersey会引发一个不支持异步的错误,因为它在Servlet 2.x中运行。 这里例外: 2013-11-05 00:22:37,675 | WARN | qtp27902282-62 | ServletHandler | pse.jetty.servlet.ServletHandler 492 | 60 – org.eclipse.jetty.aggregate.jetty-all-server – 8.1.9.v20130131 | javax.servlet.ServletException: java.lang.UnsupportedOperationException: Asynchronous processing not supported on Servlet 2.x container. at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:373)[224:org.glassfish.jersey.containers.jersey-container-servlet-core:2.3.1] at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:372)[224:org.glassfish.jersey.containers.jersey-container-servlet-core:2.3.1] at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:335)[224:org.glassfish.jersey.containers.jersey-container-servlet-core:2.3.1] at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:218)[224:org.glassfish.jersey.containers.jersey-container-servlet-core:2.3.1] at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:669)[60:org.eclipse.jetty.aggregate.jetty-all-server:8.1.9.v20130131] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1448)[60:org.eclipse.jetty.aggregate.jetty-all-server:8.1.9.v20130131] at org.ops4j.pax.web.service.internal.WelcomeFilesFilter.doFilter(WelcomeFilesFilter.java:185)[70:org.ops4j.pax.web.pax-web-runtime:3.0.2] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1419)[60:org.eclipse.jetty.aggregate.jetty-all-server:8.1.9.v20130131] […]

将现有java项目转换为osgi包的最佳方法

我们有很多组件,我们想要开始模块化只有少数组件。 想知道在所有这些组件中创建捆绑包的最佳方式(在我的构建环境中)是什么? 我的环境:Java 6,Maven 2.2.1,Hudson 技术:Spring 3.0.5,WebSphere 7,Hibernate 3.2.x和大多数apache commons。 要求 模块化只有少数组件。 其余组件可以导出所有包。 当导入到eclipse中时,我应该能够在构建路径中看到import-packages包作为依赖项(mvn eclipse:eclipse似乎不会这样做)

如何获取Eclipse RCP应用程序的OSGi BundleContext?

我刚刚开始使用Eclipse RCP应用程序,它基本上只是提供的“hello world”示例之一。 当应用程序启动时,我想查看我的命令行参数并根据它们启动一些服务。 我可以在IApplication.start中获取命令行参数: public Object start(IApplicationContext context) { String[] argv = (String[]) context.getArguments().get(IApplicationContext.APPLICATION_ARGS))); } 但是如何获得BundleContext,以便我可以注册服务? 它似乎不在IApplicationContext中。

unit testingOSGi组件

我目前正在考虑“如何设计一个OSGi组件,以便使用jUnit和Mockito等框架轻松编写测试” 。 由于OSGi强化DIP (依赖性倒置原则)并且通常存在注入器方法(例如,设置器),因此模拟捆绑间依赖性非常容易。 但是捆绑内部依赖呢? 例如,看看这个案例 。 现在我想将它带入一个OSGi上下文…我们希望在OSGi平台中提供任何类型的网络协议作为声明服务,并希望编写unit testing来测试直接与之交互的较低网络代码套接字对象。 如果我们将套接字创建重构为一个单独但仍然捆绑的内部POJO (Plain Old Java Object)类,我们应该如何将它注入协议实现? 在unit testing中,我们可以简单地使用setter方法但是谁会在我们的OSGi容器中执行此操作? 对测试类进行子类化并覆盖创建者方法只有在测试类未声明为final时才有效。

访问另一个osgi包中的资源?

我使用eclipse Plug-in项目向导(使用eclipse Helios)创建了两个OSGI包A和B. 在bundle BI的清单文件中添加了bundle A作为依赖项。 此外,我已经在A中导出了包,因此它们对于B是可见的。我还在包A中有一个.properties文件,我希望它对包B可见。在包中的build.properties窗格中,AI指定了: source.. = src/ bin.includes = META-INF/,\ .,\ bundle_A.properties 现在在BI中尝试使用以下命令加载.properties文件: private Properties loadProperties() { Properties properties = new Properties(); InputStream istream = this.getClass().getClassLoader().getResourceAsStream( “bundle_A.properties”); try { properties.load(istream); } catch (IOException e) { logger.error(“Properties file not found!”, e); } return properties; } 但是这会产生一个nullpointerexception(在类路径中找不到该文件)。 是否可以从捆绑包A中导出资源(就像导出包时一样)或以某种方式以另一种方式从B访问A中的文件(从捆绑包B访问捆绑包A的类加载器)?

Spring Boot中是否有可动态加载模块的模式?

我的Spring Boot应用程序具有内容管理系统。 我希望能够动态加载新组件,而无需重启应用程序。 示例组件可以是加载新的video播放器组件或广告组件。 每个组件都可能包含自己的控制器和视图。 推荐的模式是什么,以及什么是帮助处理这个问题的好框架? OSGi是一个选择吗?