【问题标题】:Embedding javassist dependency breaks OSGi bundle嵌入 javassist 依赖会破坏 OSGi 包
【发布时间】:2019-12-29 04:18:15
【问题描述】:

我正在尝试嵌入式 Felix 场景。从嵌入式 OSGi 容器 (Apache Felix) 加载包时,我收到以下错误。

org.osgi.framework.BundleException: Unable to resolve test.bundle-attempt [50](R 50.0): missing requirement [test.bundle-attempt [50](R 50.0)] osgi.wiring.package; (osgi.wiring.package=com.sun.jdi.connect) Unresolved requirements: [[test.bundle-attempt [50](R 50.0)] osgi.wiring.package; (osgi.wiring.package=com.sun.jdi.connect)]
    at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:4362)
    at org.apache.felix.framework.Felix.startBundle(Felix.java:2277)
    at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1535)
    at org.apache.felix.framework.FrameworkStartLevelImpl.run(FrameworkStartLevelImpl.java:308)
    at java.lang.Thread.run(Thread.java:745)

经过反复试验,我发现引入javassist 会导致错误。

        <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.25.0-GA</version>
        </dependency>

我正在尝试嵌入依赖项。

            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <extensions>true</extensions>
                <configuration>
                    <instructions>
                        <Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName>
                        <Bundle-Name>${project.artifactId}</Bundle-Name>
                        <Bundle-Version>${project.version}</Bundle-Version>
                        <Bundle-Activator>com.snc.TestPluginsActivator</Bundle-Activator>
                        <Embed-Dependency>*;scope=compile|runtime;inline=true</Embed-Dependency>
                        <Export-Package>com.snc</Export-Package>
                        <Embed-Transitive>true</Embed-Transitive>
                    </instructions>
                </configuration>
            </plugin>

关于我收到此错误的原因有什么建议吗?

【问题讨论】:

  • 您可以尝试将 javassist jar 连同您自己的包一起部署到 Felix,而不是嵌入 javassist jar。我验证了 javassist jar 被打包为 OSGi 包,并且 _not_import 任何 com.sun 包。
  • @gjoranv 根据 [javassit POM] (github.com/jboss-javassist/javassist/blob/master/pom.xml),com.sun.jdi 既不导入也不导出。 com.sun 的依赖关系是从系统路径解析的。所以,我想知道为什么会出现接线问题。我了解替代选项,并且我自己尝试过,但是我当前的情况需要嵌入 jar。

标签: java osgi osgi-bundle maven-bundle-plugin embedded-osgi


【解决方案1】:

javassist 工件依赖于 jar

<groupId>com.sun</groupId>
<artifactId>tools</artifactId>

并且上面的jar在javassistpom中被标记为可选,并且你的例子中未解析的包com.sun.jdi.connect属于上面的jar,工具,我提到过。

当尝试获取 Embed-dependencies 的传递依赖时,maven-bundle-plugin 不会在 MANIFEST.MF 文件中将这些传递可选依赖的包标记为可选,它正在尝试解决安装包时的依赖项。由于可选的传递依赖项不包含在包的类路径中,因此在启动包时会抛出错误消息Unresolved requirements

要解决此问题,您可以在 bundle 的 pom 中将这些依赖项标记为可选。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-20
    • 2021-07-05
    • 2018-10-24
    • 1970-01-01
    • 2017-07-27
    • 2020-09-13
    • 2014-10-02
    • 2019-11-03
    相关资源
    最近更新 更多