Java OSGi捆绑包清单中捆绑包类路径上的字符限制?

Java OSGi捆绑包清单中捆绑包类路径上的字符限制?,java,osgi,apache-felix,Java,Osgi,Apache Felix,使用ApacheFelix,我编写了一个OSGi组件,它封装了我公司使用的一些中间件。目前它依赖于大量的外部库,我似乎在Bundle类路径上遇到了限制:参数长度。我不得不将commons-collections.jar等库重命名为ccoll.jar 我很好奇,是否有人对如何克服这个限制有什么建议 Bundle-ClassPath: .,lib/log4j.jar,lib/cvfs.jar,lib/backport.jar,lib/cbeanutils.jar,lib/ccodec.jar,lib

使用ApacheFelix,我编写了一个OSGi组件,它封装了我公司使用的一些中间件。目前它依赖于大量的外部库,我似乎在Bundle类路径上遇到了限制:参数长度。我不得不将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/位来获得更多的字符,但我很好奇这是一个bug,一个定义的限制,还是仅仅是我的白痴

清单行长度限制为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,自动地做这样的事情(更多)。

< P>也可以考虑把第三方库打包在自己的包里,有些甚至是OSGi准备好的。

有,如每行。

Java包包括用于编写清单的代码:

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);
看一看ApacheCommonsOSGiReady库。否则,看看他们是否已经捆绑了您的第三方库


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

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

jar cfm output.jar mymanifest.txt <other files>
jar cfm output.jar mymanifest.txt
然后,
jar
工具将根据需要插入换行符

更好的答案:使用Peter Kriens的工具生成清单


正如其他评论者所指出的,将这些库作为OSGi包使用要好得多。将所有依赖项粘在一个包中有点缺少OSGi的要点。

也许是一个例子?我想您可以拥有一个没有激活器的捆绑包?是的,激活器类是可选的。我指的是f.e.commons beanutils,它的JAR是一个现成的包,因为MANIFEST.MF中已经设置了正确的头。请注意,当他说“bytes”时,实际上是指字节,而不是字符。因此,当您将文件存储为Unicode UTF-8并使用非ASCII字符时,试图弄清楚某些文本是否适合该行就变得完全疯狂了。我无法理解为什么MANIFEST.MF有这种奇怪的限制。
jar cfm output.jar mymanifest.txt <other files>