Ограничение символов в Bundle-Classpath в OSGi-манифесте пакета? - PullRequest
2 голосов
/ 27 июля 2010

Используя Apache Felix, у меня есть компонент OSGi, который я создал и который связывает некоторое промежуточное программное обеспечение, используемое моей компанией. В настоящее время это зависит от большого количества внешних библиотек, и я, кажется, столкнулся с ограничением длины параметра Bundle-classpath:. Мне пришлось переименовать библиотеки, такие как commons-collection.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 ]

9 голосов
/ 27 июля 2010

Длина строки манифеста ограничена 72 байтами, как указано в http://java.sun.com/j2se/1.4.2/docs/guide/jar/jar.html. После этого вам придется разделить строку и начать новую, начиная с пробела.В этом случае:

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, который автоматически выполняет подобные действия (и даже больше).

4 голосов
/ 27 июля 2010

Существует, как говорит Мориц , ограничение 72 байта на строку.

Пакет 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 голосов
/ 27 июля 2010

Также рассмотрите возможность упаковки сторонних библиотек в свои собственные пакеты, некоторые даже готовы к osgi.

2 голосов
/ 27 июля 2010

Посмотрите на http://wiki.apache.org/commons/CommonsOsgi для готовых библиотек Apache-Commons OSGi. В противном случае посмотрите на http://www.springsource.com/repository/app/, если они уже включены в вашу стороннюю библиотеку.

Установите эти пакеты независимо и не вставляйте их в свой пакет.

1 голос
/ 22 августа 2010

Во-первых, никогда не редактируйте напрямую MANIFEST.MF.Отредактируйте его в стандартном текстовом файле, например, mymanifest.txt, затем передайте команду jar следующим образом:

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

Инструмент jar затем вставит перенос строки при необходимости.

Лучший ответ : используйте инструмент Bnd от Peter Kriens для генерации вашего манифеста.

Также, как отмечали другие комментаторы, гораздо лучшеиспользовать эти библиотеки как пакеты OSGi.Вклеивание всех ваших зависимостей в один пакет - это своего рода упущение OSGi.

...