Подтвердить что ты не робот

Манифест первой сборки OSGi с gradle - переход с ant на Gradle

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

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

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

4b9b3361

Ответ 1

По состоянию на апрель 2016 года в Maven или Gradle нет инструментов Manifest-first для инструментов OSGi.

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

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

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

Для Gradle

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

Для maven

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

В https://github.com/paulvi/OSGiBuildExamples

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

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

Ответ 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 {
    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 Plugin, в котором используется инструмент 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 plugin, который включает в себя транзитивные зависимости по умолчанию:

dependencies {
    // all your usual dependencies
    ...

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

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