【问题标题】:osgi: import package that partially exists inside bundleosgi:部分存在于包中的导入包
【发布时间】:2011-08-28 15:44:53
【问题描述】:

我有一个包 X.Y.Z,它存在于 2 个包 A 和 B 中:

bundle A
 package X.Y.Z 
  class Class1

bundle B
 package X.Y.Z 
  class Class2

Bundle B 导出包 X.Y.Z。 Bundle A 导入包 X.Y.Z 并得到一个异常,即找不到他自己的类 Class1。它应该工作吗?

我将 glassfish 3.1 与 felix 一起使用

【问题讨论】:

  • Bundle A 导出哪些包,导入哪些包,Bundle B 导出和导入哪些包?

标签: osgi glassfish-3 apache-felix


【解决方案1】:

不,它不应该工作。如果您导入包 X.Y.Z,则该导入将优先于捆绑包自己的内部内容使用。

更一般地说,您有一个称为拆分包的问题。包应该是连贯的并由单个包导出,而不是在多个包中涂抹。您应该重构您的包内容,以便属于包 X.Y.Z 的所有类都存在于单个包中。

【讨论】:

    【解决方案2】:

    再一次,尼尔是绝对正确的。但是,有时供应商,无论出于何种原因,都会有多个包含相同包的 .jar 文件。当他们想要为他们的产品的谨慎实现提供小的 .jar 文件时,有时会这样做。为什么可以这样做的一个例子是,如果他们有一个针对 EDI 文档的文本处理算法,该算法不同于针对 xml 文档的文本处理算法。在此示例中,他们可以选择创建两个 .jar(版本 1 和 2)文件,其中包含包含不同实现类的“badlyPlannedImplementation.util”。就个人而言,我只遇到过几次,但问题是你如何处理它?

    当您遇到两个 .jar 文件导出同一个包的问题并且您希望访问这两个包类时,您使用一种称为“阴影”的机制。阴影是当您使用这两个包并将它们的内容收集到另一个 .jar 文件包中时。这曾经由一个名为“maven-shade-plugin”的 maven 插件完成,但现在该功能是 maven-bundle 插件的一部分。

    首先,创建一个新项目,我们将其命名为“badlyPlannedImplementationShaded”。然后,在您的项目中创建一个 pom.xml 文件。在您的依赖项部分中,包括您试图一起遮蔽的两个 .jar 文件的依赖项。

    然后,将以下内容添加到您的构建部分。

    <plugin>
       <groupId>org.apache.felix</groupId>
       <artifactId>maven-bundle-plugin</artifactid>
       <version>2.1.0</version>
       <extensions>true</extensions>
       <configuration>
          <instructions>
             <Bundle-Version>${project.version}</Bundle-Version>
             <Export-Package>
                badlyPlannedImplementation.util;version="1",
                badlyPlannedImplementation.util;version="2"
             </Export-Package>
          </instructions>
       </configuration>
    </plugin> 
    

    这样做会创建一个新包,其中包含一个 util 包,其中包含您尝试使用的两个 .jar 文件中的所有类。

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-07
      • 2023-03-12
      • 1970-01-01
      • 2016-09-15
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 2018-12-28
      相关资源
      最近更新 更多