osgi:部分存在于bundle中的import包

时间:2011-08-28 15:44:53

标签: osgi glassfish-3 apache-felix

我有一个包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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

当您遇到导致同一个包并且您想要访问这两个包类的两个.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文件中的所有类。

我希望有所帮助!