我有一个包 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 一起使用
我有一个包 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 一起使用
不,它不应该工作。如果您导入包 XYZ,则该导入将优先于捆绑包自己的内部内容使用。
更一般地说,您有一个称为拆分包的问题。包应该是连贯的并由单个包导出,而不是跨多个包涂抹。您应该重构您的包内容,以便属于包 XYZ 的所有类都存在于单个包中。
同样,尼尔是绝对正确的。但是,有时供应商,无论出于何种原因,都会有多个包含相同包的 .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 文件中的所有类。
我希望这会有所帮助!