SlideShare a Scribd company logo
Leveraging OSGi to Create
Extensible Plugins for Liferay 6.2
Eduardo García edupgv@
Julio Camarero juliocamarero@
Core Engineers at Liferay, Inc
Milen Dyankov milendyankov@
Senior Consultant at Liferay, Inc
OSGi is about
modularity
... and Liferay already
allowed for
modularity ...
PortletsPortlets
HooksHooks
ThemesThemes
LayoutsLayouts
......
... but modules are
not modular !!!
OSGi brings into
Liferay
modularity of
modules !!!
Moved to https://slidr.io/azzazzel/leveraging-osgi-to-create-extensible-plugins-for-liferay-6-2
...
Microservices
Supported in
Liferay marketplace
Let’s see an example…
A Shipping Cost Calculator
https://github.com/epgarcia/liferay-plugins/commits/LRNAS2014.OSGI
final price
common features
for all countries
specific features
for each country
we could…
Develop a very complex and
laborious application that
covers all possible cases
Release a new version every
time any shipping cost
algorithm changes or we add
new countries
Develop a simple core application
that covers only the common features
Make the application extensible
with country modules“ ”
If a shipping algorithm changes,
our core application remains
the same and only that specific
extension must be changed
will be the future of all
Liferay 7 applications ...
... because it’s all advantages!
improves
maintainability
maximizes
reusability
simplification of
releases
(independent)
new market
opportunities
(extensions)
App
ver. 1
App
ver. 2
App
ver. 3
time
size
...
App
ver. 1
App
ver. 2
time
size
...
ext 1
ver. 1
ext 1
ver. 2
ext 1
ver. 3
ext 2
ver. 3
ext 2
ver. 1
ext 2
ver. 2
ext 3
ver. 1
ext 1
ver. 4
ext 3
ver. 2
But OSGi makes this
possible already in
Liferay 6.2 !
In fact, Audience Targeting,
the first Liferay 6.2 application
following this approach, is already
available on Marketplace!
Sounds great,
but I have no idea
about OSGi…
OSGi basic concepts
in 3 minutes!
(or what you need to understand
before we continue)
OSGi bundles
(this is what our plug-ins are)
manifestmanifestmanifestmanifest manifest
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Shipping Impl
Bundle-SymbolicName: com.liferay.shipping.impl
Bundle-Vendor: Liferay, Inc.
Bundle-Version: 1.0.0
Private-Package: com.liferay.shipping.impl.model,com.liferay.shipping.impl.util
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.6))"
. . .
#1
#1 OSGi bundles
(this is what our plug-ins are)
manifestmanifestmanifestmanifest manifest
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Shipping Impl
Bundle-SymbolicName: com.liferay.shipping.impl
Bundle-Vendor: Liferay, Inc.
Bundle-Version: 1.0.0
Private-Package: com.liferay.shipping.impl.model,com.liferay.shipping.impl.util
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.6))"
. . .
All modern build tools (Ant, Maven, Gradle, ...)
can build OSGi bundles!
So can Liferay SDK !
Package dependencies
(this is how we describe what we provide and expect)
Import-Package:
com.liferay.shipping.api.model,
com.liferay.shipping.api.util,
com.liferay.portal.kernel.io.unsync;resolution:=optional,
com.liferay.portal.kernel.util;resolution:=optional,
freemarker.cache;resolution:=optional,
freemarker.template;resolution:=optional
Export-Package:
com.liferay.shipping.api.model;version="1.0.0",
com.liferay.shipping.api.util;version="1.0.0"
manifestmanifestmanifestmanifest manifest
EXPORT EXPORT
#2
manifestmanifestmanifestmanifest manifest
EXPORT EXPORT
Package dependencies
(this is how we describe what we provide and expect)
Import-Package:
com.liferay.shipping.api.model,
com.liferay.shipping.api.util,
com.liferay.portal.kernel.io.unsync;resolution:=optional,
com.liferay.portal.kernel.util;resolution:=optional,
freemarker.cache;resolution:=optional,
freemarker.template;resolution:=optional
Export-Package:
com.liferay.shipping.api.model;version="1.0.0",
com.liferay.shipping.api.util;version="1.0.0"
#2
#2
manifestmanifestmanifestmanifest manifest
EXPORT EXPORT
Package dependencies
(this is how we describe what we provide and expect)
Import-Package:
com.liferay.shipping.api.model,
com.liferay.shipping.api.util,
com.liferay.portal.kernel.io.unsync;resolution:=optional,
com.liferay.portal.kernel.util;resolution:=optional,
freemarker.cache;resolution:=optional,
freemarker.template;resolution:=optional
Export-Package:
com.liferay.shipping.api.model;version="1.0.0",
com.liferay.shipping.api.util;version="1.0.0"
The BND tool (bnd.bndtools.org) can discover dependencies
and automatically generate export/import manifest headers!
Liferay SDK also allows you to use BND tool!
OSGi services
(this is how we provide and consume functionality)
manifestmanifestmanifest manifest
OSGi service registry
Interface
Service 1
...
Service N
#3
OSGi services
(this is how we provide and consume functionality)
manifestmanifestmanifest
OSGi service registry
Interface
Service 1
...
Service N
REGISTER
REGISTER
USE
manifest
#3
#3 OSGi services
(this is how we provide and consume functionality)
manifestmanifestmanifest
OSGi service registry
Interface
Service 1
...
Service N
REGISTER
REGISTER
USE
manifest
There are number of component frameworks on top of OSGi
(Declarative Services and Blueprint being part of the specs)
which greatly simplify the usage of services!
Sounds great,
but how OSGi fits
into Liferay ?
Application server / Servlet container
Liferay 6.2
Liferay CORE
Portlet Portlet...
Application server / Servlet container
Liferay 6.2
Portlet application
Portlet application
Portlet application
Portlet application
Liferay CORE
Portlet Portlet...
Application server / Servlet container
Liferay 6.2
Portlet application
Portlet application
Portlet application
Portlet application
Liferay CORE
Portlet Portlet
OSGi container
...
Application server / Servlet container
Liferay 6.2
Portlet application
Portlet application
Portlet application
Portlet application
Liferay CORE
Portlet Portlet
OSGi container
OSGi core services
HTTP Service Configuration Admin Service
...
...
Liferay core OSGi services
Application server / Servlet container
Liferay 6.2
Portlet application
Portlet application
Portlet application
Portlet application
Liferay CORE
Portlet Portlet
OSGi container
API Bundle
API Bundle
Service Bundle
Extension bundle
Service Bundle
Portlet Bundle
Extension Bundle
Portlet Bundle
OSGi core services
HTTP Service Configuration Admin Service
...
...
Liferay core OSGi services
Application server / Servlet container
Liferay 6.2
Portlet application
Portlet application
Portlet application
Portlet application
Liferay CORE
Portlet Portlet
OSGi container
API Bundle
API Bundle
Service Bundle
Extension bundle
Service Bundle
Portlet Bundle
Extension Bundle
Portlet Bundle
OSGi core services
HTTP Service Configuration Admin Service
...
...
Liferay core OSGi services
In Liferay 6.2 portlets inside OSGi
container have certain limitations!
shipping-api
shipping-impl
shipping-web
Shipping application
shipping-extension-europe
shipping-extension-usa
Shipping application
extensions
Shipping application modules (bundles)
There is an extra step in Liferay 6.2
as not all dependencies are
provided!
You will NOT need to do this in
Liferay 7!
#0 Shipping application modules (bundles)
#1 Shipping application modules (bundles)
#1 Shipping application modules (bundles)
#1 Shipping application modules (bundles)
#2 Shipping application modules (bundles)
#2 Shipping application modules (bundles)
#2 Shipping application modules (bundles)
#2 Shipping application modules (bundles)
#2 Shipping application modules (bundles)
#3 Shipping application modules (bundles)
This approach is for Liferay 6.2 only !
It will change in Liferay 7 !
This approach is for Liferay 6.2 only !
It will change in Liferay 7 !
#3 Shipping application modules (bundles)
Our main application
is ready!
Let's try it !
#4 Shipping application modules (bundles)
#4 Shipping application modules (bundles)
Let's try it !
#5 Shipping application modules (bundles)
#5 Shipping application modules (bundles)
Let's try it !
Where you go from
here?
Send feedback!
Build your own OSGi modules
Learn more about OSGi
Try the samples yourself
https://github.com/epgarcia/liferay-plugins/commits/LRNAS2014.OSGI
Thank you!
milen.dyankov@liferay.com
http://www.liferay.com/web/milen.dyankov/
@milendyankov
@LiferayPL
http://www.liferay.com
@Liferay
http://www.facebook.com/Liferay

