OSGi vs Spaghetti - Part II, The Enterprise strikes back

A presentation at JFokus in February 2013 in Stockholm, Sweden by Holly Cummins

Slide 1

Slide 1

OSGi vs Spaghetti Part II The Enterprise Strikes Back Holly Cummins IBM @holly_cummins © 2012 IBM Corporation

Slide 2

Slide 2

Who am I? @holly_cummins ■ ■ Developer with IBM –WebSphere Liberty Profile –OSGi –Java performance ■ Apache Aries committer © 2012 IBM Corporation

Slide 3

Slide 3

Enterprise OSGi in Action ■ I’m one of the authors :) –Early access available at http://www.manning.com/ cummins © 2012 IBM Corporation

Slide 4

Slide 4

How did we get here? © 2012 IBM Corporation

Slide 5

Slide 5

Slide 6

Slide 6

A New Hope ● A long time ago, in a galaxy far far away … ● (well, maybe fifteen years ago) … ● Java EE was born ● It was really good at the web … ● … and data … ● ● … but didn’t have much to say on modularity … … or dynamism …

Slide 7

Slide 7

Slide 8

Slide 8

Another New Hope ● A long time ago, in a galaxy far far away … ● (well, maybe fifteen years ago) … ● OSGi was born ● It was really good at modularity … ● … and dynamism … ● … but didn’t have much to say on data … ● … or the web …

Slide 9

Slide 9

As a user, you had a choice. © 2012 IBM Corporation

Slide 10

Slide 10

What is “Enterprise OSGi” and why do I need it? © 2012 IBM Corporation

Slide 11

Slide 11

■ OSGi is a mature technology with a broad range of adoption – Eclipse – Embedded systems – Home automation – Java EE Application Servers – ■ Enterprise OSGi is much newer (First release 2010) – Primary focus to improve OSGi’s support for enterprise tools – Widely available in Open Source and Commercial servers © 2012 IBM Corporation

Slide 12

Slide 12

What is “Enterprise OSGi” and why do I need it? (2) ■ Enterprise OSGi is just OSGi applied to “Enterprise” Applications –OSGi Web applications –Using databases from an OSGi framework –Managed Transactions for OSGi bundles –Remoting Services… ■ But isn’t this what Java EE is for? –Why is OSGi helpful? © 2012 IBM Corporation

Slide 13

Slide 13

What is “Enterprise OSGi” and why do I need it? (3) ■ OSGi enables modularity – OSGi enforces modularity – Big systems are hard to maintain and understand because of the relationships between components: ■ Big applications are just as complicated as servers (and usually have more external dependencies!) © 2012 IBM Corporation

Slide 14

Slide 14

Why I need OSGi in my WAR ■ Big WAR files are often bigger than the servers they run on – TomCat core is available to download as a 7 MB zip file! ■ Why are these WARs so big? – Do I really need all those libraries? – Why does Maven insist on putting the Java Mail API in WEB-INF/lib? ■ Why can’t my WAR be more dynamic? – Do I really need to restart the application to add a new Payment Type? © 2012 IBM Corporation

Slide 15

Slide 15

Why else do I need OSGi in my WAR? ■ Have you ever found that you need to use a library class, but it depends on another version of a library you were already using? – Java has a flat classpath, so you can only have one version of the class – If you can’t change the code you can be forced into using brittle combinations of point releases ■ OSGi has a classloader graph: – It all just works! Building Modular Applications with Enterprise OSGi | Tim Ward & Holly Cummins 16. Nov 2012 Slide © 2012 IBM Corporation

Slide 16

Slide 16

How can I use Enterprise OSGi in my WARs? © 2012 IBM Corporation

Slide 17

Slide 17

How can I use Enterprise OSGi in my WARs? ■ Lots of Application runtimes offer support for OSGi applications – WebSphere, Glassfish, Jboss, Geronimo, Karaf,Virgo, Aries… ■ Most require little more than packaging your application as OSGi bundles – A JAR with a special manifest OSGi JAR Bundle Manifest Bundle-ManifestVersion: 2 Bundle-SymbolicName: com.acme.my.bundle Bundle-Version: 1.0.0 Import-Package: com.acme.useful.package, com.acme.another.useful.package Export-Package: com.acme.api.package © 2012 IBM Corporation

Slide 18

Slide 18

How can I use Enterprise OSGi in my WARs? (2) ■ But we don’t want to run a JAR, we want to run a WAR –WARs and JARs are similar, with different internal structure JAR WAR META-INF/Manifest.mf META-INF/Manifest.mf Web Descriptor X WEB-INF/web.xml Classes location / /WEB-INF/classes Nested libraries X /WEB-INF/lib Non-classpath resources X / Manifest file © 2012 IBM Corporation

Slide 19

Slide 19

How can I use Enterprise OSGi in my WARs? (3) ■ The lack of WAR support in OSGi was a serious limitation –Moving to the OSGi HTTP Service is non-trivial! ■ The OSGi Enterprise Expert Group created the OSGi Web Applications Specification –Simple support for Web Application Bundles (WABs) –Re-use existing Web deployment descriptors –It must be possible to be a valid WAR and a WAB at the same time! © 2012 IBM Corporation

Slide 20

Slide 20

Structure of a Web Application Bundle ■ First and foremost a Web Application Bundle is an OSGi bundle – It must specify the required OSGi metadata ■ Secondly it must include the Web-ContextPath header – This defines the context root for the WAB ■ Thirdly, if you want to use the standard WAR classpath – Bundle-ClassPath: WEB-INF/classes, WEB-INF/lib/myJar.jar… © 2012 IBM Corporation

