我正在使用serviceMix来部署我的捆绑包。而我正在使用maven创建我的包,如下所示:
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>2.3.6</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName>
<Bundle-Description>${project.description}</Bundle-Description>
<Bundle-Activator>mycom.project.PubSub.activator.Activator</Bundle-Activator>
<Import-Package>*,org.apache.camel.osgi,org.java_websocket.*, mycom.project.ManageSQL.Interface.SQLInterface
</Import-Package>
<Export-Package>mycom.project.PubSub.Manager.Manager</Export-Package>
<Private-Package>org.java_websocket.*, mycom.project.PubSub.*, io.socket.*, okhttp3.*, okhttp3.internal.connection, okio.*, org.json.*</Private-Package>
<BundleType>project</BundleType>
</instructions>
</configuration>
</plugin>
我从我的其他一个包中导入一个类,如下所示:
<Import-Package>*,org.apache.camel.osgi,org.java_websocket.*, mycom.project.ManageSQL.Interface.SQLInterface</Import-Package>
但是当我尝试在我当前的Bundle中访问它时,它给了我错误,没有这样的类 我正在使用eclipse和maven创建bundle并在serviceMix上部署它们 这是我正在尝试使用该捆绑包的pom项目的图像。
以下是我创建并希望使用其导入包的包的图像。
答案 0 :(得分:0)
您为maven bundle插件提供的配置相当不寻常,可能与您实际想要的不匹配。
<Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName>
<Bundle-Description>${project.description}</Bundle-Description>
这两个条目没问题,但我相信${project.groupId}.${project.artifactId}
是使用maven bundle插件时bundle的符号名的默认值,因此可以省略
<Bundle-Activator>mycom.project.PubSub.activator.Activator</Bundle-Activator>
通常不推荐使用BundleActivator
,因为它是一个极低级别的入口点。有很多锋利的边缘,很容易让事情严重错误。通常,建议您使用声明服务等组件框架,它可以为您完成大部分艰苦工作。这是声明激活类的正确方法,但其他读者要小心。
<Import-Package>*, org.apache.camel.osgi, org.java_websocket.*, mycom.project.ManageSQL.Interface.SQLInterface</Import-Package>
这是一份写得很糟的Import-Package
指令。通常,您不应该在所有中指定此标头,插件将为您计算正确的列表。如果您确实指定了此标题,那么它是高级用法,您必须小心。
首先这个标题是错误的,因为标记被视为过滤器列表并依次解释。从*
开始,标题的其余部分无关紧要。
其次,此标头必须是包列表(或glob匹配/否定),并且不得包含类名。如果mycom.project.ManageSQL.Interface.SQLInterface
不是类名,那么它严重违反了Java命名约定。
我建议您完全删除Import-Package
配置条目。
<Export-Package>mycom.project.PubSub.Manager.Manager</Export-Package>
与Import-Package
指令一样,Export-Package
必须采用包名,而不是类名。
<Private-Package>org.java_websocket.*, mycom.project.PubSub.*, io.socket.*, okhttp3.*, okhttp3.internal.connection, okio.*, org.json.*</Private-Package>
此Private-Package
指令(与Export-Package
指令相结合)负责决定哪些类最终打包到您的包中。将另一个包中的依赖项重新打包到您自己的包中是不寻常的(尽管不是闻所未闻)。这有点像本机可执行文件中的静态链接,但是您需要非常小心,以避免重新打包通过API公开的内容,以避免在运行时出现严重问题。
Private-Package
和Export-Package
只能包含编译类路径中的包。猜测这就是为什么你的包不包含你期望的东西,虽然我会问你为什么要首先重新包装这些包。
<BundleType>project</BundleType>
这是全局命名空间中的自定义标头。我建议使用一些对您的公司来说更加独特的东西,或者如果它不符合实际目的则删除标题。