You, me and jigsaw Tom Schindl <tom.schindl@bestsolution.at> - - PowerPoint PPT Presentation

you me and jigsaw
SMART_READER_LITE
LIVE PREVIEW

You, me and jigsaw Tom Schindl <tom.schindl@bestsolution.at> - - PowerPoint PPT Presentation

You, me and jigsaw Tom Schindl <tom.schindl@bestsolution.at> Twitter: @tomsontom Blog: http://tomsondev.bestsolution.at Website: http://www.bestsolution.at About Tom CTO BestSolution.at Systemhaus GmbH Eclipse Committer e4


slide-1
SLIDE 1

You, me and jigsaw

Tom Schindl <tom.schindl@bestsolution.at> Twitter: @tomsontom Blog: http://tomsondev.bestsolution.at Website: http://www.bestsolution.at

slide-2
SLIDE 2

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

About Tom

  • CTO BestSolution.at Systemhaus GmbH
  • Eclipse Committer
  • e4
  • Platform
  • EMF
  • Project lead
  • e(fx)clipse
  • Twitter: @tomsontom
  • Blog: tomsondev.bestsolution.at
  • Corporate: http://bestsolution.at
slide-3
SLIDE 3

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

The target of jigsaw

slide-4
SLIDE 4

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

The target of jigsaw

  • Main target split of the rt.jar into smaller pieces
slide-5
SLIDE 5

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

The target of jigsaw

  • Main target split of the rt.jar into smaller pieces
  • Easier to maintain
slide-6
SLIDE 6

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

The target of jigsaw

  • Main target split of the rt.jar into smaller pieces
  • Easier to maintain
  • Avoid people from accessing internal APIs (misc.Unfafe)
slide-7
SLIDE 7

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

The target of jigsaw

  • Main target split of the rt.jar into smaller pieces
  • Easier to maintain
  • Avoid people from accessing internal APIs (misc.Unfafe)
  • Allow to ship stripped down JREs with applications
slide-8
SLIDE 8

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

The target of jigsaw

  • Main target split of the rt.jar into smaller pieces
  • Easier to maintain
  • Avoid people from accessing internal APIs (misc.Unfafe)
  • Allow to ship stripped down JREs with applications

user@system: java -listmods

java.activation@9-ea java.annotations.common@9-ea java.base@9-ea java.compact1@9-ea java.compact2@9-ea java.compact3@9-ea java.compiler@9-ea java.corba@9-ea // …

slide-9
SLIDE 9

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

The target of jigsaw

slide-10
SLIDE 10

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

The target of jigsaw

  • The 2nd target is to allow applications developers to

write modular applications

slide-11
SLIDE 11

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

The target of jigsaw

  • The 2nd target is to allow applications developers to

write modular applications

  • Using the Java9 modules for your code is OPTIONAL
slide-12
SLIDE 12

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

The target of jigsaw

  • The 2nd target is to allow applications developers to

write modular applications

  • Using the Java9 modules for your code is OPTIONAL
  • Java code not included in a module is wrapped at

runtime in an UNAMED-Module

slide-13
SLIDE 13

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

The target of jigsaw

  • The 2nd target is to allow applications developers to

write modular applications

  • Using the Java9 modules for your code is OPTIONAL
  • Java code not included in a module is wrapped at

runtime in an UNAMED-Module

  • Your existing application (whether OSGi based or not)

will run unmodified on Java9

slide-14
SLIDE 14

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

The target of jigsaw

  • The 2nd target is to allow applications developers to

write modular applications

  • Using the Java9 modules for your code is OPTIONAL
  • Java code not included in a module is wrapped at

runtime in an UNAMED-Module

  • Your existing application (whether OSGi based or not)

will run unmodified on Java9

  • (as long as you not touch into JDK internals)
slide-15
SLIDE 15

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Show some source code

  • You can find out information at runtime using

Class#getModule()

