Как избежать того, чтобы плагин Gradle osgi генерировал запись export-pacakge для приватных пакетов и запись import-пакета для встроенных зависимостей

Уважаемые пользователи Stackru

У меня есть проект gradle, из которого я хочу превратить артефакт в пакет osgi. В этом комплекте у меня есть:

  • пакеты, которые я не хочу экспортировать (может не появиться в манифесте Export-Package запись)
  • зависимости, которые я хочу внедрить (может не отображаться в манифесте Import-Package запись)

После небольшой переделки я придумал следующее gradle.build файл, который делает то, что я намерен, но, возможно, не самым чистым способом, используя bnd...

group 'com.mycompany'
version '1.0.0'

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

repositories {
    jcenter()
}

dependencies{
    compile 'org.osgi:org.osgi.framework:1.8.0'  //provided
    compile 'com.google.code.gson:gson:2.8.0'    //embedded
}


jar {
    //embedding the gson dependency
    from({
        def x = configurations.compile.find({
            return it.getName().contains('gson')
        })
        def tree = zipTree(x)
        return tree
    })

    //explicitly building manifest entries
    manifest {
        instruction 'Bundle-Vendor',
                'My Company'
        instruction 'Bundle-Activator',
                'com.mycompany.mybundle.Activator'
        instruction 'Import-Package',
                '!com.google.gson',           
                '*'
        instruction 'Export-Package',
                /com.mycompany.mybundle;version="${version}"/
    }
}

Можно ли сделать это более чистым способом? Я в основном хочу избежать двух вещей:

  1. необходимость вручную писать записи пакета импорта и экспорта
  2. необходимость вручную скопировать содержимое встроенных зависимостей (gson) в мою банку

Я думал, что bnd (лежащий в основе плагина osgi) может сделать это для меня, но с тем, что я пробовал до сих пор (даже если я добавляю их как закрытый пакет), bnd все равно экспортирует все и импортирует пакет gson, а также не добавляет классы гсон к банке

1 ответ

Вам лучше использовать плагин Bnd Gradle для OSGi. Он написан и поддерживается разработчиками bnd, которые знают кое-что об OSGi.

Другие вопросы по тегам