diozero icon indicating copy to clipboard operation
diozero copied to clipboard

make jars to osgi compaible bundles

Open stbischof opened this issue 4 years ago • 2 comments

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

}

stbischof avatar Sep 30 '21 20:09 stbischof

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.

mattjlewis avatar Oct 02 '21 09:10 mattjlewis

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

stbischof avatar Oct 02 '21 09:10 stbischof