How to deploy OSGi apps and dependencies?

后端 未结 3 1604
甜味超标
甜味超标 2021-01-30 07:19

OSGi seems to have an excellent benefit of having small deployable artifacts by not wrapping dozens of JAR dependencies into a lib directory. However, I can\'t find anything tha

相关标签:
3条回答
  • 2021-01-30 07:45

    If you create an OSGi application and a classic Java application that do the same thing and use the same libraries then you'll need exactly the same set of JARs. The big difference is being able to explicitly define your dependencies (and possibly produce more granular JARs for your application).

    There's only one pure OSGi-based server that I know of (Eclipse's Virgo, previously Spring's DM Server). Glassfish and Websphere have support for OSGi, but I haven't played with them so I can't say much. What I can say is that all of them require an OSGi container and that's usually Eclipse's Equinox or Apache's Felix.

    Your question seems to really be about provisioning the application (working out what needs to be deployed). I know that for Maven 3.0 they've done a bunch of stuff working with Eclipse's P2 provisioning framework.

    For your application are you deploying an EAR or WAR? For either of those, your build system will need to produce the archive with all dependencies or it won't work. It's a bit confusing on why you have a problem because people use Maven because it does the transitive dependency management for their builds.

    0 讨论(0)
  • 2021-01-30 07:55

    There is a fundamental aspect of your question that is not yet addressed.

    Glassfish is indeed a full fledged Application server like most modern application servers: these provide you with a Web container (where you would deploy WAR archives), a Java EE container (to deploy EJB's in JAR and EAR archives), as well as integrate an OSGI container. The later is then used for the application server's own internal start-up mechanisms.

    In essence, you may target three containers. Modern IDE's and build tools provide you with means to pack your logic to target any of these. So the question becomes: how do I architect my application with all those possibilities?

    There are a few very important technical issues not to lose from sight. (I focus here on objective and factual considerations, keeping out from any subjective choices, philosophy, strategy, and other context-dependent considerations that indeed may also weight much on your final decision):

    1. An OSGI container does not provide you with Implicit or Declarative Thread Management, Persistence, or Transaction management services like the Web and Java EE containers. So, do plan to analyse these issues and produce the code to manage your threads and deal with transaction propagation over these threads for instance. Of course OSGi provides all necessary APIs to deal with those aspects, but does require coding (where AOP may help). On the other hand, in the Web and Java EE containers, you rely on container-managed services and/or use EJB annotations, deployment descriptors, and server managed objects like pools to simply declare how many threads you want in parallel, the sizes of connection pools, and which transaction attributes. There are advantages and drawbacks in either style (procedural in OSGi versus declarative or implicit in java app. servers).
    2. OSGI provides an orderly way of loading your code, manage module dependencies, even deal with multiple coexisting versions of the same module, and dynamically add/remove and start/stop so-called bundles (OSGI deployment units), provided indeed your bundle contains the logic to handle potential start/stop issues like properly interrupting all launched threads on a stop -- threads which could have 'propagated' through other dependent modules. On the other hand, Java EE and Web containers will often embark copies of dependent JAR's that may yield more fat deployments unless you start to consider your application server's classloader hierarchy and take advantage of it to deploy 'shared libraries' either as plain POJO JARs, or as Java EE beans packed in JAR's. Anyhow, in the later cases, managing deployment dependencies becomes a concern which you will have to address at least at build time using frameworks like Maven indeed. Then, at run time you may have to script start/stop cascades according to dependencies; else, take advantage from specific application server extensions that address these dynamic deployment issues in Web and Java EE containers (e.g. Weblogic).
    3. As already said, OSGI is now used by most application servers to manage their own start-up sequence. With the increasing complexity of platforms, multiplication of API's, increrase in the number of development teams to assemble a single final product, as well as use of numerous third party / open source components, OSGI becomes an indispensable server-start-up tool to ensure stable releases and a coherent set of compatible versions of all components. Think about the Eclipse IDE: with a catalogue of thousands of plug-ins and a high rate of new releases, this IDE would be a much brittle platform without OSGI as a base. Modern Application servers face just the same problem.
    4. Based on above considerations, you may be much tempted to layer your code into some facilities which you could base into the OSGI layer, which in turn provides core services to a Java EE bean layer hosting business logic, and then a Web servlet layer to interface the whole... but two other questions pop up: (a) How do you make all these components communicate together? OSGI has its own repository mechanism and the deployed JAR's API's will not be visible by other modules unless explicitly published in OSGI. Web and Java EE containers use a completely different repository technology to access each-other components' interfaces, namely JNDI. Again, look at your specific application server documentation which may provide means to address Java EE beans from OSGI bundles and vice-versa (Glassfish for instance, since V3); but be cautious about thread management and transaction scopes. (b) How would you avoid interfering in the application server start-up sequence? OSGI tends to become a core system feature (under the vendor's governance), compared to the Web and Java EE containers naturally oriented to host your application code (under your governance). Upgrading your application server or installing a new release can interfere with your own OSGI deployments; you'll have to check the issue and organize your deployment scripts as a consequence.

    The question is rich and its analysis is complex. Further consideration must take into account the nature of the application to build. Moreover, if you intend to use development frameworks like open source Spring and/or Camel, as well as vendor specific ones like Oracle Fusion SOA composites, JBoss Switchyard, etc. you will have many other technical constraints to take into consideration.

    There is no "one-size-fits-all" answer in these matters and that, in essence, justifies the current plethora of overlapping technologies.

    When that architecture question is first solved, then you can look to optimize productivity with a suitable configuration management and deployment repository.

    0 讨论(0)
  • 2021-01-30 07:56

    There are a number of ways to deploy dependent bundles to OSGi containers. Here are some of them:

    1 The Felix OBR bundle repository

    You first need to create an XML index file for your available bundles, using a tool such as bindex. If you are using the maven-bundle-plugin, then it automatically maintains an OBR index in ~/.m2/repository/repository.xml.

    Load the index using the OBR command-line interface:

    > obr:addUrl file:/Users/derek/.m2/repository/repository.xml
    

    Then ask OBR to deploy your target bundle, with dependencies determined from the OBR index:

    > obr:deploy com.paremus.posh.sshd
    Target resource(s):
    -------------------
       Paremus Posh Ssh Daemon (1.0.23.SNAPSHOT)
    
    Required resource(s):
    ---------------------
       Paremus Command API (1.0.23.SNAPSHOT)
    
    Optional resource(s):
    ---------------------
       Paremus Config Admin Commands (1.0.23.SNAPSHOT)
       Paremus OSGi & LDAP Types (1.0.23.SNAPSHOT)
    

    2 Apache Karaf

    Karaf supports "features", which are basically lists of bundles required to provide the feature:

    karaf@root> features:info obr
    Description of obr 2.0.0 feature
    ----------------------------------------------------------------
    Feature has no configuration
    Feature has no dependencies.
    Feature contains followed bundles:
      mvn:org.apache.felix/org.apache.felix.bundlerepository/1.6.4
      mvn:org.apache.karaf.shell/org.apache.karaf.shell.obr/2.0.0
      mvn:org.apache.karaf.features/org.apache.karaf.features.obr/2.0.0
    
    karaf@root> features:install obr
    

    3 Eclipse Virgo

    Virgo uses plans to define the artifacts that comprise an application and it is able to automatically supply the dependencies of an application including bundles, plans, plan archives (PARs), and configurations, from both local and remote repositories.

    4 Paremus Nimble

    Nimble uses OBR (or its own extended) repository indexes, to automatically deploy all dependent bundles needed to activate a target bundle (and uninstalls them when the target bundle is stopped). It can also detect other dependencies, such as a WAB bundle requires a web-extender and automatically install one according to a configurable policy.

    Nimble can also be configured to launch Glassfish, so that its features are available to bundles in the Glassfish container.

    The example below also shows that logging support is automatically installed when sshd is activated:

    $ posh
    ________________________________________
    Welcome to Paremus Nimble!
    Type 'help' for help.
    [denzil.0]% nim:add --dry-run com.paremus.posh.sshd@active
    -- sorted parts to install --
    4325   osgi.resolved.bundle/ch.qos.logback.core:0.9.22
    -- start dependency loop --
    5729   osgi.resolved.bundle/com.paremus.util.logman:1.0.23.SNAPSHOT
    5727   osgi.active.bundle/com.paremus.util.logman:1.0.23.SNAPSHOT
    3797   osgi.resolved.bundle/ch.qos.logback.classic:0.9.25.SNAPSHOT
    3792   osgi.resolved.bundle/slf4j.api:1.6
    -- end dependency loop --
    436   osgi.resolved.bundle/org.apache.mina.core:2.0.0.RC1
    6533   osgi.resolved.bundle/sshd-core:0.3
    398   osgi.resolved.bundle/com.paremus.posh.sshd:1.0.23.SNAPSHOT
    396   osgi.active.bundle/com.paremus.posh.sshd:1.0.23.SNAPSHOT
    

    (disclaimer: I'm a developer at Paremus)

    5 Apache Felix Gogo

    gogo is the new RFC147 standard command-line shell. It is already used in Felix, Karaf, Nimble and will soon be available in Glassfish.

    Gogo allows you to run any commands that you could type interactively, as a script. So you could generate the list of bundles to install and convert it to a script, or even capture the installed bundles from a working configuration so that it can be re-created from a clean start.

    0 讨论(0)
提交回复
热议问题