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

Apache Felix 上的 OSGi 部署

刘安志
2023-03-14

我已经创建了我的第一个OSGi服务,并试图将其部署到ApacheFelix上。之后,当我查看系统控制台时,我看到服务未激活,出现了一些问题:

org.springframework.ws.client.core,version=[2.1,3) -- Cannot be resolved
org.springframework.ws.soap,version=[2.1,3) -- Cannot be resolved
org.springframework.ws.soap.axiom,version=[2.1,3) -- Cannot be resolved
org.springframework.ws.soap.saaj,version=[2.1,3) -- Cannot be resolved

因此,我查看了哪个jar包含这些包,这是来自spring-ws-core-2.1.2.RELEASE。jar,它也是一个OSGi包。我也部署了这个,但再次出现以下错误消息:

org.springframework.web.servlet,version=[3.1.0, 4.0.0) -- Cannot be resolved

这也是一个依赖项,这次是spring-webmvc-3.2.17.RELEASE.jar。然而问题是,这不是一个OSGi捆绑包,那么我该如何解决这个问题呢?因为它是一个第三方图书馆,所以我想不出多少。

那么,我如何在OSGi容器中使用非捆绑罐呢?我如何自动解析依赖树,而不必手动解析一切?

共有1个答案

易成双
2023-03-14

我创建了osgi-run项目来解决这个问题,即使用Gradle支持的标准Maven依赖解析(而不是OBR,不幸的是,OBR没有得到广泛支持)来解决捆绑包的依赖。

然而,自从几年前Spring项目放弃对OSGi的支持以来,Spring JAR是一场可怕的噩梦。

理论上,使用osgi run,您应该能够通过使用以下gradle文件创建包含spring ws core捆绑包的osgi环境:

plugins {
    id "com.athaydes.osgi-run" version "1.5.1"
}

repositories {
    mavenLocal()
    jcenter()
}

dependencies {
    osgiRuntime 'org.springframework.ws:spring-ws-core:2.1.1.RELEASE'
}

这依赖于pom中的信息是一致的。如果找到任何非捆绑包,它会自动转换为OSGi捆绑包(请参阅包装罐)。

但是,这不起作用...Gradle可以打印spring-ws-core jar的依赖关系层次结构,这是我使用它时得到的:

+--- org.springframework.ws:spring-ws-core:2.1.1.RELEASE
|    +--- org.springframework.ws:spring-xml:2.1.1.RELEASE
|    |    +--- org.springframework:spring-context:3.1.2.RELEASE
|    |    |    +--- org.springframework:spring-aop:3.1.2.RELEASE
|    |    |    |    +--- aopalliance:aopalliance:1.0
|    |    |    |    +--- org.springframework:spring-asm:3.1.2.RELEASE
|    |    |    |    +--- org.springframework:spring-beans:3.1.2.RELEASE
|    |    |    |    |    \--- org.springframework:spring-core:3.1.2.RELEASE
|    |    |    |    |         +--- org.springframework:spring-asm:3.1.2.RELEASE
|    |    |    |    |         \--- commons-logging:commons-logging:1.1.1
|    |    |    |    \--- org.springframework:spring-core:3.1.2.RELEASE (*)
|    |    |    +--- org.springframework:spring-beans:3.1.2.RELEASE (*)
|    |    |    +--- org.springframework:spring-core:3.1.2.RELEASE (*)
|    |    |    +--- org.springframework:spring-expression:3.1.2.RELEASE
|    |    |    |    \--- org.springframework:spring-core:3.1.2.RELEASE (*)
|    |    |    \--- org.springframework:spring-asm:3.1.2.RELEASE
|    |    +--- commons-logging:commons-logging:1.1.1
|    |    +--- org.springframework:spring-core:3.1.2.RELEASE (*)
|    |    \--- org.springframework:spring-beans:3.1.2.RELEASE (*)
|    +--- org.springframework:spring-context:3.1.2.RELEASE (*)
|    +--- org.springframework:spring-aop:3.1.2.RELEASE (*)
|    +--- org.springframework:spring-oxm:3.1.2.RELEASE
|    |    +--- commons-lang:commons-lang:2.5
|    |    +--- org.springframework:spring-beans:3.1.2.RELEASE (*)
|    |    +--- org.springframework:spring-context:3.1.2.RELEASE (*)
|    |    \--- org.springframework:spring-core:3.1.2.RELEASE (*)
|    +--- org.springframework:spring-web:3.1.2.RELEASE
|    |    +--- aopalliance:aopalliance:1.0
|    |    +--- org.springframework:spring-beans:3.1.2.RELEASE (*)
|    |    +--- org.springframework:spring-context:3.1.2.RELEASE (*)
|    |    \--- org.springframework:spring-core:3.1.2.RELEASE (*)
|    +--- org.springframework:spring-webmvc:3.1.2.RELEASE
|    |    +--- org.springframework:spring-asm:3.1.2.RELEASE
|    |    +--- org.springframework:spring-beans:3.1.2.RELEASE (*)
|    |    +--- org.springframework:spring-context:3.1.2.RELEASE (*)
|    |    +--- org.springframework:spring-context-support:3.1.2.RELEASE
|    |    |    +--- org.springframework:spring-beans:3.1.2.RELEASE (*)
|    |    |    +--- org.springframework:spring-context:3.1.2.RELEASE (*)
|    |    |    \--- org.springframework:spring-core:3.1.2.RELEASE (*)
|    |    +--- org.springframework:spring-core:3.1.2.RELEASE (*)
|    |    +--- org.springframework:spring-expression:3.1.2.RELEASE (*)
|    |    \--- org.springframework:spring-web:3.1.2.RELEASE (*)
|    +--- wsdl4j:wsdl4j:1.6.1
|    +--- commons-logging:commons-logging:1.1.1
|    +--- org.springframework:spring-core:3.1.2.RELEASE (*)
|    \--- org.springframework:spring-beans:3.1.2.RELEASE (*)

