c.dedek Orientation In Objects GmbH p.g.taboada pgt technology scouting GmbH Modularisierung vom Toolalptraum ins Architekturchaos in 60 Minuten Mit Java 7 und Jigsaw werden wir alle schon über die Plattform mit einem Modularisierungskonzept und passendem Build-Management versorgt. Bisher etablierte Konzepte und Vorgehensweisen zur Modularisierung wie OSGi und JEE werden hierdurch auf den Prüfstand gestellt. "Ist doch viel zu monolitisch", "wird doch nicht testbar"... Wo aber bleibt die Architektur bei all der Technologie in der Debatte? Wir geben Hinweise, wie man sich anständig durch das Chaos schlägt. Modularisierung...
Session Topics Modularization? Java & Modularization A word on tooling JSF Spring JPA 2.0 architecture?
As documentation produced by architects, typically drawings, plans and technical specifications, architecture defines the structure and/or behavior of a building or any other kind of system that is to be or has been constructed. Wikipedia 5 technologies ain t no architecture! 6
XML as meta language XML is fun XML is extensible XML is creativity 7 XML as meta language XML is extensible XML is fun Mit XML darf man kreativ sein XML is creativity 7
XML used in XMI 8 <xmi:xmi xmi:version="2.1" timestamp="sat May 27 19:48:23 CEST 2006" xmlns:uml="http://schema.omg.org/spec/uml/2.0" xmlns:xmi="http://schema.omg.org/spec/xmi/2.1"> <xmi:documentation xmi:exporter="magicdraw UML" xmi:exporterversion="11.0"/> <uml:model xmi:id="eee_1045467100313_135436_1" name="data" visibility="public"> <xmi:extension xmi:extender="magicdraw UML 11.0" xmi:extenderid="magicdraw UML 11.0"> <moduleextension ignoredinmodule="true"/> </xmi:extension> <ownedcomment xmi:type="uml:comment" xmi:id="_11_0_1_8b70279_1148722106536_123286_1" body="author:papick. Created:27.05.06 11:28. Title:. Comment:. " annotatedelement="eee_1045467100313_135436_1"/> <ownedmember xmi:type="uml:package" xmi:id="_11_0_1_8b70279_1148722111694_682770_2" name="com.clickandbuy" visibility="public"/> <ownedmember xmi:type="uml:component" xmi:id="_11_0_1_8b70279_1148722161245_471481_7" name="subsystem-core" visibility="public"> <realization xmi:type="uml:realization" xmi:id="_11_0_1_8b70279_1148722190807_781764_30" visibility="public" realizingclassifier="_11_0_1_8b70279_1148722190807_12161_28" supplier="_11_0_1_8b70279_1148722190807_12161_28" client="_11_0_1_8b70279_1148722161245_471481_7"/> <realization xmi:type="uml:realization" xmi:id="_11_0_1_8b70279_1148722395292_63694_157" visibility="public" realizingclassifier="_11_0_1_8b70279_1148722358809_513951_140" supplier="_11_0_1_8b70279_1148722358809_513951_140" client="_11_0_1_8b70279_1148722161245_471481_7"/> <realization xmi:type="uml:realization" xmi:id="_11_0_1_8b70279_1148733508912_898457_546" visibility="public" realizingclassifier="_11_0_1_8b70279_1148733508912_180621_544" supplier="_11_0_1_8b70279_1148733508912_180621_544" client="_11_0_1_8b70279_1148722161245_471481_7"/> <realization xmi:type="uml:realization" xmi:id="_11_0_1_8b70279_1148733540788_592306_586" visibility="public" realizingclassifier="_11_0_1_8b70279_1148733540788_228842_584" supplier="_11_0_1_8b70279_1148733540788_228842_584" client="_11_0_1_8b70279_1148722161245_471481_7"/> <nestedclassifier xmi:type="uml:interface" xmi:id="_11_0_1_8b70279_1148722190807_12161_28" name="publishedservice" visibility="public"/> <nestedclassifier xmi:type="uml:class" xmi:id="_11_0_1_8b70279_1148733508912_180621_544" visibility="public"/> <nestedclassifier xmi:type="uml:class" xmi:id="_11_0_1_8b70279_1148733540788_228842_584" name="dom" visibility="public"/> <interfacerealization xmi:type="uml:interfacerealization" xmi:id="_11_0_1_8b70279_1148722217446_942875_60" visibility="public" contract="_11_0_1_8b70279_1148722190807_12161_28" supplier="_11_0_1_8b70279_1148722190807_12161_28" client="_11_0_1_8b70279_1148722161245_471481_7"/> </ownedmember> <ownedmember xmi:type="uml:component" xmi:id="_11_0_1_8b70279_1148722264834_475474_73" name="subsystem-impl" visibility="public"> <interfacerealization xmi:type="uml:interfacerealization" xmi:id="_11_0_1_8b70279_1148733557612_907435_606" visibility="public" contract="_11_0_1_8b70279_1148722190807_12161_28" supplier="_11_0_1_8b70279_1148722190807_12161_28" client="_11_0_1_8b70279_1148722264834_475474_73"/> </ownedmember> <ownedmember xmi:type="uml:component" xmi:id="_11_0_1_8b70279_1148722312903_528399_94" visibility="public"/> <ownedmember xmi:type="uml:dependency" xmi:id="_11_0_1_8b70279_1148722312923_409077_96" visibility="public" supplier="_11_0_1_8b70279_1148722312903_528399_94" client="_11_0_1_8b70279_1148722264834_475474_73"/> <ownedmember xmi:type="uml:artifact" xmi:id="_11_0_1_8b70279_1148722358809_513951_140" visibility="public"/> <ownedmember xmi:type="uml:component" xmi:id="_11_0_1_8b70279_1148732049524_447560_277" name="subsystem-serviceexporter" visibility="public"> <realization xmi:type="uml:realization" xmi:id="_11_0_1_8b70279_1148736855494_61906_1426" visibility="public" realizingclassifier="_11_0_1_8b70279_1148736855494_900019_1424" supplier="_11_0_1_8b70279_1148736855494_900019_1424" client="_11_0_1_8b70279_1148732049524_447560_277"/> <realization xmi:type="uml:realization" xmi:id="_11_0_1_8b70279_1148736866450_127377_1447" visibility="public" realizingclassifier="_11_0_1_8b70279_1148736866440_37201_1445" supplier="_11_0_1_8b70279_1148736866440_37201_1445" client="_11_0_1_8b70279_1148732049524_447560_277"/> <nestedclassifier xmi:type="uml:class" xmi:id="_11_0_1_8b70279_1148736855494_900019_1424" name="dto" visibility="public"/> <nestedclassifier xmi:type="uml:interface" xmi:id="_11_0_1_8b70279_1148736866440_37201_1445" name="publishedremotedtoservice" visibility="public"/> <interfacerealization xmi:type="uml:interfacerealization" xmi:id="_11_0_1_8b70279_1148732140745_117398_312" visibility="public" contract="_11_0_1_8b70279_1148722190807_12161_28" supplier="_11_0_1_8b70279_1148722190807_12161_28" client="_11_0_1_8b70279_1148732049524_447560_277"/> XML used in XMI <interfacerealization xmi:type="uml:interfacerealization" xmi:id="_11_0_1_8b70279_1148732270101_889829_352" visibility="public" contract="_11_0_1_8b70279_1148732270091_783554_350" supplier="_11_0_1_8b70279_1148732270091_783554_350" client="_11_0_1_8b70279_1148732049524_447560_277"/> <interfacerealization xmi:type="uml:interfacerealization" xmi:id="_11_0_1_8b70279_1148736916722_450661_1466" visibility="public" 8
XML as XMI XML is no fun XML is not extensible creativity??? 9 XML as XMI XML is not extensible XML is no fun Mit XML darf man kreativ sein creativity??? 9
XML used in XMI 10 <xmi:xmi xmi:version="2.1" timestamp="sat May 27 19:48:23 CEST 2006" xmlns:uml="http://schema.omg.org/spec/uml/2.0" xmlns:xmi="http://schema.omg.org/spec/xmi/2.1"> <xmi:documentation xmi:exporter="magicdraw UML" xmi:exporterversion="11.0"/> <uml:model xmi:id="eee_1045467100313_135436_1" name="data" visibility="public"> <xmi:extension xmi:extender="magicdraw UML 11.0" xmi:extenderid="magicdraw UML 11.0"> <moduleextension ignoredinmodule="true"/> </xmi:extension> <ownedcomment xmi:type="uml:comment" xmi:id="_11_0_1_8b70279_1148722106536_123286_1" body="author:papick. Created:27.05.06 11:28. Title:. Comment:. " annotatedelement="eee_1045467100313_135436_1"/> <ownedmember xmi:type="uml:package" xmi:id="_11_0_1_8b70279_1148722111694_682770_2" name="com.clickandbuy" visibility="public"/> <ownedmember xmi:type="uml:component" xmi:id="_11_0_1_8b70279_1148722161245_471481_7" name="subsystem-core" visibility="public"> <realization xmi:type="uml:realization" xmi:id="_11_0_1_8b70279_1148722190807_781764_30" visibility="public" realizingclassifier="_11_0_1_8b70279_1148722190807_12161_28" supplier="_11_0_1_8b70279_1148722190807_12161_28" client="_11_0_1_8b70279_1148722161245_471481_7"/> <realization xmi:type="uml:realization" xmi:id="_11_0_1_8b70279_1148722395292_63694_157" visibility="public" realizingclassifier="_11_0_1_8b70279_1148722358809_513951_140" supplier="_11_0_1_8b70279_1148722358809_513951_140" client="_11_0_1_8b70279_1148722161245_471481_7"/> <realization xmi:type="uml:realization" xmi:id="_11_0_1_8b70279_1148733508912_898457_546" visibility="public" realizingclassifier="_11_0_1_8b70279_1148733508912_180621_544" supplier="_11_0_1_8b70279_1148733508912_180621_544" client="_11_0_1_8b70279_1148722161245_471481_7"/> <realization xmi:type="uml:realization" xmi:id="_11_0_1_8b70279_1148733540788_592306_586" visibility="public" realizingclassifier="_11_0_1_8b70279_1148733540788_228842_584" supplier="_11_0_1_8b70279_1148733540788_228842_584" client="_11_0_1_8b70279_1148722161245_471481_7"/> <nestedclassifier xmi:type="uml:interface" xmi:id="_11_0_1_8b70279_1148722190807_12161_28" name="publishedservice" visibility="public"/> <nestedclassifier xmi:type="uml:class" xmi:id="_11_0_1_8b70279_1148733508912_180621_544" visibility="public"/> <nestedclassifier xmi:type="uml:class" xmi:id="_11_0_1_8b70279_1148733540788_228842_584" name="dom" visibility="public"/> <interfacerealization xmi:type="uml:interfacerealization" xmi:id="_11_0_1_8b70279_1148722217446_942875_60" visibility="public" contract="_11_0_1_8b70279_1148722190807_12161_28" supplier="_11_0_1_8b70279_1148722190807_12161_28" client="_11_0_1_8b70279_1148722161245_471481_7"/> </ownedmember> <ownedmember xmi:type="uml:component" xmi:id="_11_0_1_8b70279_1148722264834_475474_73" name="subsystem-impl" visibility="public"> <interfacerealization xmi:type="uml:interfacerealization" xmi:id="_11_0_1_8b70279_1148733557612_907435_606" visibility="public" contract="_11_0_1_8b70279_1148722190807_12161_28" supplier="_11_0_1_8b70279_1148722190807_12161_28" client="_11_0_1_8b70279_1148722264834_475474_73"/> </ownedmember> <ownedmember xmi:type="uml:component" xmi:id="_11_0_1_8b70279_1148722312903_528399_94" visibility="public"/> <ownedmember xmi:type="uml:dependency" xmi:id="_11_0_1_8b70279_1148722312923_409077_96" visibility="public" supplier="_11_0_1_8b70279_1148722312903_528399_94" client="_11_0_1_8b70279_1148722264834_475474_73"/> <ownedmember xmi:type="uml:artifact" xmi:id="_11_0_1_8b70279_1148722358809_513951_140" visibility="public"/> <ownedmember xmi:type="uml:component" xmi:id="_11_0_1_8b70279_1148732049524_447560_277" name="subsystem-serviceexporter" visibility="public"> <realization xmi:type="uml:realization" xmi:id="_11_0_1_8b70279_1148736855494_61906_1426" visibility="public" realizingclassifier="_11_0_1_8b70279_1148736855494_900019_1424" supplier="_11_0_1_8b70279_1148736855494_900019_1424" client="_11_0_1_8b70279_1148732049524_447560_277"/> <realization xmi:type="uml:realization" xmi:id="_11_0_1_8b70279_1148736866450_127377_1447" visibility="public" realizingclassifier="_11_0_1_8b70279_1148736866440_37201_1445" supplier="_11_0_1_8b70279_1148736866440_37201_1445" client="_11_0_1_8b70279_1148732049524_447560_277"/> <nestedclassifier xmi:type="uml:class" xmi:id="_11_0_1_8b70279_1148736855494_900019_1424" name="dto" visibility="public"/> <nestedclassifier xmi:type="uml:interface" xmi:id="_11_0_1_8b70279_1148736866440_37201_1445" name="publishedremotedtoservice" visibility="public"/> <interfacerealization xmi:type="uml:interfacerealization" xmi:id="_11_0_1_8b70279_1148732140745_117398_312" visibility="public" contract="_11_0_1_8b70279_1148722190807_12161_28" supplier="_11_0_1_8b70279_1148722190807_12161_28" client="_11_0_1_8b70279_1148732049524_447560_277"/> XML used in XMI <interfacerealization xmi:type="uml:interfacerealization" xmi:id="_11_0_1_8b70279_1148732270101_889829_352" visibility="public" contract="_11_0_1_8b70279_1148732270091_783554_350" supplier="_11_0_1_8b70279_1148732270091_783554_350" client="_11_0_1_8b70279_1148732049524_447560_277"/> <interfacerealization xmi:type="uml:interfacerealization" xmi:id="_11_0_1_8b70279_1148736916722_450661_1466" visibility="public" 10
Analogy? Technologies as meta-language you can do everything technologies are fun you must be creative Architecture is how we finally structure our thing and use the technologies stops being fun 11 left-hand-right-hand situation Should architectures be neutral to technologies? When do we find out if a given architecture fits a given technology stack? Who is in charge here? 12
super-architect JSF Spring JPA 2.0 modularization?
Divide & Conquer break it into pieces components layers modules aspects?
0100100101001100 110010010010010 010010010101 01010010101 010010010101 100100101010 10101010 010010010101 101 101111001011 0101010101 bad guy 0100100101001100 110010010010010 010010010101 01010010101 010010010101 100100101010 10101010 010010010101 101 101111001011 0101010101 I am amonolithical thing! bad guy
0100100101001100 110010010010010 010010010101 01010010101 010010010101 100100101010 10101010 010010010101 101 101111001011 0101010101 I am amonolithical thing! I am not known for reusability, maintainability, etc.. bad guy 0100100101001100 110010010010010 010010010101 01010010101 010010010101 100100101010 10101010 010010010101 101 101111001011 0101010101 see the duplicate code?
0100100101001100 110010010010010 010010010101 01010010101 010010010101 100100101010 10101010 010010010101 101 101111001011 0101010101 re-use it! 0100100101001100 110010010010010 XXX 01010010101 XXX 100100101010 10101010 XXX 101 101111001011 0101010101 XXX 010010010101 lifecycle? state? runtime?
XXX provides interfaces 010010010101 provides services managed bean! XXX 010010010101 YYY 010010010101 component based development
Granularität break it into pieces components layers modules aspects?
presentation layer business logic layer integration layer layers presentation layer business logic layer integration layer business delegate session facade service beans manager beans daos transfer objects converters entity beans layers
break it into pieces components layers modules aspects? modules? business logic layer integration layer business logic layer integration layer business logic layer integration layer
allowed intimacy level? modules? business logic layer integration layer business logic layer integration layer business logic layer integration layer business logic layer integration layer business logic layer integration layer business logic layer integration layer
modules? break it into pieces components layers modules aspects? business logic layer integration layer business logic layer integration layer business logic layer integration layer
minimum aop? break it into pieces components layers modules aspects? monitoring transaction business logic layer integration layer business logic layer integration layer business logic layer integration layer security
integration? RCP Client JSF Client BL 1 BL 2 BL 3 DAO A DAO B DAO C DAO D simple 2 client situation
RCP Client JSF Client v.1.0 v.1.0 v.1.0 v.1.0 BL 1 BL 2 BL 3 v.1.0 v.1.0 v.1.0 v.1.0 v.1.0 v.1.0 DAO A DAO B DAO C DAO D... with versions... RCP Client JSF Client RCP PrimeFaces v.1.0 v.1.0 v.1.0 v.1.0 DOJO Spring BL 1 BL 2 BL 3 Log4J Hibernate v.1.0 v.1.0 v.1.0 v.1.0 v.1.0 v.1.0 DAO A DAO B DAO C DAO D and 3rd party libs
windows? RCP Client tomcat v.6.x JSF Client RCP PrimeFaces jboss v.5.x v.1.0 v.1.0 v.1.0 v.1.0 BL 1 BL 2 BL 3 DOJO Spring Log4J Hibernate v.1.0 v.1.0 v.1.0 v.1.0 v.1.0 v.1.0 DAO A DAO B DAO C DAO D and runtimes How? Release management? Versioning? Backwards compatibility? Dependency resolution & mediation? Compiletime vs. runtime?
Session Topics Modularization? Java & Modularization A word on tooling WAR EJB-JAR util JAR Java EE
WAR EJB-JAR util JAR Servlet Java EE WAR EJB-JAR util JAR Servlet EAR Java EE
WAR EJB-JAR util JAR Servlet EAR Java EE ear packaging, class loaders,... ejb-jar instance sharing ejb-jar class sharing util-jar java EE modules
modules? allowed intimacy level? business logic layer integration layer business logic layer integration layer business logic layer integration layer business logic layer integration layer business logic layer integration layer business logic layer integration layer
we can... package modules do class sharing do instance sharing no versions no visibility constraints no module lifecycle BL 1 dependencies runtime configuration modularization testtime compiletime DAO A interface impl mock template hibernate api DI container/ Spring
runtime dependency scopes compile time dependencies handled by compiler, IDE, classpath runtime dependency declared/ managed in context POM v1.0 artefact 2 artefact 1 v1.2 artefact 3 Maven (ivy too...)
dependency mediation for poor EE people because we have versions solve version problems at compile time no fancy-osgi features at runtime RCP Client JSF Client RCP PrimeFaces v.1.0 v.1.0 v.1.0 v.1.0 DOJO Spring BL 1 BL 2 BL 3 Log4J Hibernate v.1.0 v.1.0 v.1.0 v.1.0 v.1.0 v.1.0 DAO A DAO B DAO C DAO D and 3rd party libs
JSF Client v.1.0 Frontend Libs v.1.0 v.1.0 RCP PrimeFaces v.1.0 DOJO v.1.0 Spring BL 3 v.1.0 Backend Libs v.1.0 v.1.0 Log4J Hibernate v.1.0 DAO D transitive dependencies dead end with Java EE
install update refresh INSTALLED STARTING resolve update refresh start stop RESOLVED ACTIVE uninstall uninstall stop UNINSTALLED STOPPING Bundle OSGi install update refresh INSTALLED STARTING resolve update refresh start stop RESOLVED ACTIVE uninstall uninstall stop UNINSTALLED STOPPING Bundle OSGi
INSTALLED resolve update refresh uninstall install RESOLVED uninstall UNINSTALLED update refresh start STARTING ACTIVE stop STOPPING stop INSTALLED resolve update refresh uninstall install RESOLVED uninstall UNINSTALLED update refresh start STARTING ACTIVE stop STOPPING stop INSTALLED resolve update refresh uninstall install RESOLVED uninstall UNINSTALLED update refresh start STARTING ACTIVE stop STOPPING stop install update refresh INSTALLED STARTING resolve update refresh start stop RESOLVED ACTIVE uninstall uninstall stop UNINSTALLED STOPPING Bundle OSGi OSGi Runtime packaging, class loaders,... visible Bundle instance sharing v1.0 visible Bundle v1.1 class sharing visible Bundle OSGi bundles
we can... do class sharing do instance sharing do runtime loading/ unloading do multi-version-loading define visibility constraints hard to do cross-module-container-ee-services Java EE APIs don t fit into OSGi e.g.... monolothical configs classloading nightmares don t work by design
Java 7, 8,... super packages? modules? simplified module system? dynamic modules? ==> Java EE?!? All this works fine as long as a project fits into a single package. Once the project grows beyond that, you may find yourself forced to make implementation classes public in order to access them from multiple packages in the project. That loses the benefits of information hiding, which is clearly suboptimal and a long-standing complaint that often comes up in language discussions in forums such as JavaOne. Blog: Superpackage strawman and the JSR 294 mailing list
All this works fine as long as a project fits into a single package. Once the project grows beyond that, you may find yourself forced to make implementation classes public in order to access them from multiple packages in the project. That loses the benefits of information hiding, which is clearly suboptimal and a long-standing complaint that often comes up in language discussions in forums such as JavaOne. Blog: Superpackage strawman and the JSR 294 mailing list However, if a project is too large to fit into a single package, Java does not provide a suitable encapsulation mechanism. Strawman Proposal for JSR 294 Superpackages
Session Topics Modularization? Java & Modularization A word on tooling tools: a matter of context
develop modular software APIs IDEs Test-Frameworks build modular software integration server automated builds distributed builds? provisioning? release management?
run modular software runtime for modules module/ app deployment intelligent clustering? each tool is great and does (mostly) not work with the others no standard? no standard tooling.
Was tun? Problem Technologien können einem das noch so schönes und ausgeklügeltes Architekturvorhaben ordentlich versaubeuteln
Zauberhafte Technologien Sind nicht mehr so zauberhaft wenn man versucht modular zu entwickeln. Viele Komponentenmodelle, keine Lösungsansätze für Modularisierung Zaubertrank wird schnell zum Gift Thanks!
Schulung: Einführung in die OSGi Service Platform http://www.oio.de/seminar/java/seminar-osgi-schulung-equinox-traing.htm Schulung: Eclipse als Rich Client Plattform http://www.oio.de/eclipse-swt-jface-plugin-rcp-osgi-schulung.htm Mehr von OIO zum Thema