манифестировать первую сборку OSGi с помощью gradle — переход с ant на Gradle

Есть ли первый манифест http://wiki.osgi.org/wiki/Tooling_Approaches плагина Gradle для ОСГи? Или как это сделать с помощью Gradle?

Существует большой старый проект для контейнера OSGi со многими проектами, имеющими сложные отношения, объявленные в MANIFEST.MF. Сборка долгая. Теперь мы хотим все упростить и внедрить Gradle. Но сначала не ломая вещи и не поддерживая параллельные сборки ant и gradle в течение некоторого времени. Однако я вижу, что gradle предлагает определить MANIFEST внутри build.gradle. https://docs.gradle.org/current/userguide/osgi_plugin.html
Это потребовало бы много копировальной работы.

ОБНОВЛЕНИЕ Существует около 100 модулей с большим количеством информации о зависимостях между модулями и для вложенных jar-файлов. В среднем длина MANIFEST.MF составляет около 50 строк (варьируется от 20 до 300 строк). Как связать вложенные банки - другой вопрос . Этот вопрос касается использования существующих файлов MANIFEST.MF. Все плагины, которые я видел, используют bnd, что полностью противоречит первому подходу манифеста.


person Paul Verest    schedule 25.02.2016    source источник
comment
Если вы пишете свои манифесты вручную, вы можете передать их непосредственно задаче JAR. Есть ли что-то еще, что мне не хватает?   -  person Neil Bartlett    schedule 26.02.2016
comment
Как передать существующий файл MANIFEST.MF в задачу jar? Я вижу, что теперь единственный способ - скопировать информацию из MANIFEST.MF в раздел jar build.gradle, это огромная работа обезьяны. Эти файлы могут измениться до того, как сборка Gradle начнет работать и будет принята в качестве основного метода доставки.   -  person Paul Verest    schedule 29.02.2016
comment
У меня недостаточно знаний Gradle, чтобы ответить. Команда jar из JDK берет файл манифеста с помощью переключателя -m, я был бы очень удивлен, если бы задача Gradle каким-то образом не раскрывала эту опцию.   -  person Neil Bartlett    schedule 29.02.2016
comment
Речь идет о дополнительных свойствах OSGi, о которых JDK знать не может. И вопрос в том, может ли Gradle читать зависимости OSGi от других пакетов (баночки OSGi)   -  person Paul Verest    schedule 29.02.2016
comment
JDK не нужно знать. Команда jar позволяет предоставить предопределенный манифест в виде файла. Быстро проверив документы Gradle, похоже, что задача Jar имеет свойство manifest, которое вы можете использовать. Что-то вроде Manifest.from(filename).   -  person Neil Bartlett    schedule 29.02.2016
comment
Вы уже дали мне как минимум 2 идеи. Здорово.   -  person Paul Verest    schedule 29.02.2016
comment
Вы застряли на Gradle? Почему бы не использовать Maven. Затем вы можете использовать стандартные цели maven для создания манифестов osgi и т. д.   -  person Richard    schedule 30.03.2016
comment
Потому что Gradle лучше :)!   -  person pczeus    schedule 30.03.2016
comment
@Richard Если вы знаете плагин Maven, который решает проблему чтения информации о зависимостях, добавьте его в качестве ответа. Такого плагина я тоже не нашел.   -  person Paul Verest    schedule 31.03.2016


Ответы (2)


У Gradle есть класс OsgiManifest, который представляет собой расширенный манифест jar:

https://docs.gradle.org/current/javadoc/org/gradle/api/plugins/osgi/OsgiManifest.html

На StackOverflow есть сообщение, в котором показано подобное использование:

Как добавить инструкции Import-Package для зависимостей среды выполнения?

Соответствующий блок Gradle выглядит так:

apply plugin: 'java'
apply plugin: 'osgi'

jar {
    baseName = 'awesome'
    manifest {
        name = 'An Awesome Application'
        symbolicName = 'com.example.awesome'
        instruction 'Import-Package', 'org.springframework.orm', '*'
    }
}

Если у вас есть существующие манифесты и вы хотите использовать свои собственные пользовательские файлы, вы можете сделать это, задав расположение файла манифеста в закрытии jar:

jar {
    manifest {
        def manif = "${resourcesDir}/MANIFEST.MF"
        if (new File(manif).exists()) {
            from file(manif)
        }
        else{
            name = 'overwrittenSpecialOsgiName'
            instruction 'Private-Package', 'org.mycomp.somepackage'
            instruction 'Bundle-Vendor', 'MyCompany'
            instruction 'Bundle-Description', 'Platform2: Metrics' 
        }
    }
}

Документацию по манифесту Gradle можно найти здесь: https://docs.gradle.org/current/javadoc/org/gradle/api/java/archives/Manifest.html

Ваш "другой вопрос":

Существуют дополнительные плагины Gradle для создания пакетов OSGI, в некоторых случаях включая зависимости от других пакетов OSGI.

Например, есть плагин Gradle Bundle, который использует инструмент bnd и позволяет вам указать включить транзитивные зависимости и даже исключить нежелательные. Например:

