# Chapter 37. The OSGi Plugin

The OSGi plugin provides a factory method to create an `OsgiManifest` object. `OsgiManifest` extends `Manifest`. To learn more about generic manifest handling, see Section 23.14.1, “Manifest”. If the Java plugins is applied, the OSGi plugin replaces the manifest object of the default jar with an `OsgiManifest` object. The replaced manifest is merged into the new one.

The OSGi plugin makes heavy use of Peter Kriens BND tool.

## 37.1. Usage

To use the OSGi plugin, include the following in your build script:

Example 37.1. Using the OSGi plugin

`build.gradle`

    apply plugin: 'osgi'

## 37.2. Implicitly applied plugins

Applies the Java base plugin.

## 37.3. Tasks

This plugin does not add any tasks.

## 37.4. Dependency management

TBD

## 37.5. Convention object

The OSGi plugin adds the following convention object: `OsgiPluginConvention`

### 37.5.1. Convention properties

The OSGi plugin does not add any convention properties to the project.

### 37.5.2. Convention methods

The OSGi plugin adds the following methods. For more details, see the API documentation of the convention object.

Table 37.1. OSGi methods

Method | Return Type | Description
osgiManifest() | `OsgiManifest` | Returns an OsgiManifest object.
osgiManifest(Closure cl) | `OsgiManifest` | Returns an OsgiManifest object configured by the closure.

The classes in the classes dir are analyzed regarding their package dependencies and the packages they expose. Based on this the Import-Package and the Export-Package values of the OSGi Manifest are calculated. If the classpath contains jars with an OSGi bundle, the bundle information is used to specify version information for the Import-Package value. Beside the explicit properties of the `OsgiManifest` object you can add instructions.

Example 37.2. Configuration of OSGi MANIFEST.MF file

`build.gradle`

    jar {
        manifest { // the manifest of the default jar is of type OsgiManifest
            name = 'overwrittenSpecialOsgiName'
            instruction 'Private-Package',
                    'org.mycomp.package1',
                    'org.mycomp.package2'
            instruction 'Bundle-Vendor', 'MyCompany'
            instruction 'Bundle-Description', 'Platform2: Metrics 2 Measures Framework'
            instruction 'Bundle-DocURL', 'http://www.mycompany.com'
        }
    }
    task fooJar(type: Jar) {
        manifest = osgiManifest {
            instruction 'Bundle-Vendor', 'MyCompany'
        }
    }

The first argument of the instruction call is the key of the property. The other arguments form the value. To learn more about the available instructions have a look at the BND tool.