我认为依赖关系解析中可能存在一些错误,因为根据上面的解析依赖关系图,Spring 2 jars似乎与Spring 3 jars混淆了!但是没有...完全正确。

但无论如何,我在调查后发现了这一点。。。

首先,我注意到Spring AOP没有解析是因为它的< code>org.aopalliance.aop需求。

显然,这应该来自aopAlliance jar(它不是捆绑包,至少不是Maven Central/JCenter中的捆绑包)。

我在Gradle文件中的<code>runOsgi

wrapInstructions {
    printManifests = true
}

再次运行gradle清洁createOsgi,清单被打印出来...它看起来像这样:

--------------------------------- Manifest for aopalliance-1.0.jar ---------------------------------
Manifest-Version: 1.0
Bundle-SymbolicName: aopalliance
Bundle-ManifestVersion: 2
Bnd-LastModified: 1474120107912
Import-Package: org.aopalliance.aop
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.3))"
Tool: Bnd-3.1.0.201512181341
Ant-Version: Apache Ant 1.5.4 
Originally-Created-By: 1.4.2_01-b06 (Sun Microsystems Inc.)
Export-Package: org.aopalliance.aop,org.aopalliance.intercept;uses:="o
 rg.aopalliance.aop"
Bundle-Version: 1.0.0
Bundle-Name: aopalliance
Created-By: 1.8.0_60 (Oracle Corporation)

----------------------------------------------------------------------------------------------------

请注意,有一个正确生成的捆绑版本,但包不会随该版本一起导出...通过添加下面的说明,我们可以强制导出带有版本的软件包:

wrapInstructions {
    printManifests = true
    manifest( 'aopalliance.*' ) {
        instruction 'Export-Package', '*;version=1.0'
    }
}

现在,清单中的Export-Package指令是正确的:

Export-Package: org.aopalliance.aop;version="1.0",org.aopalliance.inte
rcept;version="1.0";uses:="org.aopalliance.aop"

而运行OSGi容器,我们看到Spring AOP捆绑包仍然没有解决,但现在唯一的问题是因为它

< code>commons.logging jar有一个已知问题(记录在< code>osgi-run自述文件页面中)...它声明了可选的依赖项,使得自动包装变得困难。

此外,还有<code>公共空间。日志记录jar在清单中具有不正确的<code>规范版本。它说的是1.0而不是2.1.1,而这正是osgi运行bundle版本所使用的,因此bundle版本获得了不正确的值。

通过强制<code>osgi运行

manifest( /commons-logging.*/ ) {
    instruction 'Import-Package', '!javax.servlet,!org.apache.*,*'
    instruction 'Export-Package', '*;version=1.1.1'
}

