<Export-Package>


Export-Package指令列出所有bundle要导出的包。这些包会从能找到的class中被复制到bundle JAR中。因此,我们能够只包含class文件到bundle中而不用去关心源代码。Export-Package可以使用通配符"*",也可以使用否定符号"!"排除某个包。

Export-Package中列出的包是有顺序的。先列出的比后列出的要优先应用。假如指定了规则"org.foo.*,!org.foo.impl",因为第一个规则把org.foo下的所有包都导出了,第二个规则就没有作了。相反,如果指定了规则"!org.foo.impl,org.foo.*",就可以导出除了org.foo.impl外的所有包。

根据标准OSGI R4语法,包的规则可以包含指示符与属性,指示符与属性会被正确的复制用来生成Export-Package manifest header。除了明确的列出包的版本属性。BND会检查源JAR包文件或者从package目录下的packageinfo文件来确定版本。


<Private-Package>

Private-Package指令语法与Export-Package指令类似,但Private-Package是用来说明bundle中哪些包是不会被导出的。如果一个包被同时声明了Export-Package与Private-Package,那么以Export优先。


<Include-Resource>

Include-Resource是用来列出要复制到bundle JAR文件中的资源的。资源声明可以有以下几种方式。

assignment ::= PATH '=' PATH
simple ::= PATH
inline ::= '@' PATH

对于Include-Resource指令来说,实际的文件路径是相对于pom.xml来说的,但复制的目录是相对于JAR文件的根目录来说的。对于simple格式与assignment格式来说,PATH可以是文件或者目录。simple规则会把文件直接放到bundle JAR的根目录下,比如src/main/resources/a/b.c就会把b.c打包的budle JAR文件的根目录下。如果PATH是一个目录,就会把目录的整个层级结构打包的bundle JAR文件根目录下。如果要把资源放到bundle JAR文件的子目录下,需要用到assignment规则。左边的PATH代表的是目标地址,右边的PATH代表的是源地址。inline对应的PATH必须是ZIP或者JAR,它会把JAR或ZIP中的内容合并到budle JAR文件中。


Include-Resource例子:

<Include-Resource>                            rescopy/a.info=res/a.info,#将res/a.info复制到bundle中的rescopy/a.info
@a.jar,#将a.jar中的内容合并到bundle中
a.txt,#将a.txt复制到bundle中
{a.txt}#将a.txt复制到bundle中
</Include-Resource>


<Import-Package>

Import-Package指令列出bundle所需要包含的包,默认的值是"*",包含所有导出的包。这个值很少需要被指定,然而,有些时候你不想导入需个包,可以使用"!"符号来剔除一些包。Import-Package的package规则与Export-Package是一样,即package规则是有序的。比如你要引入除了org.foo.impl外的所有包,需要这样写"!org.foo.impl,*"而不是"*,!org.foo.impl"



默认行为:

<Bundle-SymbolicName>通过Maven2OsgiConverter插件来计算,算法如下:

以groupId+"."+artifactId来得到symbolic name,除了以下几种情况:

  • 如果artifact.getFile是null而且jar中包含有OSGI Manifest并manifest中含有Bundle-SymbolicName属生,返回manifest中的Bundle-SymbolicName属性。

  • 如果groupId只有一部分(没有.)并且artifact.getFile非空,返回第一个有类的包名。

  • 如果artifactId与groupId的最后一部分相等,返回groupid.例如org.apache.maven:maven->org.apache.maven

  • 如果artifactId开始部分与groupId的最后部分相重叠,去掉其中的一个重叠的部分。例始:org.apache.maven:maven-core->org.apache.maven.core


Export-Package默认值为所有包含有java的包,除了.与一些包名中包含有'impl'与'internal'的包。


Private-Package默认包含所有有java的包


Import-Package默认为*


Include-Resource默认src/main/resources/


Bundle-Version默认为"${pom.version}",但必须符合OSGI版本格式"MAJOR.MINOR.MICRO.QUALIFIER",比如 "2.1-SNAPSHOT" 将变成"2.1.0.SNAPSHOT"



<Bundle-Name> 默认为 "${pom.name}".

<Bundle-Description> 默认为 "${pom.description}".

<Bundle-License> 默认为 "${pom.licenses}".

<Bundle-Vendor> 默认为 "${pom.organization.name}".

<Bundle-DocURL> 默认为 "${pom.organization.url}".