slide-16
SLIDE 16

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Show some source code

  • You can find out information at runtime using

Class#getModule()

public class Sample1 { public static void main(String[] args) { System.err.println( String.class + " is in Module '" + String.class.getModule().getName() + "'" ); System.err.println( javax.swing.JPanel.class + " is in Module '" + javax.swing.JPanel.class.getModule().getName() + "'" ); System.err.println( Sample1.class + " is in Module '" + Sample1.class.getModule().getName() + "'" ); } }

slide-17
SLIDE 17

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Show some source code

  • You can find out information at runtime using

Class#getModule()

public class Sample1 { public static void main(String[] args) { System.err.println( String.class + " is in Module '" + String.class.getModule().getName() + "'" ); System.err.println( javax.swing.JPanel.class + " is in Module '" + javax.swing.JPanel.class.getModule().getName() + "'" ); System.err.println( Sample1.class + " is in Module '" + Sample1.class.getModule().getName() + "'" ); } } javac src/sample/Sample1.java java -cp src sample.Sample1

slide-18
SLIDE 18

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Show some source code

  • You can find out information at runtime using

Class#getModule()

public class Sample1 { public static void main(String[] args) { System.err.println( String.class + " is in Module '" + String.class.getModule().getName() + "'" ); System.err.println( javax.swing.JPanel.class + " is in Module '" + javax.swing.JPanel.class.getModule().getName() + "'" ); System.err.println( Sample1.class + " is in Module '" + Sample1.class.getModule().getName() + "'" ); } } user@system: java sample.Sample1

class java.lang.String is in Module 'java.base' class javax.swing.JPanel is in Module 'java.desktop' class sample.Sample1 is in Module 'null'

javac src/sample/Sample1.java java -cp src sample.Sample1

slide-19
SLIDE 19

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Anantomy of a Java9 Module

  • Module information is encoded in a java file named module-

info.java/.class

slide-20
SLIDE 20

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Anantomy of a Java9 Module

  • Module information is encoded in a java file named module-

info.java/.class

OSGi

Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-SymbolicName: myfoobar Require-Bundle: com.foo, com.bar Export-Package: com.mybar, com.myfoo

MANIFEST.MF

slide-21
SLIDE 21

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Anantomy of a Java9 Module

  • Module information is encoded in a java file named module-

info.java/.class

OSGi

Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-SymbolicName: myfoobar Require-Bundle: com.foo, com.bar Export-Package: com.mybar, com.myfoo

MANIFEST.MF

module myfoobar{ requires com.foo; requires com.bar; exports com.mybar; exports com.myfoo; }

Java9 module module-info.java

slide-22
SLIDE 22

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Anantomy of a Java9 Module

  • Things to take a way
  • Java9 modules use the OSGi-Require-Bundle strategy to

express dependencies

  • Java9 modules explicitly have to export packages like

OSGi to make them accessible

slide-23
SLIDE 23

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Show some source code

  • Build a module
slide-24
SLIDE 24

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Show some source code

  • Build a module

module BasicModule { }

module-info.java

slide-25
SLIDE 25

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Show some source code

  • Build a module

module BasicModule { }

module-info.java

javac -modulepath ../mods -d ../mods/BasicModule src/module-info.java src/sample/Sample1.java java -modulepath ../mods -m BasicModule/sample.Sample1

slide-26
SLIDE 26

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Show some source code

  • Build a module

module BasicModule { }

module-info.java

javac -modulepath ../mods -d ../mods/BasicModule src/module-info.java src/sample/Sample1.java java -modulepath ../mods -m BasicModule/sample.Sample1

src/sample/Sample1.java:9: error: package javax.swing does not exist System.err.println( javax.swing.JPanel.class ^ src/sample/Sample1.java:11: error: package javax.swing does not exist + javax.swing.JPanel.class.getModule().getName() +"'" ); ^ 2 errors class java.lang.String is in Module 'java.base' Exception in thread "main" java.lang.IllegalAccessError: class sample.Sample1 (in module BasicModule) cannot access class javax.swing.JPanel (in module java.desktop) because module BasicModule does not read module java.desktop at sample.Sample1.main(BasicModule/Sample1.java:9)