现在,转到下一个问题,我们注意到<code>org.springframework。web无法解析,因为它对<code>有要求(

这个很简单,将servlet-api包(由Felix提供)添加到OSGi运行时,它应该可以工作...只需在Gradle文件中添加这个依赖关系:

osgiRuntime 'org.apache.felix:org.apache.felix.http.servlet-api:1.1.2'

现在,OSGi环境启动时没有任何故障!

以下是安装的全套捆绑包:

   ID|State      |Level|Name
    0|Active     |    0|System Bundle (5.4.0)|5.4.0
    1|Active     |    1|aopalliance (1.0.0)|1.0.0
    2|Active     |    1|Commons Lang (2.5.0)|2.5.0
    3|Active     |    1|Jakarta Commons Logging (1.0.0)|1.0.0
    4|Active     |    1|Apache Felix Gogo Command (0.16.0)|0.16.0
    5|Active     |    1|Apache Felix Gogo Runtime (0.16.2)|0.16.2
    6|Active     |    1|Apache Felix Gogo Shell (0.12.0)|0.12.0
    7|Active     |    1|Apache Felix Servlet API (1.1.2)|1.1.2
    8|Active     |    1|Spring AOP (3.1.2.RELEASE)|3.1.2.RELEASE
    9|Active     |    1|Spring ASM (3.1.2.RELEASE)|3.1.2.RELEASE
   10|Active     |    1|Spring Beans (3.1.2.RELEASE)|3.1.2.RELEASE
   11|Active     |    1|Spring Context (3.1.2.RELEASE)|3.1.2.RELEASE
   12|Active     |    1|Spring Context Support (3.1.2.RELEASE)|3.1.2.RELEASE
   13|Active     |    1|Spring Core (3.1.2.RELEASE)|3.1.2.RELEASE
   14|Active     |    1|Spring Expression Language (3.1.2.RELEASE)|3.1.2.RELEASE
   15|Active     |    1|Spring Object/XML Mapping (3.1.2.RELEASE)|3.1.2.RELEASE
   16|Active     |    1|Spring Web (3.1.2.RELEASE)|3.1.2.RELEASE
   17|Active     |    1|Spring Web Servlet (3.1.2.RELEASE)|3.1.2.RELEASE
   18|Active     |    1|Spring Web Services Core (2.1.1.RELEASE)|2.1.1.RELEASE
   19|Active     |    1|Spring XML (2.1.1.RELEASE)|2.1.1.RELEASE
   20|Active     |    1|tomcat-servlet-api (8.0.0)|8.0.0
   21|Active     |    1|JWSDL (1.2.0)|1.2.0

如果您想尝试< code>osgi-run,这是我使用的Gradle文件:

plugins {
    id "com.athaydes.osgi-run" version "1.5.1"
}

repositories {
    mavenLocal()
    jcenter()
}

dependencies {
    osgiRuntime 'org.springframework.ws:spring-ws-core:2.1.1.RELEASE'
    osgiRuntime 'org.apache.felix:org.apache.felix.http.servlet-api:1.1.2'
}

runOsgi {
    wrapInstructions {
        printManifests = true
        manifest( 'aopalliance.*' ) {
            instruction 'Export-Package', '*;version=1.0'
        }
        manifest( /commons-logging.*/ ) {
            instruction 'Import-Package', '!javax.servlet,!org.apache.*,*'
            instruction 'Export-Package', '*;version=1.1.1'
        }
    }
}

只需将其保存在build.gradle文件中,然后运行gradle createOsgi即可在build/osgi/run.sh获取入门脚本。

我将在osgi-run上工作,以尝试自动解决此类问题,希望在下一个版本中,上面显示的第一个构建文件将毫不费力地工作。

 类似资料:
  • 我想使用aspectJ加载时间编织(没有Sp 以下是捆的装载顺序: 我想知道我应该如何启动钩罐?我将感谢任何帮助……p.s.有人通过将捆绑包“org.eclipse.osgi”和片段“org.eclipse.equinox.weaving.hook”作为“具有链接内容的二进制项目”导入他的工作区,解决了他的问题,但我不确定如何做到这一点:https://www.eclipse.org/forums

  • 我使用EclipseIndigo使用OSGiJava框架开发了一些包。有一个主捆绑包,它依赖于其他捆绑包,并且具有要运行的主程序。如果我尝试在Eclipse中运行所有捆绑包,一切都正常工作,但是如果我将每个捆绑包保存为一个JAR,并在命令行中启动OSGi框架,当我尝试启动主捆绑包时,会出现异常<code>NoClassDefFoundError。找不到的类是依赖项。包的其余部分处于活动状态,主包刚

  • 问题内容: 在花了几个小时试图了解如何在 基于OSGi的应用程序* 的情况下使 连续部署 工作之后,我终于提出了关于stackoverflow的第一个问题,希望能指出一些我可能做错了或错过的事情-我觉得自己走错了路… * 这是我想要实现的: 构建一些捆绑 并将其安装到Maven存储库(这里没有问题,使用bnd) 现在,所有的捆绑软件都组成了我的应用程序(通过了所有测试等等),我想 部署并运行 该应

  • 我按照下一页上的说明将primefaces jar库转换为OSGi插件,并将其添加为OSGi捆绑包中必需的插件之一。http://www.vogella.com/tutorials/EclipseJarToPlugin/article.html#jar-files-without-osgi-meta-data 然而,当我部署OSGi捆绑包,我<有限公司 这是我得到的堆栈跟踪,以防错误是由于其他原因

  • OSGi 技术是面向 Java 的动态模型系统。OSGi 服务平台向Java提供服务,这些服务使Java成为软件集成和软件开发的首选环境。 Java提供在多个平台支持产品的可移植性。OSGi技术提供允许应用程序使用精炼、可重用和可协作的组件构建的标准化原语。 这些组件能够组装进一个应用和部署中。 OSGi服务平台提供在多种网络设备上无需重启的动态改变构造的功能。 为了最小化耦合度和促使这些耦合度可

  • 我们面临的最大问题是,我们无法找出如何构造项目C,以使其在项目A和B中都能正常工作。在项目A中,我们希望maven能像往常一样工作,并根据需要降低依赖项。但我们也希望在项目B(也许结合Nexus+Tycho??)中实现该功能。 我们应该如何解决这个问题。我还没有找到一个好的解决办法如何做这件事。我已经在maven中尝试了apache felix捆绑插件,但不能让它像我想要的那样工作。这是正确的解决