diff --git a/build.gradle b/build.gradle index e2c395b3..2a7924fc 100644 --- a/build.gradle +++ b/build.gradle @@ -13,8 +13,22 @@ def getScalaSuffix(scalaVersion) { return scalaVersion.startsWith('2.10') ? '_2.10' : "_$scalaVersion" } -subprojects { +/* Helper to build OSGI package lists with explicit version spec. + * By default the osgi plugin adds version range such as (0.6.91,1.0] + * for import-package. To avoid missmatch we want exact version. + * Downside: Manual package lists in gradle... + * Alternative is to use -consumer-policy directive to force ==, but + * that applies to external imports too which is undesired. + */ +def createOsgiVersionedPackageList(pkgs) { + def out = [] + for(String pkg: pkgs){ + out.add(pkg + ';version="'+version+'"') + } + return out.join(',') +} +subprojects { // the cross built scala modules share the same source directories so we need to make their output directories unique buildDir = "${rootProject.buildDir}/$name" diff --git a/cluster/build.gradle b/cluster/build.gradle index 94829ff5..9cfaf178 100644 --- a/cluster/build.gradle +++ b/cluster/build.gradle @@ -1,5 +1,6 @@ apply plugin: 'java' apply plugin: 'scala' +apply plugin: 'osgi' dependencies { compile externalDependency.scalaLibrary @@ -17,3 +18,11 @@ dependencies { testCompile externalDependency.junit } +jar{ + manifest { + name = 'Norbert Cluster' + symbolicName = 'com.linkedin.norbert.cluster' + instruction 'Bundle-Description', 'Norbert Cluster' + instruction 'Bundle-Vendor', 'LinkedIn' + } +} diff --git a/java-cluster/build.gradle b/java-cluster/build.gradle index dd59778b..e61e1d7f 100644 --- a/java-cluster/build.gradle +++ b/java-cluster/build.gradle @@ -1,8 +1,23 @@ apply plugin: 'java' apply plugin: 'scala' +apply plugin: 'osgi' dependencies { compile project(":cluster$scalaSuffix") compile externalDependency.scalaLibrary } +ext.osgi_local_imports = [ + 'com.linkedin.norbert.cluster', + 'com.linkedin.norbert.cluster.memory'] + +jar{ + manifest { + name = 'Norbert Java Cluster' + symbolicName = 'com.linkedin.norbert.java-cluster' + instruction 'Bundle-Description', 'Norbert Java Cluster' + instruction 'Bundle-Vendor', 'LinkedIn' + instruction 'Import-Package', createOsgiVersionedPackageList(osgi_local_imports) + ',*' + } +} + diff --git a/java-network/build.gradle b/java-network/build.gradle index 8d17490f..2b76d1fd 100644 --- a/java-network/build.gradle +++ b/java-network/build.gradle @@ -1,5 +1,6 @@ apply plugin: 'java' apply plugin: 'scala' +apply plugin: 'osgi' dependencies { compile project(":network$scalaSuffix") @@ -8,3 +9,30 @@ dependencies { compile externalDependency.scalaLibrary } +ext.osgi_local_imports = [ + 'com.linkedin.norbert.cluster', + 'com.linkedin.norbert.javacompat', + 'com.linkedin.norbert.javacompat.cluster', + 'com.linkedin.norbert.network', + 'com.linkedin.norbert.network.client', + 'com.linkedin.norbert.network.client.loadbalancer', + 'com.linkedin.norbert.network.common', + 'com.linkedin.norbert.network.netty', + 'com.linkedin.norbert.network.partitioned', + 'com.linkedin.norbert.network.partitioned.loadbalancer', + 'com.linkedin.norbert.network.server'] + +jar{ + manifest { + name = 'Norbert Java Network' + symbolicName = 'com.linkedin.norbert.java-network' + instruction 'Bundle-Description', 'Norbert Java Network' + instruction 'Bundle-Vendor', 'LinkedIn' + /* We must not export com.linkedin.norbert as it collides with cluster bundle. + * However, using '!com.linkedin.norbert,*' did for some reason remove the version + * information, making importing of the package impossible. + */ + instruction 'Export-Package', 'com.linkedin.norbert.javacompat.network;version="'+version+'"' + instruction 'Import-Package', createOsgiVersionedPackageList(osgi_local_imports) + ',*' + } +} diff --git a/network/build.gradle b/network/build.gradle index 709fa614..cbf9a5df 100644 --- a/network/build.gradle +++ b/network/build.gradle @@ -1,5 +1,6 @@ apply plugin: 'java' apply plugin: 'scala' +apply plugin: 'osgi' dependencies { compile project(":cluster$scalaSuffix") @@ -18,3 +19,20 @@ dependencies { testCompile externalDependency.junit } +ext.osgi_local_imports = [ + 'com.linkedin.norbert', + 'com.linkedin.norbert.cluster', + 'com.linkedin.norbert.jmx', + 'com.linkedin.norbert.logging', + 'com.linkedin.norbert.norbertutils', + 'com.linkedin.norbert.protos'] + +jar{ + manifest { + name = 'Norbert Network' + symbolicName = 'com.linkedin.norbert.network' + instruction 'Bundle-Description', 'Norbert Network' + instruction 'Bundle-Vendor', 'LinkedIn' + instruction 'Import-Package', createOsgiVersionedPackageList(osgi_local_imports) + ',*' + } +}