slide-27
SLIDE 27

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Show some source code

  • Build a module

module BasicModule { }

module-info.java

javac -modulepath ../mods -d ../mods/BasicModule src/module-info.java src/sample/Sample1.java java -modulepath ../mods -m BasicModule/sample.Sample1

src/sample/Sample1.java:9: error: package javax.swing does not exist System.err.println( javax.swing.JPanel.class ^ src/sample/Sample1.java:11: error: package javax.swing does not exist + javax.swing.JPanel.class.getModule().getName() +"'" ); ^ 2 errors class java.lang.String is in Module 'java.base' Exception in thread "main" java.lang.IllegalAccessError: class sample.Sample1 (in module BasicModule) cannot access class javax.swing.JPanel (in module java.desktop) because module BasicModule does not read module java.desktop at sample.Sample1.main(BasicModule/Sample1.java:9) class java.lang.String is in Module 'java.base' class javax.swing.JPanel is in Module 'java.desktop' class sample.Sample1 is in Module ‚BasicModule'

slide-28
SLIDE 28

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Anantomy of a Java9 Module

  • Is it really based on Require-Bundle????
  • Yep it is
  • Is that a problem
  • Yep IMHO it is
slide-29
SLIDE 29

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

The Require-Bundle problem

pre Java9 world

slide-30
SLIDE 30

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

The Require-Bundle problem

pre Java9 world

guava-19.jar lib-a.jar lib-b.jar

slide-31
SLIDE 31

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

The Require-Bundle problem

pre Java9 world

guava-19.jar lib-a.jar lib-b.jar

slide-32
SLIDE 32

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

The Require-Bundle problem

pre Java9 world

guava-19.jar lib-a.jar lib-b.jar myApp.jar

slide-33
SLIDE 33

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

The Require-Bundle problem

Java9 world

slide-34
SLIDE 34

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

The Require-Bundle problem

Java9 world

lib-a.jmod lib-b.jmod myApp.jmod

slide-35
SLIDE 35

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

The Require-Bundle problem

Java9 world

lib-a.jmod lib-b.jmod myApp.jmod google.guava-19.jmod

slide-36
SLIDE 36

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

The Require-Bundle problem

Java9 world

lib-a.jmod lib-b.jmod myApp.jmod com.google.guava-19.jmod google.guava-19.jmod

slide-37
SLIDE 37

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Java9 Module and Reflection

  • OSGi modularity is built on Classloaders
  • Java9 modularity is built on the VM
  • Suppose the following situation

Module A

export bar

Module B

export foo

Module C

requires ModuleA & ModuleB

slide-38
SLIDE 38

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Java9 Module and Reflection

slide-39
SLIDE 39

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Java9 Module and Reflection

import serializer.Serializer; import sample.Sample1; public class User { public static void main(String[] args) { System.err.println("VALUE: " + Serializer.createInstance(Sample1.class)); } }

slide-40
SLIDE 40

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Java9 Module and Reflection

import serializer.Serializer; import sample.Sample1; public class User { public static void main(String[] args) { System.err.println("VALUE: " + Serializer.createInstance(Sample1.class)); } } public class Serializer { public static <T> T createInstance(Class<T> clazz) { try { java.lang.reflect.Constructor<?> c = clazz.getDeclaredConstructors()[0]; c.setAccessible(true); return (T)c.newInstance(); } catch( Throwable t ) { throw new RuntimeException(t); } } }

slide-41
SLIDE 41

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Java9 Module and Reflection

