Don’t let me
be misunderstood
Mikaël Barbero
6 June 2013
OSGi
NOT SURE IF ACCIDENTALLY
COMPLEX
OR JUST ESSENTIALLY COMPLICATED
Geek and Poke cartoon, 27 July 2011: Graph Theory for Geeks (CC-BY-ND)
Original site: http://geekandpoke.typepad.com/geekandpoke/2011/07/graph-theory-for-geeks.html
Culprit ?
java -cp "Test.jar;lib/*" my.package.MainClass
Execution
Environment
Factory/Listener
patterns are key
to modularity
Classes are
identified by a
unique name
Java visibility are
sufficient
boundaries
Module identify
==
Module artifact
PermGen is
permanent
W R O N G !
W R O N G !
W R O N G !
W R O N G !
minimizing changes need to support the
evolution of itself and its dependencies
Modularity
Execution
Environment
Classes are
identified by a
unique name
Java visibility
creates
sufficient
boundaries
Mix up module
identify and
module artifact
PermGen is
permanent
Factory/Listener
patterns are key
to modularity
CDLC/MIDP
J2SE 1.3, 1.4,
5, 6, 7...
CDC/FP
OSGI
Min.
CDLC/MIDP
J2SE 1.3, 1.4,
5, 6, 7...
CDC/FP
OSGI
Min.
MANIFEST.MF
Bundle-RequiredExecutionEnvironment: J2SE-1.6
OS + Hardware
EE
Modules
Lifecycle
Service
S
e
c
u
r
i
t
r
y
Applications
(bundles)
Execution
Environment
Classes are
identified by a
unique name
Java visibility
creates
sufficient
boundaries
Mix up module
identity and
module artifact
PermGen is
permanent
Factory/Listener
patterns are key
to modularity
guava-14.0.1.jar
15-Mar-2013
2.1 M
69e12f4c6aeac392555f1ea86fab82b5e5e31ad4
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>14.0.1</version>
Bundle-Vendor: Google, Inc
Bundle-Name: com.google.guava
Bundle-Version: 11.0.2.v201303041551
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>14.0.1</version>
</dependency>
Require-Bundle: com.google.guava;bundle-version="11.0.2"
OS + Hardware
EE
Modules
Lifecycle
Service
S
e
c
u
r
i
t
r
y
Applications
(bundles)
Execution
Environment
Classes are
identified by a
unique name
Java visibility
creates
sufficient
boundaries
Mix up module
identify and
module artifact
PermGen is
permanent
Factory/Listener
patterns are key
to modularity
Good fences make good neighbors
com.acme.myApp-1.2.jar
package
com.acme.core
package
com.acme.core.impl
org.logging.fmk-1.0.1.jar
package
org.logging.fmk.impl
package
org.logging.fmk
com.acme.myApp-1.2.jar
org.logging.fmk-1.0.1.jar
package
com.acme.core
package
com.acme.core.impl
package
org.logging.fmk.impl
package
org.logging.fmk
com.acme.myApp-1.2.jar
org.logging.fmk-1.0.1.jar
package
com.acme.core
package
com.acme.core.impl
package
org.logging.fmk.impl
package
org.logging.fmk
com.acme.myApp-1.2.jar
org.logging.fmk-1.0.1.jar
package
com.acme.core
package
com.acme.core.impl
package
org.logging.fmk.impl
package
org.logging.fmk
Bundle com.acme.myApp; version=1.2
Bundle org.logging.fmk; version=1.0.1
X
package
com.acme.core
package
com.acme.core.impl
package
org.logging.fmk.impl
package
org.logging.fmk
Bundle com.acme.myApp; version=1.2
Bundle org.logging.fmk; version=1.0.1
package
com.acme.core
package
com.acme.core.impl
package
org.logging.fmk.impl
package
org.logging.fmk
Bundle com.acme.myApp; version=1.2
Bundle org.logging.fmk; version=1.0.1
package
com.acme.core
package
com.acme.core.impl
package
org.logging.fmk.impl
package
org.logging.fmk
Export-package: com.acme.core
Export-package: com.acme.core;version="1.0.2"
SemanticVersions
major.minor.micro.qualifier
• major: different major versions are completely incompatible
• minor: same major and different minor versions are compatible for
consumer only (callers of the API)
• micro: used to signal bufixes with no backward incompatibility issues
• qualifier: build identity
OS + Hardware
EE
Modules
Lifecycle
Service
S
e
c
u
r
i
t
r
y
Applications
(bundles)
Execution
Environment
Classes are
identified by a
unique name
Java visibility
creates
sufficient
boundaries
Mix up module
identify and
module artifact
PermGen is
permanent
Factory/Listener
patterns are key
to modularity
My Killer
Application
Logging
Framework
My Killer
Application
Logging
Framework
XXX Framework
My Killer
Application
Logging
Framework v1
XXX Framework
Logging
Framework v2
My Killer Application
JavaVirtual Machine
Application
Extension
Foundation Basic
UI
Convenience
Borrowed from Peter Kriens presentation: http://www.slideshare.net/pkriens/osgi-and-java-modularity-1642537
Borrowed from Peter Kriens presentation: http://www.slideshare.net/pkriens/osgi-and-java-modularity-1642537
Class
Not
Found
Exception
Borrowed from Peter Kriens presentation: http://www.slideshare.net/pkriens/osgi-and-java-modularity-1642537
Class Object Identity
==
Qualified Class Name + ClassLoader Object
Bundle com.acme.myApp; version=1.2
Bundle org.logging.fmk; version=1.0.1
package
com.acme.core;v=1.0
package
com.acme.core.impl
package
org.logging.fmk.impl
package
org.logging.fmk;v=1.2
Bundle com.acme.myApp; version=1.2
Bundle org.logging.fmk; version=1.0.1
X
package
com.acme.core.impl
package
org.logging.fmk.impl
package
com.acme.core;v=1.0
package
org.logging.fmk;v=1.2
Bundle com.acme.myApp; version=1.2
Bundle org.logging.fmk; version=1.0.1
package
com.acme.core.impl
package
org.logging.fmk.impl
package
org.logging.fmk
package
com.acme.core;v=1.0
package
org.logging.fmk;v=1.2
Import-package: com.acme.core;version="[1.0.2, 1.1.0)"
Consumer Provider
[X.Y.Z.q, X+1.0.0) [X.Y.Z, X.Y+1.0)
Bundle com.acme.myApp; version=1.2
Bundle org.logging.fmk; version=1.0.1
package
com.acme.core.impl
package
org.logging.fmk.impl
package
org.logging.fmk
package
com.acme.core;v=1.0
package
org.logging.fmk;v=1.2
Bundle com.acme.myApp; version=1.2
package
com.acme.core.impl
package
com.acme.core;v=1.0
Bundle org.logging.fmk; version=1.0.1
package
org.logging.fmk.impl
package
org.logging.fmk;v=1.2
Bundle org.logging.fmk; version=2.3.0
package
org.logging.fmk.impl
package
org.logging.fmk;v=2.2
Bundl exxx.fmk; version=1.2
package
xxx
package
org.logging.fmk;v=[2.2,3)
package
xxx.exported;v=1.0
package
org.logging.fmk;v=[1.2,2.0)
package
xxx.exported
OS + Hardware
EE
Modules
Lifecycle
Service
S
e
c
u
r
i
t
r
y
Applications
(bundles)
Execution
Environment
Classes are
identified by a
unique name
Java visibility
creates
sufficient
boundaries
Mix up module
identify and
module artifact
PermGen is
permanent
Factory/Listener
patterns are key
to modularity
Bundle-Activator: com.acme.core.Activator
Bundle-ActivationPolicy: lazy
public class Activator implements BundleActivator {
public void start(BundleContext bc) {
...
}
public void stop(BundleContext bc) {
...
}
}
OS + Hardware
EE
Modules
Lifecycle
Service
S
e
c
u
r
i
t
r
y
Applications
(bundles)
Execution
Environment
Classes are
identified by a
unique name
Java visibility
creates
sufficient
boundaries
Mix up module
identify and
module artifact
PermGen is
permanent
Factory/Listener
patterns are
keys to
modularity
Consumer
Class
Interface
Provider
Class
Consumer
Class
Interface
Provider
Class
uses impl
Factory Pattern
Factory ???
Consumer
Class
Interface
Provider
Class
impl uses
Listener Pattern
Provider
Interface
impl
Consumer
Class
Interface
Provider
Class
Dependency injection
DI
Consumer
Class
Interface
Provider
Class
μServices
μServices
Consumer
Class
Provider
Class
μServices
get register
Declaring and getting services
Programmatically Declaratively
Service Registry
ServiceTracker
Decl. Services
Blueprint
OS + Hardware
EE
Modules
Lifecycle
Service
S
e
c
u
r
i
t
r
y
Applications
(bundles)
OS + Hardware
EE
Modules
Lifecycle
Service
S
e
c
u
r
i
t
r
y
Applications
(bundles)
Minimizing changes need to support the
evolution of itself and its dependencies
Modularity
High cohesion Low coupling Encapsulation
Modularity
PDE
You want to be
an achiever?
Give Feedback
1} Sign in www.eclipsecon.org
2} Select Session Evaluate
3} Vote +1, 0 or -1
ervisevichttp://www.flickr.com/photos/23979265@N07/4745520501/
Mikaël Barbero
mikael.barbero@obeo.fr
+Mikaël Barbero
@mikbarbero
Obeo
http://www.obeo.fr
(cc) TheAlieness GiselaGiardino²³ http://www.flickr.com/photos/36613169@N00/304120801/
Q
&
A
(cc) InstantVantage http://www.flickr.com/photos/44312356@N04/6023508805

OSGi: Don't let me be Misunderstood