参考:http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html
1. Features:特性
该插件基于Bnd 工具,用于帮助管理本地Maven仓库的Bundle, 同时也支持访问远程Bundle仓库。
Bnd是通过指令去知道其行为的,Bnd认识三种指令:
(1) Mainfest headers: 如果一个指令是以大写字母开头则该header的值将出现在MAINFEST.MF文件中;
(2) Variables: 如果一个指令是以小写字母开头,并且是以key=value对的形式,如:version=3.0, 将被认
为是属性的一个替换,不会出现在MAIFEST.MF中;
(3) Directives: 如果一个指令是以"-"开头,则是告诉BND执行特殊的操作,不会被出现在MAIFEST.MF中。
2. Instructions:指令
(1) Export-Package
该指令明确指明该Bundle需要Export的Packae, 这些Package将出现在MAINFST.MF文件中,有可能Export
某些Package,但这些Package却不在当前Project中。同时在Export-Package时有额可以使用"*", 为了排除
某些不需要Export-Package的Package,可以使用"!",在使用这些Package Pattern时,是有前后顺序关系的,
前面声明的Pattern优先于后面的 Pattern。例如:
“org.foo.*”,!org.foo.impl",其中第二个Pattern将不起作用,应该声明成:
“!org.foo.impl,org.foo.*”
根据OSGi 规范的语义,Package Pattern可以包含指令和属性,指令和属性都将被Copy至MANIFEST.MF文
件中,除了需要明确指明Package Version属性外,Bnd也能自动的根据JAR文件或者packageinfo文件决定
Package version.
(2) Private-Package
该指令用于指明Bundle 中不需要Export的Package,如果一个Package即被Export Pattern 又被PrivatePattern
匹配,则Export Pattern优先。
(3) Import-Package
该指令用于指明Bundle需要的 Package,默认值为:"*",意为Import 所有Reference的Package;如果不需要
Import 某个Package,可以使用"!", 这个Package Pattern与Export-Package是一样的,即有前后关系,如过你
想Import所有的Package除了了org.foo.impl,则可以声明为:
"!org.foo.impl,*"
(4) Include-Resource
请参考官方文档:http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html
3. Default Behavior
maven-bundle-plguin指定了MAINFEST.MF文件中某些Header的默认值:
(1) <Bundle-SymbolicName> :使用Maven2OsgiConverter组件生成,它使用下面的算法:
默认:groupId + ".“ + artifactId ,但有以下例外:
如果artifact.getFile不是空的, 并且JAR文件包含的OSGi的Bundle-SymbolicName属性,那么将直接返回该值;
A. 如果的groupId只有一个部分(不含".")并且artifact.getFile不为空,那么使用包含类的第一个包名被返回。如:
commons-logging:commons-logging -> org.apache.commons.logging
B. 如果artifactId的最后一部分与groupId相同,则groupId返回。如:org.apache.maven:maven - >
org.apache.maven;
C. 如果artifactId是以groupId的最后一部分作为开头,则groupId那部分被删除,只返回其他部分,
如:org.apache.maven-core - > org.apache.maven.core
symbolic name可以被存储在$(maven-symbolic-name)属性中,可以给他添加属性或指令。
D. 设置bundle symbolic name:
<plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <configuration> <instructions> <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName> ... </instructions> </configuration> </plugin>
(2) <Bundle-Name>:
默认值为:${project.name},设置一个Bundle-Name:
<plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <configuration> <instructions> <Bundle-Name>JoeFred</Bundle-Name> ... </instructions> </configuration> </plugin>
(3) <Bundle-Version>
默认值为:$ {pom.version },OSGi的版本格式MAJOR.MINOR.MICRO.QUALIFIER,,例如:
4.2-SNAPSHOT --> 4.2.0.SNAPSHOT.
设置Bundle-Version:
<plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <configuration> <instructions> <Bundle-Version>1.0.3.1</Bundle-Version> ... </instructions> </configuration> </plugin>
(4) <Export-Package>
是您当地的Java源代码包,但不包括默认的包'.“以及部包含已'impl“或”internel“结尾的Package。例如:
推荐:!com.fuse.demo.private,com.fuse.demo.*,不推荐:com.fuse.demo.*,!com.fuse.demo.private
(5) <Private-Package>
例如:
<plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <configuration> <instructions> <Private-Package>org.apache.cxf.wsdlFirst.impl</Private-Package> ... </instructions> </configuration> </plugin>
(6) <Import-Package>
默认值为:*, 例如:
<plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <configuration> <instructions> <Import-Package>javax.jws, javax.wsdl, org.apache.cxf.bus, org.apache.cxf.bus.spring, org.apache.cxf.bus.resource, org.apache.cxf.configuration.spring, org.apache.cxf.resource, org.springframework.beans.factory.config, * </Import-Package> ... </instructions> </configuration> </plugin>
(7) <Include-Resource>
从项目的Maven的资源目录:src /main/resource复制文件到指定的项目目录层次结构。
(8) 其他默认设置
<Bundle-Description> --> “ $ {pom.description }“;
<Bundle-License> -->“ $ {pom.licenses }“;
<Bundle-Vendor> -->“ $ {pom.organization.name }“;
<Bundle-DocURL> -->“ $ {pom.organization.url }“.