jar {
    manifest {
        attributes 'Implementation-Title': 'Bundle Quickstart',     // Will be added to manifest
                     'Import-Package': '*'  // Will be overwritten by the instuctions below
    }
}

bundle {
    includeTransitiveDependencies = true

    instructions << [
        'Bundle-Activator': 'foo.bar.MyBundleActivator',
        'Import-Package': 'foo.*',
        '-sources': true
    ]

    instruction 'Export-Package', '*' // Specify an individual instruction
    instruction '-wab', ''
}

Существует также плагин Gradle osgi-run, который по умолчанию включает транзитивные зависимости:

dependencies {
    // all your usual dependencies
    ...

    osgiRuntime( "your:dependency:1.0" ) {
        transitive = false // transitive dependencies not included in OSGi runtime
    }
}

Надеюсь, этого достаточно, чтобы вы начали.

person pczeus    schedule 28.03.2016
comment
Это уже хороший ответ (проголосовал), но он не решает проблему получения всей информации о зависимостях, например. между модулями и то, что у нас есть из вложенных банок. - person Paul Verest; 31.03.2016
comment
Павел, ваш последний комментарий. Связано ли это с решением опубликованного вами «Другого вопроса»? Я пытаюсь получить четкое представление о том, что именно вы хотите помочь предложить дополнительные предложения. - person pczeus; 31.03.2016
comment
После того, как информация о зависимостях есть, пакет может быть собран с вложенными банками или без них, то есть другими вопросами. По крайней мере, для того, чтобы сборка gradle была ВЫПОЛНЕНА, компиляция должна пройти, т.е. все зависимости из файлов MANIFEST.MF должны быть видны компилятору. Я не эксперт по объявлению всех возможных зависимостей в MANIFEST, есть по крайней мере зависимости пакетов и пакетов. - person Paul Verest; 31.03.2016
comment
Пол, я добавил дополнительную информацию к ответу для пары других плагинов osgi, которые я нашел. Тем не менее, я думаю (поправьте меня, если я ошибаюсь), что вам может понадобиться использовать плагин OSGI по умолчанию, но после добавления ваших 50+ модулей OSGI в качестве самих зависимостей (они находятся в общей библиотеке?), тогда вы говорят, что вам нужно затем найти информацию в манифесте каждого модуля, чтобы явно добавить объявленные зависимости манифеста каждого модуля в общий путь к классам сборки, а также для того, чтобы ваша сборка была успешной. Мысли или уточнения? - person pczeus; 01.04.2016
comment
Я исследую самостоятельно, пробую все плагины, найденные запросом osgi. Я пока не пробовал osgi-run, Gradle Bundle Plugin использует bnd, вафля чудовищная и давно не обновлялась. Сначала мне нужно выйти из сборки ant и получить тот же результат сборки, прежде чем начинать изменения с помощью нового инструмента сборки. - person Paul Verest; 01.04.2016

По состоянию на апрель 2016 года в инструментах сборки Maven или Gradle для OSGi не существует подхода "сначала манифест".

В то время как для подключаемых модулей Eclipse (которые также являются действительными пакетами OSGi) существует стандартная сборка maven/tycho. в Eclipse Foundation это не очень помогает для общих проектов OSGi.

Противоположностью Manifest-first является генерация манифеста, и есть только один инструмент bnd, который изначально предназначался для создания манифеста, затем превратился в полноценный сборщик jar пакетов и теперь имеет Интеграция BndTools с Eclipse, похожая на интеграцию Maven/Gradle, управляющую зависимостями.

Я бы рекомендовал хранить bnd инструкции во внешнем стандартном bnd.bnd файле и не помещать его в скрипт сборки. *.bnd аналогичны обычным файлам Java .properties, поэтому в Eclipse IDE щелкните правой кнопкой мыши, выберите "Открыть с помощью" -> "Другое"... выберите Properties File Editor, установите флажок "Использовать этот редактор для..." и установите флажок "Использовать этот редактор для всех файлов '*.nbd' файлы"

Для Gradle

  • [Плагин Gradle OSGi] (стандартный, встроенный)(https://docs.gradle.org/current/userguide/osgi_plugin.html) дает только манипуляции с манифестом, поэтому GRADLE-1107 "Инструкция OSGi Include-Resource не работает" является открытой проблемой с 2010 года.
  • Плагин Gradle Bundle позволяет создавать пакеты OSGI. Его главное отличие от плагина Gradle OSGI заключается в том, что он использует инструмент bnd для генерации не только манифеста, но и целого jar-файла.
  • osgi-run "Osgi-Run — подключаемый модуль Gradle для совершенно безболезненной разработки модульных приложений с использованием OSGi"

Для мавена

Все инструменты на основе bnd теперь собраны на http://bnd.bndtools.org/chapters/700-tools.html

Несколько примеров приведены в https://github.com/paulvi/OSGiBuildExamples.

Примечание: ссылка http://wiki.osgi.org/wiki/Tooling_Approaches находится в разделе "The Вики сообщества OSGi, к сожалению, была взломана и в настоящее время недоступна.» статус более недели, пока этот вопрос был открыт.

К сожалению, @Richard слишком рано сдался, чтобы получить благодарность (за упоминание maven)

person Paul Verest    schedule 06.04.2016