Манифест первой сборки 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
, что в точности противоречит очевидному первому подходу.
Ответы
Ответ 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
Для 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
}
}
Надеюсь, этого хватит, чтобы вы пошли.