【问题标题】:Character limit on Bundle-Classpath in OSGi bundle manifest?OSGi捆绑清单中Bundle-Classpath的字符限制?
【发布时间】:2010-07-26 20:48:28
【问题描述】:

使用 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/ 位来获得更多字符,但我很好奇这是一个错误、一个明确的限制,还是只是我的愚蠢。

【问题讨论】:

    标签: java osgi apache-felix


    【解决方案1】:

    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 这样的工具来自动为您执行此类(以及更多)操作。

    【讨论】:

    • 请注意,当他说“字节”时,他实际上是指字节,而不是字符。因此,当您将文件存储为 Unicode UTF-8 并使用非 ASCII 字符时,试图确定某些文本是否真正适合该行会变得非常疯狂。为什么 MANIFEST.MF 有这个奇怪的限制超出了我的理解。
    【解决方案2】:

    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
    

    【讨论】:

      【解决方案3】:

      另外,考虑将第三方库打包到自己的包中,有些甚至支持 osgi。

      【讨论】:

      • 也许是一个例子?我想你可以有一个没有激活器的捆绑包?
      • 是的,Activator 类是可选的。我指的是 f.e. commons-beanutils,它的 JAR 是一个现成的包,因为正确的标头已经在 MANIFEST.MF 中设置。
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

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

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

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

        正如其他评论者所指出的,将这些库用作 OSGi 捆绑包要好得多。将所有依赖项都放在一个包中有点忽略了 OSGi 的意义。

        【讨论】:

          猜你喜欢
          • 2011-06-18
          • 1970-01-01
          • 2011-03-03
          • 1970-01-01
          • 1970-01-01
          • 2013-05-31
          • 1970-01-01
          • 1970-01-01
          • 2016-02-09
          相关资源
          最近更新 更多