$30 off During Our Annual Pro Sale. View Details »

Building Modular Applications with Enterprise OSGi

Building Modular Applications with Enterprise OSGi

Presented at Devoxx Belgium in 2012.

Holly Cummins

October 11, 2024
Tweet

More Decks by Holly Cummins

Other Decks in Programming

Transcript

  1. Building modular applications with Enterprise OSGi 16, Nov 2012 Slide

    Holly Cummins IBM @holly_cummins Tim Ward Zuhlke @TimothyWard
  2. ▪ @TimothyWard ▪ Java Consultant at Zuhlke Engineering UK ▪

    Spent 5 years at IBM developing WebSphere Application Server ▪ PMC member of the Apache Aries project ▪ Particularly interested in Bytecode weaving/generation, JPA, EJBs, Blueprint Dependency injection, Declarative qualities of service (e.g. transactions) Who is Tim Ward? Slide Building Modular Applications with Enterprise OSGi | Tim Ward & Holly Cummins 16. Nov 2012
  3. ▪ @holly_cummins ▪ Developer with IBM ▪ WebSphere Liberty Profile

    ▪ OSGi ▪ Java performance ▪ Apache Aries committer ▪ Who is Holly Cummins? Slide Building Modular Applications with Enterprise OSGi | Tim Ward & Holly Cummins 16. Nov 2012
  4. ▪ We're the authors :) ▪ Early access available at

    http://www.manning.com /cummins ▪ All chapters complete (expect paper copies very soon!) Enterprise OSGi in Action Slide Building Modular Applications with Enterprise OSGi | Tim Ward & Holly Cummins 16. Nov 2012
  5. Agenda ▪ What is “Enterprise OSGi” and why do I

    need it? ▪ How can I use Enterprise OSGi in my WARs? ▪ How do I develop and build a WAB? ▪ Handling third-party libraries OSGi? ▪ Demo Slide Building Modular Applications with Enterprise OSGi | Tim Ward & Holly Cummins 16. Nov 2012
  6. ▪ 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 What is “Enterprise OSGi” and why do I need it? Slide Building Modular Applications with Enterprise OSGi | Tim Ward & Holly Cummins 16. Nov 2012
  7. ▪ 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? What is “Enterprise OSGi” and why do I need it? (2) Best Practices for (Enterprise) OSGi applications | Tim Ward Slide 16. Nov 2012
  8. ▪ OSGi is used for many reasons, but a primary

    motivation is 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!) What is “Enterprise OSGi” and why do I need it? (3) Best Practices for (Enterprise) OSGi applications | Tim Ward Slide 16. Nov 2012
  9. ▪ 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? Why I need OSGi in my WAR Slide Building Modular Applications with Enterprise OSGi | Tim Ward & Holly Cummins 16. Nov 2012
  10. ▪ 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! Why else do I need OSGi in my WAR? Slide Building Modular Applications with Enterprise OSGi | Tim Ward & Holly Cummins 16. Nov 2012
  11. ▪ 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 How can I use Enterprise OSGi in my WARs? 23. March 2012 Slide JAR Manifest OSGi 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 Building Modular Applications with Enterprise OSGi | Tim Ward & Holly Cummins
  12. ▪ But we don’t want to run a JAR, we

    want to run a WAR ▪ WARs and JARs are similar, with different internal structure How can I use Enterprise OSGi in my WARs? (2) Slide JAR WAR Manifest file META-INF/Manifest.mf META-INF/Manifest.mf Web Descriptor O WEB-INF/web.xml Classes location / /WEB-INF/classes Nested libraries O /WEB-INF/lib Non-classpath resources O / Building Modular Applications with Enterprise OSGi | Tim Ward & Holly Cummins 16. Nov 2012
  13. ▪ 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! How can I use Enterprise OSGi in my WARs? (3) Slide Building Modular Applications with Enterprise OSGi | Tim Ward & Holly Cummins 16. Nov 2012
  14. ▪ 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… Structure of a Web Application Bundle Slide Building Modular Applications with Enterprise OSGi | Tim Ward & Holly Cummins 16. Nov 2012
  15. Structure of a Web Application Bundle (2) Slide OSGi Bundle

    Manifest OSGi WAB WEB-INF/ classes/ MyServlet.class lib/ myLibrary.jar Manifest 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 Building Modular Applications with Enterprise OSGi | Tim Ward & Holly Cummins 16. Nov 2012
  16. ▪ 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!) So what does migration give me? Building Modular Applications with Enterprise OSGi | Tim Ward & Holly Cummins Slide 16. Nov 2012
  17. 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 ▪
  18. Code-first tools ▪ Develop: ▪ Whatever you like! ▪ (Or

    Eclipse and BndTools if you're feeling fancy :) ) ▪ Build ▪ Maven build plugin
  19. 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 ▪
  20. 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
  21. Embedding jars ▪ Eliminates many classloading visibility problems ▪ Your

    bundle and third-party library share a class-space ▪ Not the most-space-efficient option
  22. ▪ OSGi isn’t as hard as you’ve been led to

    believe! ▪ But it isn’t magic either, you need to make use of what it gives you ▪ Things to remember Slide Building Modular Applications with Enterprise OSGi | Tim Ward & Holly Cummins 16. Nov 2012
  23. ▪ 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 Useful Resources 16. Nov 2012 Slide Building Modular Applications with Enterprise OSGi | Tim Ward & Holly Cummins
  24. 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
  25. Late binding ▪ What if imported package isn't known at

    compile-time? ▪ Use DynamicImport-Package
  26. Thread Context Classloader ▪ Sometimes assumes one-way classloader visibility ▪

    A TCCL probably cannot load your internals! Library App TCCL