使用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来获得更多字符,但我很好奇这是一个错误,一个明确的限制,还是仅仅是我自己的愚蠢。
答案 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)
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的重点。