Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
OSGi with Maven
Improved developer productivity thanks to standard tools
Thank you!
To correct me:
luke | code-house.org
twitter: @ldywicki
code: https://github.com/Code-House/eclipsecon (under A...
Is it a perfect marriage?
Is it a perfect marriage?
Let's face the truth
Source: https://twitter.com/vorburger/status/1044203455055892481
Google trends
About me
Self employed consultant since 2008, a middleware specialist.
● Open Source enthusiast since forever
● Apache Kar...
Few words about world
How does it look a like outhere
Tool usage
Source: https://snyk.io/blog/jvm-ecosystem-report-2018-tools
Build tools
Source: https://snyk.io/blog/jvm-ecosystem-report-2018-tools
Artifact repositories
Source: https://snyk.io/blog/jvm-ecosystem-report-2018-tools
Testing tools
Source: https://snyk.io/blog/jvm-ecosystem-report-2018-tools
Runtimes
Source: https://snyk.io/blog/jvm-ecosystem-report-2018-platform-application
OSGi is not classified in runtimes
● Some of server runtimes can run OSGi
● OSGi can be run inside a WAR
● There are a lot...
Communication troubles
Pay attention to what you say
There is a problem finding people
knowing OSGi.
Closer look on Maven
Maven is ...
● build tool
○ compiler
○ test runner
○ packager
○ site generator
But it is also
● Tool promoting convention ...
a word about configuration
● Global
$M2_HOME/conf/settings.xml
● Local, user settings
~/.m2/settings.xml
● Project
pom.xml
a bit about inheritance
● Projects can be organised into a tree:
○ super pom (implicit)
■ organisation POM
● project A
○ c...
what is inherited
● dependency management
● dependencies
● plugins
○ executions
○ configurations
● resources configuration
Convention over configuration
● You palce sources in src/
○ code in main/java, resources in main/resources
○ tests in test...
Repository client
● Maven brought remote repository idea to mainstream
● Elements are identified by:
○ group id
○ artifact...
Dependency manager
● Maven recognizes basic dependency scopes
○ compile
○ runtime
○ test (not transitive)
○ provided (not ...
Transient dependencies
What dependency management do
#include <dependency.h>
<dependencyManagement>
<dependency>
<groupId>org.eclipse.smarthome</groupId>
<artifactId>smarthome...
Pluggable machina
● Maven internally uses simple IoC based on classpath scanning
● Classpath can be extended via plugin de...
Versions and ranges under Maven
● 2 becomes 2.0.0 when comparing
● Special values in qualifier:
○ "alpha" < "beta" < "mile...
Commonalities
Comparison
Element OSGi Maven
Build unit Bundle Project / Module
Dependency unit Package, req /cap Dependency
Platform def...
Project organisation
Systems are like onions
Source: http://www.downvids.net/shrek-moments-quot-ogres-are-like-onions-quot--317773.html, Shrek ...
Each bigger system have
● Domain model
● Persistence
● Communication interface
● Many provider/consumer relationship betwe...
Properly structured project is
easier to run and maintain.
Most of OSGi projects is properly
structured.
Some Maven based projects have
good structure.
Basic project structure
● root
○ model
○ api
○ core
○ dao
■ api
■ core
○ web
■ api
■ core
○ features
Manifest is just another resource
How to generate manifest
<packaging>bundle</packaging>
<!-- … -->
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId...
bndlib ✔
Manifest defaults
Bundle-SymbolicName: ${project.groupId}.${project.artifactId}
Bundle-Version: ${project.version}
Bundle-...
Deployment
How to bring bundles to runtime
Quick look on Karaf
Pax URL
● By default Java runtime supports following URI schemes:
○ http[s]:
○ file:
● Java / OSGi framework allows to pro...
Deploying bundles
● install mvn:org.code-house.eclipsecon.mvnosgi/api/RELEASE
● install mvn:org.code-house.eclipsecon.mvno...
Karaf feature
<feature name="book-service" version="${project.version}">
<feature>scr</feature>
<feature>cxf-jaxrs</featur...
Testing
How to bring bundles to runtime
OSGi -> junit -> test
junit -> OSGi -> test
Demo time
Arquillian
Pax Exam
Pax Tinybundles
InputStream inp = bundle()
.activator(TestActivator.class)
.add(BookService.class)
.add(TestBookService.cl...
Exam containers
● OSGi
● Karaf
● Tomcat
● Weld
● JBoss / Wildfly 8 / Wildfly 9
Example test
@RunWith(PaxExam.class)
@ExamReactorStrategy(PerMethod.class)
public class ExampleIntegrationTest {
@Configur...
Unit testing - Felix Connect
● Emulates OSGi framework
○ Activators
○ Service lookups
○ Bundles and classloaders
● Perfect...
Felix Connect
String bundleFilter = "(&(Bundle-SymbolicName=*)(!(Bundle-SymbolicName=org.osgi.*)))";
List<BundleDescriptor...
JUnit 5
AssertJ
// entry point for all assertThat methods and utility methods (e.g. entry)
import static org.assertj.core.api.Asse...
Questions
Thank you!
To correct me:
luke | code-house.org
twitter: @ldywicki
code: https://github.com/Code-House/eclipsecon (under A...
Nächste SlideShare
Wird geladen in …5
×

Improved developer productivity thanks to Maven and OSGi - Lukasz Dywicki (Code-House)

101 Aufrufe

Veröffentlicht am

OSGi Community Event 2018 Presentation by Lukasz Dywicki (Code-House)

Abstract: During this short presentation I will revisit existing mechanisms and approach towards OSGi and JEE development. I will show how many manual steps can be avoided and how to maintain project in effective manner. I will try to find a balance between execution environment requirements and programmer happines at same time.

I believe that OSGi and Eclipse ecosystem experience troubles gaining people from outside for few reasons. Beside overall impression of OSGi complexity there is equally old and invalid complain about quaility of developer tooling. Since invention of BND development experience can be really pleasant and independent of text editor/IDE preferences. Sadly lots of people still rely on former experiences spreading black/bad PR. I would like to clarify their point.

After this presentation attendees will learn:

How to use Maven to build OSGi projects (without Tycho).
How to automate manual tasks.
How to build custom software distributions with Maven artifacts and run it with Apache Karaf.
That OSGi development doesn't differ much from regular day-to-day usage of application servers or microservice runtimes.
This talk is intended for people who know basics of OSGi as it will show few basic technics towards better developer productivity.

Veröffentlicht in: Technologie
  • How Brainwave Frequencies Can Change Your Life! ●●● http://t.cn/AiuvUCDd
       Antworten 
    Sind Sie sicher, dass Sie …  Ja  Nein
    Ihre Nachricht erscheint hier
  • 12 Signs From The Universe When You Are On The... ■■■ http://t.cn/AiuvUMl2
       Antworten 
    Sind Sie sicher, dass Sie …  Ja  Nein
    Ihre Nachricht erscheint hier
  • Nine Signs Wealth is Coming Your Way... ◆◆◆ http://scamcb.com/manifmagic/pdf
       Antworten 
    Sind Sie sicher, dass Sie …  Ja  Nein
    Ihre Nachricht erscheint hier

Improved developer productivity thanks to Maven and OSGi - Lukasz Dywicki (Code-House)

  1. 1. OSGi with Maven Improved developer productivity thanks to standard tools
  2. 2. Thank you! To correct me: luke | code-house.org twitter: @ldywicki code: https://github.com/Code-House/eclipsecon (under ASL 2.0)
  3. 3. Is it a perfect marriage?
  4. 4. Is it a perfect marriage?
  5. 5. Let's face the truth Source: https://twitter.com/vorburger/status/1044203455055892481
  6. 6. Google trends
  7. 7. About me Self employed consultant since 2008, a middleware specialist. ● Open Source enthusiast since forever ● Apache Karaf ○ committer since 2010 ○ project management committee since 2012 ● I worked for Red Hat, FUSE Source, been involved in projects for Alcatel-Lucent, Nokia Siemens Networks, Polish Post Bank, Royal Bank of Scotland etc. ● Eclipse user since 2003 ● Maven user since 2006
  8. 8. Few words about world How does it look a like outhere
  9. 9. Tool usage Source: https://snyk.io/blog/jvm-ecosystem-report-2018-tools
  10. 10. Build tools Source: https://snyk.io/blog/jvm-ecosystem-report-2018-tools
  11. 11. Artifact repositories Source: https://snyk.io/blog/jvm-ecosystem-report-2018-tools
  12. 12. Testing tools Source: https://snyk.io/blog/jvm-ecosystem-report-2018-tools
  13. 13. Runtimes Source: https://snyk.io/blog/jvm-ecosystem-report-2018-platform-application
  14. 14. OSGi is not classified in runtimes ● Some of server runtimes can run OSGi ● OSGi can be run inside a WAR ● There are a lot of people who knows Maven, Tomcat, IntellIJ and Eclipse and development model promoted by these tools
  15. 15. Communication troubles Pay attention to what you say
  16. 16. There is a problem finding people knowing OSGi.
  17. 17. Closer look on Maven
  18. 18. Maven is ... ● build tool ○ compiler ○ test runner ○ packager ○ site generator But it is also ● Tool promoting convention over configuration ● Repository client ● A dependency manager ● A pluggable machina
  19. 19. a word about configuration ● Global $M2_HOME/conf/settings.xml ● Local, user settings ~/.m2/settings.xml ● Project pom.xml
  20. 20. a bit about inheritance ● Projects can be organised into a tree: ○ super pom (implicit) ■ organisation POM ● project A ○ child project 1 ○ child project 2 ● project B ○ first child ○ second child
  21. 21. what is inherited ● dependency management ● dependencies ● plugins ○ executions ○ configurations ● resources configuration
  22. 22. Convention over configuration ● You palce sources in src/ ○ code in main/java, resources in main/resources ○ tests in test/java ● Results end up in target/ ● There are standard build phases (pre-test, test, package etc.) ● Plugins are hooked into phases ● Depending on plugin developer, there are various defaults
  23. 23. Repository client ● Maven brought remote repository idea to mainstream ● Elements are identified by: ○ group id ○ artifact id ○ version ○ classifier ○ type (packaging) Location: ${group id}/${artifact id}/${version}/${artifact id}-${version}[-${classifier}].${type} ● One project may have multiple repositories ● The central.maven.org is enabled by default ● You are free to define own repositories ○ in project descriptor ○ local or global maven settings
  24. 24. Dependency manager ● Maven recognizes basic dependency scopes ○ compile ○ runtime ○ test (not transitive) ○ provided (not transitive) ● system / import scopes are special kind ● Dependencies can be managed / forced by parent and also overridden
  25. 25. Transient dependencies
  26. 26. What dependency management do
  27. 27. #include <dependency.h> <dependencyManagement> <dependency> <groupId>org.eclipse.smarthome</groupId> <artifactId>smarthome</artifactId> <version>0.10.0-SNAPSHOT</version> <scope>import</scope> <type>pom</type> </dependency> </dependencyManagement>
  28. 28. Pluggable machina ● Maven internally uses simple IoC based on classpath scanning ● Classpath can be extended via plugin dependencies & extensions ● There is whole new extension mechanism in 3.x (enabling polyglot maven) ● Almost all, if not all, components are injected via IoC ● … did I mention that maven supports version ranges?
  29. 29. Versions and ranges under Maven ● 2 becomes 2.0.0 when comparing ● Special values in qualifier: ○ "alpha" < "beta" < "milestone" < "cr" / "rc" < "snapshot" < "final" / "ga" < "sp" ● 2.0-Snapshot matches [1,2.0) boundary (excludes 2.0 release) ● Customisable via SPI: ○ Version Scheme ○ Version Range Resolver ○ OSGi compatible version: https://github.com/Code-House/maven-osgi-resolver
  30. 30. Commonalities
  31. 31. Comparison Element OSGi Maven Build unit Bundle Project / Module Dependency unit Package, req /cap Dependency Platform definition Target Platform (PDE) Dependency management Version ranges Yes Yes Repositories OBR, P2 Maven repos
  32. 32. Project organisation
  33. 33. Systems are like onions Source: http://www.downvids.net/shrek-moments-quot-ogres-are-like-onions-quot--317773.html, Shrek movie was made by DreamWorks
  34. 34. Each bigger system have ● Domain model ● Persistence ● Communication interface ● Many provider/consumer relationship between these parts
  35. 35. Properly structured project is easier to run and maintain.
  36. 36. Most of OSGi projects is properly structured.
  37. 37. Some Maven based projects have good structure.
  38. 38. Basic project structure ● root ○ model ○ api ○ core ○ dao ■ api ■ core ○ web ■ api ■ core ○ features
  39. 39. Manifest is just another resource
  40. 40. How to generate manifest <packaging>bundle</packaging> <!-- … --> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <configuration> <instructions> <Export-Package>org.code_house.eclipsecon.mvnosgi.api</Export-Package> <Private-Package>org.code_house.eclipsecon.mvnosgi.core</Private-Package> <Bundle-Activator>org.code_house.eclipsecon.mvnosgi.core.Activator</Bundle-Activator> </instructions> </configuration> </plugin>
  41. 41. bndlib ✔
  42. 42. Manifest defaults Bundle-SymbolicName: ${project.groupId}.${project.artifactId} Bundle-Version: ${project.version} Bundle-Name: ${project.name} Bundle-Description: ${project.description} Bundle-Vendor: ${project.organization.name} Bundle-License: ${project.license*.url} Import-Package: * Export-Package: * Private-Package: *.impl.*, *.internal.*
  43. 43. Deployment How to bring bundles to runtime
  44. 44. Quick look on Karaf
  45. 45. Pax URL ● By default Java runtime supports following URI schemes: ○ http[s]: ○ file: ● Java / OSGi framework allows to provide new schemes (ie. bundle:) ● Pax URL provides: ○ wrap: ○ classpath: ○ mvn: ○ and few more (exploded dir and similar)
  46. 46. Deploying bundles ● install mvn:org.code-house.eclipsecon.mvnosgi/api/RELEASE ● install mvn:org.code-house.eclipsecon.mvnosgi/core/RELEASE ● install mvn:org.code-house.eclipsecon.mvnosgi.dao/api/RELEASE ● install mvn:org.code-house.eclipsecon.mvnosgi.dao/core/RELEASE/jar ● install mvn:org.code-house.eclipsecon.mvnosgi.web/api/LATEST/x86_64/jar
  47. 47. Karaf feature <feature name="book-service" version="${project.version}"> <feature>scr</feature> <feature>cxf-jaxrs</feature> <feature>aries-blueprint</feature> <bundle>mvn:org.code-house.eclipsecon.mvnosgi/core/1.0.0-SNAPSHOT</bundle> <bundle>mvn:org.code-house.eclipsecon.mvnosgi/api/1.0.0-SNAPSHOT</bundle> <bundle>mvn:org.code-house.eclipsecon.mvnosgi/model/1.0.0-SNAPSHOT</bundle> <bundle>mvn:org.code-house.eclipsecon.mvnosgi.dao/api/1.0.0-SNAPSHOT</bundle> <bundle>mvn:org.code-house.eclipsecon.mvnosgi.dao/core/1.0.0-SNAPSHOT</bundle> <bundle>mvn:org.code-house.eclipsecon.mvnosgi.web/core/1.0.0-SNAPSHOT</bundle> <bundle>mvn:org.code-house.eclipsecon.mvnosgi.web/api/1.0.0-SNAPSHOT</bundle> <bundle>mvn:org.code-house.eclipsecon.mvnosgi/dto/1.0.0-SNAPSHOT</bundle> <!-- … rest of stuff ... --> </feature>
  48. 48. Testing How to bring bundles to runtime
  49. 49. OSGi -> junit -> test
  50. 50. junit -> OSGi -> test
  51. 51. Demo time
  52. 52. Arquillian
  53. 53. Pax Exam
  54. 54. Pax Tinybundles InputStream inp = bundle() .activator(TestActivator.class) .add(BookService.class) .add(TestBookService.class) .symbolicName("test-bundle") .set(Constants.EXPORT_PACKAGE, "demo") .set(Constants.IMPORT_PACKAGE, "demo") .build();
  55. 55. Exam containers ● OSGi ● Karaf ● Tomcat ● Weld ● JBoss / Wildfly 8 / Wildfly 9
  56. 56. Example test @RunWith(PaxExam.class) @ExamReactorStrategy(PerMethod.class) public class ExampleIntegrationTest { @Configuration public Option[] config() { return options(junitBundles()); } @Test … }
  57. 57. Unit testing - Felix Connect ● Emulates OSGi framework ○ Activators ○ Service lookups ○ Bundles and classloaders ● Perfect candidate for unit testing based on plain maven classpath
  58. 58. Felix Connect String bundleFilter = "(&(Bundle-SymbolicName=*)(!(Bundle-SymbolicName=org.osgi.*)))"; List<BundleDescriptor> descriptors = new ClasspathScanner().scanForBundles(bundleFilter, loader); // setup felix-connect to use our bundles Map<String, Object> config = new HashMap<>(); config.put(PojoServiceRegistryFactory.BUNDLE_DESCRIPTORS, bundles); PojoServiceRegistry reg = new PojoServiceRegistryFactoryImpl().newPojoServiceRegistry(config); BundleContext bundleContext = reg.getBundleContext();
  59. 59. JUnit 5
  60. 60. AssertJ // entry point for all assertThat methods and utility methods (e.g. entry) import static org.assertj.core.api.Assertions.*; // basic assertions assertThat(frodo.getName()).isEqualTo("Frodo"); assertThat(frodo).isNotEqualTo(sauron);
  61. 61. Questions
  62. 62. Thank you! To correct me: luke | code-house.org twitter: @ldywicki code: https://github.com/Code-House/eclipsecon (under ASL 2.0)

×