我有一个包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
答案 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文件中的所有类。
我希望有所帮助!