import serializer.Serializer; import sample.Sample1; public class User { public static void main(String[] args) { System.err.println("VALUE: " + Serializer.createInstance(Sample1.class)); } } public class Serializer { public static <T> T createInstance(Class<T> clazz) { try { java.lang.reflect.Constructor<?> c = clazz.getDeclaredConstructors()[0]; c.setAccessible(true); return (T)c.newInstance(); } catch( Throwable t ) { throw new RuntimeException(t); } } }

Produces a runtime exception

slide-42
SLIDE 42

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Java9 Module and Reflection

import serializer.Serializer; import sample.Sample1; public class User { public static void main(String[] args) { System.err.println("VALUE: " + Serializer.createInstance(Sample1.class)); } } public class Serializer { public static <T> T createInstance(Class<T> clazz) { try { java.lang.reflect.Constructor<?> c = clazz.getDeclaredConstructors()[0]; c.setAccessible(true); return (T)c.newInstance(); } catch( Throwable t ) { throw new RuntimeException(t); } } }

Produces a runtime exception

public class Serializer { public static <T> T createInstance(Class<T> clazz) { try { Serializer.class.getModule().addReads( clazz.getModule() ); java.lang.reflect.Constructor<?> c = clazz.getDeclaredConstructors()[0]; c.setAccessible(true); return (T)c.newInstance(); } catch( Throwable t ) { throw new RuntimeException(t); } } }

slide-43
SLIDE 43

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Java9 Module and Reflection

import serializer.Serializer; import sample.Sample1; public class User { public static void main(String[] args) { System.err.println("VALUE: " + Serializer.createInstance(Sample1.class)); } } public class Serializer { public static <T> T createInstance(Class<T> clazz) { try { java.lang.reflect.Constructor<?> c = clazz.getDeclaredConstructors()[0]; c.setAccessible(true); return (T)c.newInstance(); } catch( Throwable t ) { throw new RuntimeException(t); } } }

Produces a runtime exception

public class Serializer { public static <T> T createInstance(Class<T> clazz) { try { Serializer.class.getModule().addReads( clazz.getModule() ); java.lang.reflect.Constructor<?> c = clazz.getDeclaredConstructors()[0]; c.setAccessible(true); return (T)c.newInstance(); } catch( Throwable t ) { throw new RuntimeException(t); } } }

slide-44
SLIDE 44

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Java9 Module and Reflection

import serializer.Serializer; import sample.Sample1; public class User { public static void main(String[] args) { System.err.println("VALUE: " + Serializer.createInstance(Sample1.class)); } } public class Serializer { public static <T> T createInstance(Class<T> clazz) { try { java.lang.reflect.Constructor<?> c = clazz.getDeclaredConstructors()[0]; c.setAccessible(true); return (T)c.newInstance(); } catch( Throwable t ) { throw new RuntimeException(t); } } }

Produces a runtime exception

public class Serializer { public static <T> T createInstance(Class<T> clazz) { try { Serializer.class.getModule().addReads( clazz.getModule() ); java.lang.reflect.Constructor<?> c = clazz.getDeclaredConstructors()[0]; c.setAccessible(true); return (T)c.newInstance(); } catch( Throwable t ) { throw new RuntimeException(t); } } } mark.reinhold at oracle.com mark.reinhold at oracle.com Tue Mar 1 17:42:05 UTC 2016 Previous message: Preparing for EDR: Issue summary Next message: SO files in module images and SELinux Messages sorted by: [ date ] [ thread ] [ subject ] [ author ] Issue summary [1]: Having to add read edges dynamically just to enable reflection is painful, and could slow migration and adoption. Consider relaxing the access model so that reflection does not require, or perhaps simply assumes, readability. Proposal: Adopt the second alternative suggested in the summary. Revise the core reflection APIs (java.lang.reflect) to assume that any module that contains code that invokes a reflective operation can read the module that defines the types that are the subject of that operation. As a consequence, most code that uses reflection will not have to take the trouble to add readability edges manually. Code of this form that was previously added to the prototype implementation will be removed. This proposal does weaken the fidelity story a tiny bit, in the sense that you'll be able to do more at run time than you can in earlier phases, but that seems a worthwhile tradeoff in order to ease migration.

  • Mark