More Related Content

Moved to https://slidr.io/azzazzel/leveraging-osgi-to-create-extensible-plugins-for-liferay-6-2

  • 1. Leveraging OSGi to Create Extensible Plugins for Liferay 6.2 Eduardo García edupgv@ Julio Camarero juliocamarero@ Core Engineers at Liferay, Inc Milen Dyankov milendyankov@ Senior Consultant at Liferay, Inc
  • 3. ... and Liferay already allowed for modularity ...
  • 5. ... but modules are not modular !!!
  • 8. ...
  • 10. Let’s see an example… A Shipping Cost Calculator https://github.com/epgarcia/liferay-plugins/commits/LRNAS2014.OSGI
  • 11. final price common features for all countries specific features for each country
  • 12. we could… Develop a very complex and laborious application that covers all possible cases Release a new version every time any shipping cost algorithm changes or we add new countries Develop a simple core application that covers only the common features Make the application extensible with country modules“ ” If a shipping algorithm changes, our core application remains the same and only that specific extension must be changed
  • 13. will be the future of all Liferay 7 applications ...
  • 14. ... because it’s all advantages! improves maintainability maximizes reusability simplification of releases (independent) new market opportunities (extensions)
  • 16. App ver. 1 App ver. 2 time size ... ext 1 ver. 1 ext 1 ver. 2 ext 1 ver. 3 ext 2 ver. 3 ext 2 ver. 1 ext 2 ver. 2 ext 3 ver. 1 ext 1 ver. 4 ext 3 ver. 2
  • 17. But OSGi makes this possible already in Liferay 6.2 !
  • 18. In fact, Audience Targeting, the first Liferay 6.2 application following this approach, is already available on Marketplace!
  • 19. Sounds great, but I have no idea about OSGi…
  • 20. OSGi basic concepts in 3 minutes! (or what you need to understand before we continue)
  • 21. OSGi bundles (this is what our plug-ins are) manifestmanifestmanifestmanifest manifest Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Shipping Impl Bundle-SymbolicName: com.liferay.shipping.impl Bundle-Vendor: Liferay, Inc. Bundle-Version: 1.0.0 Private-Package: com.liferay.shipping.impl.model,com.liferay.shipping.impl.util Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.6))" . . . #1
  • 22. #1 OSGi bundles (this is what our plug-ins are) manifestmanifestmanifestmanifest manifest Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Shipping Impl Bundle-SymbolicName: com.liferay.shipping.impl Bundle-Vendor: Liferay, Inc. Bundle-Version: 1.0.0 Private-Package: com.liferay.shipping.impl.model,com.liferay.shipping.impl.util Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.6))" . . . All modern build tools (Ant, Maven, Gradle, ...) can build OSGi bundles! So can Liferay SDK !
  • 23. Package dependencies (this is how we describe what we provide and expect) Import-Package: com.liferay.shipping.api.model, com.liferay.shipping.api.util, com.liferay.portal.kernel.io.unsync;resolution:=optional, com.liferay.portal.kernel.util;resolution:=optional, freemarker.cache;resolution:=optional, freemarker.template;resolution:=optional Export-Package: com.liferay.shipping.api.model;version="1.0.0", com.liferay.shipping.api.util;version="1.0.0" manifestmanifestmanifestmanifest manifest EXPORT EXPORT #2
  • 24. manifestmanifestmanifestmanifest manifest EXPORT EXPORT Package dependencies (this is how we describe what we provide and expect) Import-Package: com.liferay.shipping.api.model, com.liferay.shipping.api.util, com.liferay.portal.kernel.io.unsync;resolution:=optional, com.liferay.portal.kernel.util;resolution:=optional, freemarker.cache;resolution:=optional, freemarker.template;resolution:=optional Export-Package: com.liferay.shipping.api.model;version="1.0.0", com.liferay.shipping.api.util;version="1.0.0" #2
  • 25. #2 manifestmanifestmanifestmanifest manifest EXPORT EXPORT Package dependencies (this is how we describe what we provide and expect) Import-Package: com.liferay.shipping.api.model, com.liferay.shipping.api.util, com.liferay.portal.kernel.io.unsync;resolution:=optional, com.liferay.portal.kernel.util;resolution:=optional, freemarker.cache;resolution:=optional, freemarker.template;resolution:=optional Export-Package: com.liferay.shipping.api.model;version="1.0.0", com.liferay.shipping.api.util;version="1.0.0" The BND tool (bnd.bndtools.org) can discover dependencies and automatically generate export/import manifest headers! Liferay SDK also allows you to use BND tool!
  • 26. OSGi services (this is how we provide and consume functionality) manifestmanifestmanifest manifest OSGi service registry Interface Service 1 ... Service N #3
  • 27. OSGi services (this is how we provide and consume functionality) manifestmanifestmanifest OSGi service registry Interface Service 1 ... Service N REGISTER REGISTER USE manifest #3
  • 28. #3 OSGi services (this is how we provide and consume functionality) manifestmanifestmanifest OSGi service registry Interface Service 1 ... Service N REGISTER REGISTER USE manifest There are number of component frameworks on top of OSGi (Declarative Services and Blueprint being part of the specs) which greatly simplify the usage of services!
  • 29. Sounds great, but how OSGi fits into Liferay ?
  • 30. Application server / Servlet container Liferay 6.2 Liferay CORE Portlet Portlet...
  • 31. Application server / Servlet container Liferay 6.2 Portlet application Portlet application Portlet application Portlet application Liferay CORE Portlet Portlet...
  • 32. Application server / Servlet container Liferay 6.2 Portlet application Portlet application Portlet application Portlet application Liferay CORE Portlet Portlet OSGi container ...
  • 33. Application server / Servlet container Liferay 6.2 Portlet application Portlet application Portlet application Portlet application Liferay CORE Portlet Portlet OSGi container OSGi core services HTTP Service Configuration Admin Service ... ... Liferay core OSGi services
  • 34. Application server / Servlet container Liferay 6.2 Portlet application Portlet application Portlet application Portlet application Liferay CORE Portlet Portlet OSGi container API Bundle API Bundle Service Bundle Extension bundle Service Bundle Portlet Bundle Extension Bundle Portlet Bundle OSGi core services HTTP Service Configuration Admin Service ... ... Liferay core OSGi services
  • 35. Application server / Servlet container Liferay 6.2 Portlet application Portlet application Portlet application Portlet application Liferay CORE Portlet Portlet OSGi container API Bundle API Bundle Service Bundle Extension bundle Service Bundle Portlet Bundle Extension Bundle Portlet Bundle OSGi core services HTTP Service Configuration Admin Service ... ... Liferay core OSGi services In Liferay 6.2 portlets inside OSGi container have certain limitations!
  • 37. There is an extra step in Liferay 6.2 as not all dependencies are provided! You will NOT need to do this in Liferay 7! #0 Shipping application modules (bundles)
  • 38. #1 Shipping application modules (bundles)
  • 39. #1 Shipping application modules (bundles)
  • 40. #1 Shipping application modules (bundles)
  • 41. #2 Shipping application modules (bundles)
  • 42. #2 Shipping application modules (bundles)
  • 43. #2 Shipping application modules (bundles)
  • 44. #2 Shipping application modules (bundles)
  • 45. #2 Shipping application modules (bundles)
  • 46. #3 Shipping application modules (bundles)
  • 47. This approach is for Liferay 6.2 only ! It will change in Liferay 7 ! This approach is for Liferay 6.2 only ! It will change in Liferay 7 ! #3 Shipping application modules (bundles)
  • 48. Our main application is ready! Let's try it !
  • 49. #4 Shipping application modules (bundles)
  • 50. #4 Shipping application modules (bundles)
  • 52. #5 Shipping application modules (bundles)
  • 53. #5 Shipping application modules (bundles)
  • 55. Where you go from here?
  • 56. Send feedback! Build your own OSGi modules Learn more about OSGi Try the samples yourself https://github.com/epgarcia/liferay-plugins/commits/LRNAS2014.OSGI