A presentation at JFokus in in Stockholm, Sweden by Holly Cummins
OSGi vs Spaghetti Part II The Enterprise Strikes Back Holly Cummins IBM @holly_cummins © 2012 IBM Corporation
Who am I? @holly_cummins ■ ■ Developer with IBM –WebSphere Liberty Profile –OSGi –Java performance ■ Apache Aries committer © 2012 IBM Corporation
Enterprise OSGi in Action ■ I’m one of the authors :) –Early access available at http://www.manning.com/ cummins © 2012 IBM Corporation
How did we get here? © 2012 IBM Corporation
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 …
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 …
As a user, you had a choice. © 2012 IBM Corporation
What is “Enterprise OSGi” and why do I need it? © 2012 IBM Corporation
■ 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
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
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
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
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
How can I use Enterprise OSGi in my WARs? © 2012 IBM Corporation
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
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
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
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
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
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
How do I develop and build a WAB? © 2012 IBM Corporation
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
Manifest-first tools ■ Develop – Eclipse PDE ■ Build – Maven Tycho – Plain-old-Ant © 2012 IBM Corporation
Code-first tools ■ Develop: – Whatever you like! • (Or Eclipse and BndTools if you’re feeling fancy :) ) ■ Build – Maven build plugin © 2012 IBM Corporation
Enterprise-OSGi tools ■ Eclipse Libra ■ IBM’s OSGi Application Development Tools –(What we’ll be using today) © 2012 IBM Corporation
Handling thirdparty libraries © 2012 IBM Corporation
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
Finding OSGi-fied bundles ■ SpringSource Enterprise Bundle Repository ■ Maven Central – Same bundle, different group id © 2012 IBM Corporation
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
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
One more thing … © 2012 IBM Corporation
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
Demo Maybe With luck With lots of luck © 2012 IBM Corporation
Summary © 2012 IBM Corporation
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
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
© 2012 IBM Corporation
Common problems © 2012 IBM Corporation
Reflection ■ No bytecode dependency ■ No auto-detection of import by bnd © 2012 IBM Corporation
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
Late binding ■ What if imported package isn’t known at compile-time? ■ Use DynamicImport-Package © 2012 IBM Corporation
Thread Context Classloader ■ Allows cross-classloader classloading ■ Works around one-way classloader visibility Library TCCL App © 2012 IBM Corporation
Thread Context Classloader ■ Sometimes assumes one-way classloader visibility – A TCCL probably cannot load your internals! Library TCCL App © 2012 IBM Corporation
Software engineering sometimes seems like a struggle against spaghetti. Without lots of care, modern projects risk becoming an unwieldy tangle of closely-coupled code whose behaviour and dependencies are mostly unknowable. OSGi can help keep the complexity at bay, but until recently OSGi didn’t play very well with modern enterprise programming models such as dependency injection, WARs, JPA, and application deployment. The Enterprise OSGi programming model is changing all this, and can help keep your applications from descending into a noodly mess. This session will discuss the basics of OSGi modularity, and demo the build tools, middleware, and architectural principles which can be used to turn a chunky WAR into a lean, mean, extensible OSGi web application.