0

我有一个包 XYZ,它存在于 2 个包 A 和 B 中:

bundle A
 package X.Y.Z 
  class Class1

bundle B
 package X.Y.Z 
  class Class2

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

我将 glassfish 3.1 与 felix 一起使用

4

2 回答 2

2

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

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

于 2011-08-29T05:48:35.400 回答
0

同样,尼尔是绝对正确的。但是,有时供应商,无论出于何种原因,都会有多个包含相同包的 .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 文件中的所有类。

我希望这会有所帮助!

于 2011-09-14T16:39:53.367 回答