Slide 21

Slide 21

Structure of a Web Application Bundle (2) OSGiBundle WAB OSGi Manifest Manifest WEB-INF/ classes/ MyServlet.class lib/ myLibrary.jar Bundle-ManifestVersion: 2 Bundle-SymbolicName: com.acme.my.wab Bundle-Version: 1.0.0 Import-Package: javax.servlet;version=“[2.5,3.0)” Export-Package: com.acme.api.package Web-ContextPath: myWAB/ Bundle-ClassPath: Web-INF/classes, WEB-INF/lib/myLibrary.jar © 2012 IBM Corporation

Slide 22

Slide 22

So what does migration give me? ■ If you just put the relevant OSGi metadata in your WAR’s manifest you have migrated your WAR to OSGi! – Your WAR is still the same size as before (approximately) – You aren’t using any of OSGi’s features ■ Remember the Import-Package header? – Using this allows you to move JARs out of your WAR • You can also move out the dependencies that JAR pulled in! ■ Version conflicts between higher order dependencies disappear! – Deployment is faster (particularly annotation scanning!) © 2012 IBM Corporation

Slide 23

Slide 23

How do I develop and build a WAB? © 2012 IBM Corporation

Slide 24

Slide 24

Before you start: The Great Manifest Debate ■ We all like tools – Tools can help with the manifest • “Manifest-first” approach – Tools can write the manifest • “Code-first” approach © 2012 IBM Corporation

Slide 25

Slide 25

Manifest-first tools ■ Develop – Eclipse PDE ■ Build – Maven Tycho – Plain-old-Ant © 2012 IBM Corporation

Slide 26

Slide 26

Code-first tools ■ Develop: – Whatever you like! • (Or Eclipse and BndTools if you’re feeling fancy :) ) ■ Build – Maven build plugin © 2012 IBM Corporation

Slide 27

Slide 27

Enterprise-OSGi tools ■ Eclipse Libra ■ IBM’s OSGi Application Development Tools –(What we’ll be using today) © 2012 IBM Corporation

Slide 28

Slide 28

Handling thirdparty libraries © 2012 IBM Corporation

Slide 29

Slide 29

Options for dependencies ■ Your jar is already a bundle! –Remember, a bundle is a jar ■ Use a newer version, which is a bundle ■ Find a wrapped bundle Somewhere ■ Consider an alternative ■ Wrap your own bundle ■ Embed the jar into your bundle © 2012 IBM Corporation

Slide 30

Slide 30

Finding OSGi-fied bundles ■ SpringSource Enterprise Bundle Repository ■ Maven Central – Same bundle, different group id © 2012 IBM Corporation

Slide 31

Slide 31

Wrapping bundles ■ Use bnd java -jar biz.aQute.bnd.jar wrap some.jar – Creates “some.bar” – All classes externally visible – All dependencies optional – You may wish to adjust these defaults © 2012 IBM Corporation

Slide 32

Slide 32

Embedding jars ■ Eliminates many classloading visibility problems ■ Your bundle and third-party library share a class-space ■ Not the most-space-efficient option © 2012 IBM Corporation

Slide 33

Slide 33

One more thing … © 2012 IBM Corporation

Slide 34

Slide 34

The magic of OSGi services ■ Elegant solution to the factory pattern ■ Look up service based on interface ■ 100% Dynamic ■ But … –Don’t use the API directly –Inject dependencies • Blueprint • Declarative Services © 2012 IBM Corporation

Slide 35

Slide 35

Demo Maybe With luck With lots of luck © 2012 IBM Corporation

Slide 36

Slide 36

Summary © 2012 IBM Corporation

Slide 37

Slide 37

Things to remember ■ OSGi isn’t as hard as you’ve been led to believe! – But it isn’t magic either – You can still have a badly-modularised application, even with OSGi Building Modular Applications with Enterprise OSGi | Tim Ward & Holly Cummins 16. Nov 2012 Slide © 2012 IBM Corporation

Slide 38

Slide 38

Useful Resources ■ The OSGi specifications are available at http://www.osgi.org ■ Apache Aries for implementations http://aries.apache.org/ ■ Manning have several good OSGi books – Enterprise OSGi in Action – Get up and running with Web Apps, Transactions, JPA, Remoting, IDEs and build tools • Use the code eosgi37 at http://www.manning.com/cummins for 37% off! – OSGi in Action – Great examples and coverage of core OSGi and compendium services – OSGi in Depth – Detailed coverage of architectural patterns for OSGi ■ OSGi Articles available at http://www.developerworks.com Slide © 2012 IBM Corporation

Slide 39

Slide 39

© 2012 IBM Corporation

Slide 40

Slide 40

Common problems © 2012 IBM Corporation

Slide 41

Slide 41

Reflection ■ No bytecode dependency ■ No auto-detection of import by bnd © 2012 IBM Corporation

Slide 42

Slide 42

Properties files ■ The same rules apply to properties files as classes ■ Export pseudo-package for properties Export-Package: some.props.folder ■ Import pseudo-package to read them Import-Package: some.props.folder © 2012 IBM Corporation

Slide 43

Slide 43

Late binding ■ What if imported package isn’t known at compile-time? ■ Use DynamicImport-Package © 2012 IBM Corporation

Slide 44

Slide 44

Thread Context Classloader ■ Allows cross-classloader classloading ■ Works around one-way classloader visibility Library TCCL App © 2012 IBM Corporation

Slide 45

Slide 45

Thread Context Classloader ■ Sometimes assumes one-way classloader visibility – A TCCL probably cannot load your internals! Library TCCL App © 2012 IBM Corporation