slide-45
SLIDE 45

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Final step package up

  • Constructing your custom Java-Install is called linking
slide-46
SLIDE 46

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Final step package up

  • Constructing your custom Java-Install is called linking

user@host: jlink --modulepath ../../jmods:../mods/ --addmods Serializer,User --output myimage

slide-47
SLIDE 47

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Final step package up

  • Constructing your custom Java-Install is called linking

user@host: jlink --modulepath ../../jmods:../mods/ --addmods Serializer,User --output myimage user@host: myimage/bin/java -listmods BasicModule Serializer User java.base@9-ea java.datatransfer@9-ea java.desktop@9-ea java.prefs@9-ea java.xml@9-ea

slide-48
SLIDE 48

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

Final step package up

  • Constructing your custom Java-Install is called linking

user@host: jlink --modulepath ../../jmods:../mods/ --addmods Serializer,User --output myimage user@host: myimage/bin/java -listmods BasicModule Serializer User java.base@9-ea java.datatransfer@9-ea java.desktop@9-ea java.prefs@9-ea java.xml@9-ea user@host: myimage/bin/java user.User

slide-49
SLIDE 49

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

So what’s a .jmod file?

slide-50
SLIDE 50

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

So what’s a .jmod file?

  • jmod is the deployment unit for Java9 modules
slide-51
SLIDE 51

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

So what’s a .jmod file?

  • jmod is the deployment unit for Java9 modules
  • the format of jmod is NOT fixed
slide-52
SLIDE 52

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

So what’s a .jmod file?

  • jmod is the deployment unit for Java9 modules
  • the format of jmod is NOT fixed
  • what’s guaranteed is that jmods can be read using NIO.2
slide-53
SLIDE 53

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

So what’s a .jmod file?

  • jmod is the deployment unit for Java9 modules
  • the format of jmod is NOT fixed
  • what’s guaranteed is that jmods can be read using NIO.2

class JModSample { public static void main(String[] args) throws Exception { FileSystem fs = FileSystems.newFileSystem(Paths.get( "…/jmods/java.activation.jmod" ), null); Path root = fs.getPath("/"); Files.walkFileTree(root, new SimpleFileVisitor<Path>() { public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { System.err.println("Found: " + file); return FileVisitResult.CONTINUE; } }); } }

slide-54
SLIDE 54

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

e4 and Java9 Modules

slide-55
SLIDE 55

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

e4 and Java9 Modules

  • e4 & OSGi applications run unmodified on Java9
slide-56
SLIDE 56

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

e4 and Java9 Modules

  • e4 & OSGi applications run unmodified on Java9
  • Could e4 ditch OSGi in favor of Java9 modules
slide-57
SLIDE 57

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

e4 and Java9 Modules

  • e4 & OSGi applications run unmodified on Java9
  • Could e4 ditch OSGi in favor of Java9 modules
  • Short them no
slide-58
SLIDE 58

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

e4 and Java9 Modules

  • e4 & OSGi applications run unmodified on Java9
  • Could e4 ditch OSGi in favor of Java9 modules
  • Short them no
  • Midterm probably - we (BestSolution) are looking at

that doing that for e4 on JavaFX

slide-59
SLIDE 59

(c) BestSolution.at - Licensed under Creative Commons Attribution-NonCommerical-ShareAlike 3.0

e4 and Java9 Modules

  • e4 & OSGi applications run unmodified on Java9
  • Could e4 ditch OSGi in favor of Java9 modules
  • Short them no
  • Midterm probably - we (BestSolution) are looking at

that doing that for e4 on JavaFX

  • Biggest stumbling block was/is the OSGi-Service-

Registry