make jars to osgi compaible bundles
This is the first step to make your core jar file to a bundle that is usable in an osgi framework. Are you open for such an PR? If yes, tell me an i will complete this.
Using bnd to generate osgi compatible bundles and auto-generate jpms and services files using annotations.
-
OSGi Bundle Manifest
- @org.osgi.annotation.bundle.Export
- @aQute.bnd.annotation.licenses.MIT
- @ServiceConsumer (may be replaces by later usind osgi services)
Bundle-NativeCode:
-
META-INF/services
- @ServiceProvider(value = BoardInfoProvider.class)
-
module-info (optional) bnd doc jpms -
-jpms:instruction- @org.osgi.annotation.bundle.Header(name = "Automatic-Module-Name",value = "diozero.core")
- @aQute.bnd.annotation.jpms.ExportTo()
- @org.osgi.annotation.bundle.Export
Manifest
BEFORE:
Manifest-Version: 1.0
Created-By: Maven Jar Plugin 3.2.0
Build-Jdk-Spec: 16
Class-Path: tinylog-api-2.3.2.jar tinylog-impl-2.3.2.jar
Implementation-Title: diozero - Core
Implementation-Version: 1.3.2
Implementation-Vendor: diozero
Automatic-Module-Name: diozero.core
AFTER:
Manifest-Version: 1.0
Created-By: 16.0.1 (Oracle Corporation)
Build-Jdk-Spec: 16
Class-Path: tinylog-api-2.3.2.jar tinylog-impl-2.3.2.jar
Bnd-LastModified: 1633031009565
Bundle-Description: Java Device I/O library that is portable across Sing
le Board Computers (including Raspberry Pi, BeagleBone Black, Odroid C2
, CHIP, ASUS TinkerBoard, Allwinner H3 / H5 / H6)
Bundle-Developers: mattjlewis;email="[email protected]";name="Matth
ew Lewis"
Bundle-DocURL: https://www.diozero.com/diozero/diozero-core/
Bundle-License: "MIT License";link="https://opensource.org/licenses/MIT"
Bundle-ManifestVersion: 2
Bundle-Name: diozero - Core
Bundle-NativeCode: lib/linux-aarch64/libdiozero-system-utils.so; osname=
Linux; processor=aarch64,lib/linux-armv7/libdiozero-system-utils.so; os
name=Linux; processor=ARM,lib/linux-armv6/libdiozero-system-utils.so; o
sname=Linux; processor=armv6,lib/linux-armv7/libdiozero-system-utils.so
; osname=Linux; processor=armv7,lib/linux-x86_64/libdiozero-system-util
s.so; osname=Linux; processor=x86_64,lib/macosx-x86_64/libdiozero-syste
m-utils.so; osname=MacOSX; processor=x86_64
Bundle-SCM: url="https://github.com/mattjlewis/diozero/diozero/diozero-c
ore",connection="scm:git:https://github.com/mattjlewis/diozero.git/dioz
ero/diozero-core",developer-connection="scm:git:https://github.com/matt
jlewis/diozero.git/diozero/diozero-core",tag=HEAD
Bundle-SymbolicName: com.diozero.diozero-core
Bundle-Vendor: diozero
Bundle-Version: 1.3.2
Import-Package: org.tinylog;version="[2.3,3)"
Private-Package: boarddefs,com.diozero.animation,com.diozero.animation.e
asing,com.diozero.api,com.diozero.api.function,com.diozero.api.sandpit,
com.diozero.devices,com.diozero.devices.mcp23xxx,com.diozero.devices.mo
tor,com.diozero.devices.oled,com.diozero.devices.sandpit,com.diozero.in
ternal,com.diozero.internal.board,com.diozero.internal.board.allwinner,
com.diozero.internal.board.beaglebone,com.diozero.internal.board.chip,c
om.diozero.internal.board.odroid,com.diozero.internal.board.raspberrypi
,com.diozero.internal.board.tinkerboard,com.diozero.internal.provider.b
uiltin,com.diozero.internal.provider.builtin.gpio,com.diozero.internal.
provider.builtin.i2c,com.diozero.internal.provider.builtin.serial,com.d
iozero.internal.provider.builtin.spi,com.diozero.internal.spi,com.dioze
ro.sbc,com.diozero.util,lib.linux-aarch64,lib.linux-armv6,lib.linux-arm
v7,lib.linux-x86_64,lib.macosx-x86_64
Provide-Capability: osgi.service;objectClass:List<String>="com.diozero.i
nternal.spi.BoardInfoProvider";effective:=active,osgi.serviceloader;osg
i.serviceloader="com.diozero.internal.spi.BoardInfoProvider";register:=
"com.diozero.internal.board.allwinner.AllwinnerH5BoardInfoProvider",osg
i.serviceloader;osgi.serviceloader="com.diozero.internal.spi.BoardInfoP
rovider";register:="com.diozero.internal.board.allwinner.AllwinnerH6Boa
rdInfoProvider",osgi.serviceloader;osgi.serviceloader="com.diozero.inte
rnal.spi.BoardInfoProvider";register:="com.diozero.internal.board.allwi
nner.AllwinnerSun8iBoardInfoProvider",osgi.serviceloader;osgi.servicelo
ader="com.diozero.internal.spi.BoardInfoProvider";register:="com.diozer
o.internal.board.beaglebone.BeagleBoneBoardInfoProvider",osgi.servicelo
ader;osgi.serviceloader="com.diozero.internal.spi.BoardInfoProvider";re
gister:="com.diozero.internal.board.chip.ChipBoardInfoProvider",osgi.se
rviceloader;osgi.serviceloader="com.diozero.internal.spi.BoardInfoProvi
der";register:="com.diozero.internal.board.odroid.OdroidBoardInfoProvid
er",osgi.serviceloader;osgi.serviceloader="com.diozero.internal.spi.Boa
rdInfoProvider";register:="com.diozero.internal.board.raspberrypi.Raspb
erryPiBoardInfoProvider",osgi.serviceloader;osgi.serviceloader="com.dio
zero.internal.spi.BoardInfoProvider";register:="com.diozero.internal.bo
ard.tinkerboard.TinkerBoardBoardInfoProvider"
Require-Capability: osgi.extender;filter:="(&(osgi.extender=osgi.service
loader.processor)(version>=1.0.0)(!(version>=2.0.0)))";resolution:=opti
onal,osgi.extender;filter:="(&(osgi.extender=osgi.serviceloader.registr
ar)(version>=1.0.0)(!(version>=2.0.0)))",osgi.serviceloader;filter:="(o
sgi.serviceloader=com.diozero.internal.spi.BoardInfoProvider)";osgi.ser
viceloader="com.diozero.internal.spi.BoardInfoProvider";resolution:=opt
ional,osgi.serviceloader;filter:="(osgi.serviceloader=com.diozero.inter
nal.spi.NativeDeviceFactoryInterface)";osgi.serviceloader="com.diozero.
internal.spi.NativeDeviceFactoryInterface";resolution:=optional,osgi.ee
;filter:="(&(osgi.ee=JavaSE)(version=1.8))"
Tool: Bnd-5.3.0.202102221516
Optional generated module-info.class
// (version 9 : 53.0, no super bit)
module com.diozero.diozero-core {
// Version: 1.3.2
requires java.base;
requires java.desktop;
requires tinylog-api;
uses com.diozero.internal.spi.BoardInfoProvider
uses com.diozero.internal.spi.NativeDeviceFactoryInterface
provides com.diozero.internal.spi.BoardInfoProvider with com.diozero.internal.board.allwinner.AllwinnerH5BoardInfoProvider, com.diozero.internal.board.allwinner.AllwinnerH6BoardInfoProvider, com.diozero.internal.board.allwinner.AllwinnerSun8iBoardInfoProvider, com.diozero.internal.board.beaglebone.BeagleBoneBoardInfoProvider, com.diozero.internal.board.chip.ChipBoardInfoProvider, com.diozero.internal.board.odroid.OdroidBoardInfoProvider, com.diozero.internal.board.raspberrypi.RaspberryPiBoardInfoProvider, com.diozero.internal.board.tinkerboard.TinkerBoardBoardInfoProvider;
Module packages:
boarddefs
com.diozero.animation
com.diozero.animation.easing
com.diozero.api
com.diozero.api.function
com.diozero.api.sandpit
com.diozero.devices
com.diozero.devices.mcp23xxx
com.diozero.devices.motor
com.diozero.devices.oled
com.diozero.devices.sandpit
com.diozero.internal
com.diozero.internal.board
com.diozero.internal.board.allwinner
com.diozero.internal.board.beaglebone
com.diozero.internal.board.chip
com.diozero.internal.board.odroid
com.diozero.internal.board.raspberrypi
com.diozero.internal.board.tinkerboard
com.diozero.internal.provider.builtin
com.diozero.internal.provider.builtin.gpio
com.diozero.internal.provider.builtin.i2c
com.diozero.internal.provider.builtin.serial
com.diozero.internal.provider.builtin.spi
com.diozero.internal.spi
com.diozero.sbc
com.diozero.util
}
Thanks for this. Very happy to change the MANIFEST.MF file, however, I don't want to add any additional dependencies. From a quick look at this, it would appear this would be relying on OSGi for service loading rather than the standard JDK ServiceLoader? I rely on ServiceLoader to resolve the device factory as well as the detected board.
I let you service loader ability as it is. I just removed s/META-INF/services/com.diozero.internal.spi.BoardInfoProvider because it is now generated
I just used annotations to allow that workl in osgi. This adds just requirements and capabilities to the manifest. Also other Things i like to add does not add additional dependencies.
The annotations only exist are processed at buildtime.
Have a look on the import package Header in the manifest. Just you dependencie exist.
I