今天想用maven想动态打osgi包,即若指定DynamicImport-Package,Export-Package或Bundle-Activator等bundle的元素,自动检测打进MANIFEST.MF
首先遇到的第一个头痛问题是,DynamicImport-Package没有指定其为空时,它会无缘无故把动态包javax.microedition.io给引进bundle,导致bundle找不到这依赖起不来,弄了好久才知道原来这包是在org.eclipse.osgi.services jar包中,并且是动态包,看maven-bundle-plugin源码,它代码中默认Import-Package为“*”,这样动态依赖的包也会引进来,再看看打包插件导入原码,分析如果给个空值它即不会再引进去,果不其然
在pom的instructions和properties节点做如下声明搞掂:
-----------------------
${lee.osgi.dynamic}
-----------------------
----------------------------
----------------------------
第二个问题是bundle的activator ,在父pom.xml的properties和instructions添加${lee.osgi.activator}后,如果其它maven工程的pom不指定一个activator,打包的时候就会报错。
分析原因,原来在instructions添加activator后,若其值为空串,它就引入报错,因为不可能一个activator没有类名而是一个空串。加“-X”参数打包报如下错
The default package '.' is not permitted by the Import-Package syntax. This can be caused by compile errors in Eclipse because Eclipse creates
思考解决方案:可否如果activator为空串时MANIFEST.MF不构建Bundle-Activator,修改maven-bundle-plugin打包原码的BundlePlugin类,打包成功
if ( null == value )
{
if (Constants.BUNDLE_ACTIVATOR.equals(key))
{
continue;
}
value = "";
}
else
{
value = value.replaceAll( "\\p{Blank}*[\r\n]\\p{Blank}*", "" );
}
第三个问题是自定义引入包时,如在instructions添加
if ( null == value )
{
if (Constants.BUNDLE_ACTIVATOR.equals(key))
{
continue;
}
value = "";
}
else
{
if (Analyzer.IMPORT_PACKAGE.equals(key))
{
value = value + ",*";
}
value = value.replaceAll( "\\p{Blank}*[\r\n]\\p{Blank}*", "" );
}