OSGi包清单中Bundle-Classpath的字符限制?

时间:2010-07-26 20:48:28

标签: java osgi apache-felix

使用Apache Felix,我有一个我编写的OSGi组件,它包含了我公司使用的一些中间件。目前它依赖于大量的外部库,我似乎已经遇到Bundle-classpath:参数长度的限制。我不得不将诸如commons-collections.jar之类的库重命名为ccoll.jar。

我很好奇是否有人有任何关于解决这个限制的建议?

Bundle-ClassPath: .,lib/log4j.jar,lib/cvfs.jar,lib/backport.jar,lib/cbeanutils.jar,lib/ccodec.jar,lib/ccoll.jar,lib/chttp.jar,lib/cjxpath.jar,lib/clang.jar,[libs redacted],lib/saaj-api.jar,lib/saaj-impl.jar,lib/Schemas.jar,lib/xbean.jar,lib/clog.jar,lib/dom4j.jar,lib/xml-apis.jar,lib/xerces.jar,lib/xalan.jar,lib/jaxp-ri.jar,lib/japi.jar,lib/mail.jar

我想我可以通过不使用lib / bits来获得更多字符,但我很好奇这是一个错误,一个明确的限制,还是仅仅是我自己的愚蠢。

5 个答案:

答案 0 :(得分:9)

http://java.sun.com/j2se/1.4.2/docs/guide/jar/jar.html中所述,清单行长度限制为72个字节。之后,您将必须拆分该行并开始一个以空格字符开头的新行。在这种情况下:

Bundle-ClassPath: .,lib/log4j.jar,lib/cvfs.jar,lib/backport.jar,lib/cbea
 nutils.jar,lib/ccodec.jar,lib/ccoll.jar,lib/chttp.jar,lib/cjxpath.jar,l
 ib/clang.jar,[libs redacted],lib/saaj-api.jar,lib/saaj-impl.jar,lib/Sch
 emas.jar,lib/xbean.jar,lib/clog.jar,lib/dom4j.jar,lib/xml-apis.jar,lib/
 xerces.jar,lib/xalan.jar,lib/jaxp-ri.jar,lib/japi.jar,lib/mail.jar

另外,您可以使用像BND这样的工具自动为您执行此类操作(以及更多)。

答案 1 :(得分:4)

Moritz says,每行72-byte limit

Java jar包中包含用于编写清单的代码:

Manifest manifest = new Manifest();
Attributes attributes = manifest.getMainAttributes();
attributes.put(Attributes.Name.MANIFEST_VERSION, "1.0");
attributes
    .putValue(
        "Bundle-Classpath",
        "<snip>");
manifest.write(System.out);

注意:Manifest-Version是强制性的。

这会产生输出:

Manifest-Version: 1.0
Bundle-Classpath: .,lib/log4j.jar,lib/cvfs.jar,lib/backport.jar,lib/cb
 eanutils.jar,lib/ccodec.jar,lib/ccoll.jar,lib/chttp.jar,lib/cjxpath.j
 ar,lib/clang.jar,[libsredacted],lib/saaj-api.jar,lib/saaj-impl.jar,li
 b/Schemas.jar,lib/xbean.jar,lib/clog.jar,lib/dom4j.jar,lib/xml-apis.j
 ar,lib/xerces.jar,lib/xalan.jar,lib/jaxp-ri.jar,lib/japi.jar,lib/mail
 .jar

答案 2 :(得分:3)

另外,考虑将第三方库打包在自己的捆绑包中,有些甚至是osgi-ready。

答案 3 :(得分:2)

查看Apache {Commons OSGi就绪库的http://wiki.apache.org/commons/CommonsOsgi。否则,如果他们已经捆绑了您的第三方库,请查看http://www.springsource.com/repository/app/

独立安装这些捆绑包,不要将它们嵌入捆绑包中。

答案 4 :(得分:1)

首先,永远不要直接编辑MANIFEST.MF。在标准文本文件中编辑它,例如mymanifest.txt,然后传递给jar命令,如下所示:

jar cfm output.jar mymanifest.txt <other files>

jar工具将根据需要插入换行符。

更好的回答:使用Peter Kriens的Bnd工具生成您的清单。

正如其他评论者指出的那样,将这些库用作OSGi包更好。将所有依赖项粘贴到一个包中有点忽略了OSGi的重点。