{"id":650,"date":"2011-10-04T16:14:00","date_gmt":"2011-10-04T16:14:00","guid":{"rendered":"http:\/\/www.javacodegeeks.com\/2012\/10\/java-modularity-approaches-modules-modules-modules.html"},"modified":"2012-10-21T20:32:53","modified_gmt":"2012-10-21T20:32:53","slug":"java-modularity-approaches-modules","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2011\/10\/java-modularity-approaches-modules.html","title":{"rendered":"Java Modularity Approaches &#8211; Modules, modules, modules"},"content":{"rendered":"<div dir=\"ltr\" style=\"text-align: left\">I think everybody will agree that writing modular applications and modularity in general is a good thing.<\/p>\n<p>But how does support for modularity look like, both from the Java and Scala languages and various Java\/Scala frameworks? There\u2019s a lot of different approaches! Let\u2019s look at some of them. Below \u201cprotection\u201d means how well modules are separated either at compile-time or run-time.<\/p>\n<p><span style=\"font-size: large\"><strong>Packages<\/strong><\/span><\/p>\n<p>First of all we\u2019ve got <strong>Java (or Scala) packages<\/strong>. The concept is very useful when it comes to organizing the source code. However it doesn\u2019t offer compile-time or run-time (except for the package-protected visibility, which isn\u2019t used too widely) protection, so it\u2019s rather hard to say that packages are any help in modularizing the code. Also, there\u2019s a lot of naming problems and hence conventions: if for example we have two implementations of a data reader, one using a database, the second using the filesystem, should the associated classes go to database and filesystem subpackages, or stay in the same top-level package? Should the class names be prefixed with Database and Filesystem, even if they are inside the dedicated packages?<\/p>\n<p><span style=\"font-size: large\"><strong>Build subprojects<\/strong><\/span><\/p>\n<p>Secondly, there\u2019s <strong>Maven\/SBT modules\/subprojects<\/strong>. They offer compile-time protection, which is a very nice thing: we can now statically make sure that our code only references classes from the explicitly specified dependencies. However, then comes the obvious question: when is a functionality \u201cbig enough\u201d to make it a separate Maven module? Is it ok to have many Maven modules, each containing only several classes (which can be a PITA, having to define a separate pom, directory structure for each), or should they be bigger? What about naming conventions, should the package name correspond to the module name? If so, we\u2019re clearly violating <a href=\"http:\/\/en.wikipedia.org\/wiki\/Don%27t_repeat_yourself\">DRY<\/a> here ;)!<\/p>\n<p>Imagine we decide to put our database and filesystem data readers into separate packages, maven modules and name them appropriately. So we have a DatabaseReader (plus 10 helper classes) in a foo.bar.database package in the myapp-database Maven module. Now a simple refactoring: renaming \u201cdatabase\u201d to \u201cdb\u201d becomes a really complex task, most certainly ending up in using various terms in various places.<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<p><span style=\"font-size: large\"><strong>OSGi<\/strong><\/span><\/p>\n<p>The next step of the evolution would be <a href=\"http:\/\/www.google.pl\/url?sa=t&amp;source=web&amp;cd=2&amp;ved=0CDQQFjAB&amp;url=http%3A%2F%2Fwww.osgi.org%2F&amp;ei=Jt1HTrKdAcWZOpSCpfMD&amp;usg=AFQjCNGL-pQ2Iv69bMfSqJx-r9JSJhmWZA&amp;sig2=4ts3qWb8xeebWC80x4Kefw\">OSGi bundles<\/a> (or, equivalently, a module in <a href=\"https:\/\/docs.jboss.org\/author\/display\/MODULES\/Home\">JBoss Modules<\/a> or in <a href=\"http:\/\/openjdk.java.net\/projects\/jigsaw\/\">Project Jigsaw<\/a>). One such bundle is typically a product of one (or more) Maven module, but it also offers run-time protection by appropriately scoping class-loaders. All of the problems from Maven modules are inherited \u2026 with the additional need to name the bundle!<\/p>\n<p><span style=\"font-size: large\"><strong>Nested classes\/cake pattern<\/strong><\/span><\/p>\n<p>Another possibility of scoping your code is using <strong>nested classes<\/strong>, or even to go further and use the <a href=\"http:\/\/www.warski.org\/blog\/2010\/12\/di-in-scala-cake-pattern\/\">Cake pattern in Scala<\/a>. Apart from the old problems: what package to use and how to name the module class, we\u2019ve got a couple new ones. Firstly, the whole source code of the module is now in one file. This can mean really long files! However maybe that\u2019s more of an IDE problem: nobody said that a file needs to be edited all at once; the editor could show only one module class\/method (like in the Smalltalk IDE). Cake pattern is also <a href=\"http:\/\/www.warski.org\/blog\/2011\/04\/di-in-scala-cake-pattern-pros-cons\/\">not free of problems<\/a>. And, what about nested modules?<\/p>\n<p><span style=\"font-size: large\"><strong>DI frameworks<\/strong><\/span><\/p>\n<p>Finally, we\u2019ve got various <strong>DI frameworks<\/strong> (like Guice, Spring or CDI), where, if we look from an appropriate perspective, we define small modules (classes) which can depend on other modules (injected by the container). Separating the module interface (java interface) from the module implementation (java class), and only injecting the interface is also very common. But again, the only way to partially statically prevent injecting the implementation we have to resort to creating separate -api and -impl Maven modules.<\/p>\n<p>In fact, if we take the approach of nested classes, a DI framework may be very well suited for resolving inter-module dependencies and doing all of the wiring for us (which can be very useful if we want to be protected from situations where a module has a new dependency, and each use-site must be now amended).<\/p>\n<p><span style=\"font-size: large\"><strong>Next?<\/strong><\/span><\/p>\n<p>To sum up, I think that the various approaches to supporting modularity could use some unification. And, unfortunately, this would probably mean totally departing from what we know today from Java\/Scala: a new package system, a new build system, a new runtime system. Unfortunately the outcrop of new programming languages doesn\u2019t offer much in that area.<\/p>\n<p>Do you think there should be one module system, usable both in the small (single classes) and in the large (sets of classes)? After all, what a <strong>DI container<\/strong> does to resolve the dependencies and instantiate classes isn\u2019t so much different from what <strong>Maven<\/strong> or an <strong>OSGi<\/strong> runtime does when booting!<\/p>\n<p>Or maybe modules inherently have several types, small ones (class-level) and big ones (maven module\/osgi bundle-level)?<\/p>\n<p>Lastly, maybe there are some other non-JVM based languages, which solve the modularity problem (still being usable) in a nicer way?<\/p>\n<p><strong><i>Reference: <\/i><\/strong><a href=\"http:\/\/www.warski.org\/blog\/2011\/08\/modules-modules-modules\/\">Modules, modules, modules\u2026<\/a> from our <a href=\"http:\/\/www.javacodegeeks.com\/p\/jcg.html\">JCG partner<\/a> <a href=\"http:\/\/www.warski.org\/blog\/\">Adam Warski<\/a>.<\/p>\n<div style=\"margin: 0px\"><strong><i>Related Articles :<\/i><\/strong><\/div>\n<ul>\n<li><a href=\"http:\/\/www.javacodegeeks.com\/2011\/09\/jboss-modules-example-modular-web.html\">JBoss Modules Example &#8211; Modular Web Application<\/a><\/li>\n<li><a href=\"http:\/\/www.javacodegeeks.com\/2011\/09\/real-modular-web-applications-why-there.html\">Real modular web applications: Why there is no standard for developing them?<\/a><\/li>\n<li><a href=\"http:\/\/www.javacodegeeks.com\/2011\/06\/osgi-using-maven-equinox.html\">OSGi Using Maven with Equinox<\/a><\/li>\n<li><a href=\"http:\/\/www.javacodegeeks.com\/?tag=java-best-practices\">Java Best Practices Series<\/a><\/li>\n<li><a href=\"http:\/\/www.javacodegeeks.com\/p\/java-tutorials.html\">Java Tutorials and Android Tutorials list<\/a><\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>I think everybody will agree that writing modular applications and modularity in general is a good thing. But how does support for modularity look like, both from the Java and Scala languages and various Java\/Scala frameworks? There\u2019s a lot of different approaches! Let\u2019s look at some of them. Below \u201cprotection\u201d means how well modules are &hellip;<\/p>\n","protected":false},"author":89,"featured_media":112,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[243],"class_list":["post-650","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-java","tag-modularity"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Java Modularity Approaches - Modules, modules, modules - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"I think everybody will agree that writing modular applications and modularity in general is a good thing. But how does support for modularity look like,\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2011\/10\/java-modularity-approaches-modules.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Java Modularity Approaches - Modules, modules, modules - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"I think everybody will agree that writing modular applications and modularity in general is a good thing. But how does support for modularity look like,\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2011\/10\/java-modularity-approaches-modules.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2011-10-04T16:14:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2012-10-21T20:32:53+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Adam Warski\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@http:\/\/twitter.com\/adamwarski\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Adam Warski\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/10\\\/java-modularity-approaches-modules.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/10\\\/java-modularity-approaches-modules.html\"},\"author\":{\"name\":\"Adam Warski\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/1974bff2e48a09ab944a3f9eada83438\"},\"headline\":\"Java Modularity Approaches &#8211; Modules, modules, modules\",\"datePublished\":\"2011-10-04T16:14:00+00:00\",\"dateModified\":\"2012-10-21T20:32:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/10\\\/java-modularity-approaches-modules.html\"},\"wordCount\":881,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/10\\\/java-modularity-approaches-modules.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"keywords\":[\"Modularity\"],\"articleSection\":[\"Enterprise Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/10\\\/java-modularity-approaches-modules.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/10\\\/java-modularity-approaches-modules.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/10\\\/java-modularity-approaches-modules.html\",\"name\":\"Java Modularity Approaches - Modules, modules, modules - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/10\\\/java-modularity-approaches-modules.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/10\\\/java-modularity-approaches-modules.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"datePublished\":\"2011-10-04T16:14:00+00:00\",\"dateModified\":\"2012-10-21T20:32:53+00:00\",\"description\":\"I think everybody will agree that writing modular applications and modularity in general is a good thing. But how does support for modularity look like,\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/10\\\/java-modularity-approaches-modules.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/10\\\/java-modularity-approaches-modules.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/10\\\/java-modularity-approaches-modules.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/enterprise-java-logo.jpg\",\"width\":150,\"height\":150,\"caption\":\"java-interview-questions-answers\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/10\\\/java-modularity-approaches-modules.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Enterprise Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\\\/enterprise-java\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Java Modularity Approaches &#8211; Modules, modules, modules\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/1974bff2e48a09ab944a3f9eada83438\",\"name\":\"Adam Warski\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c6fae14426526780cf8a2cb4c9d3e4941c61329d31a7ed9e451aa53b93407f0?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c6fae14426526780cf8a2cb4c9d3e4941c61329d31a7ed9e451aa53b93407f0?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c6fae14426526780cf8a2cb4c9d3e4941c61329d31a7ed9e451aa53b93407f0?s=96&d=mm&r=g\",\"caption\":\"Adam Warski\"},\"description\":\"Adam is one of the co-founders of SoftwareMill, a company specialising in delivering customised software solutions. He is also involved in open-source projects, as a founder, lead developer or contributor to: Hibernate Envers, a Hibernate core module, which provides entity versioning\\\/auditing capabilities; ElasticMQ, an SQS-compatible messaging server written in Scala; Veripacks, a tool to specify and verify inter-package dependencies, and others.\",\"sameAs\":[\"http:\\\/\\\/www.warski.org\\\/blog\",\"http:\\\/\\\/www.linkedin.com\\\/in\\\/adamwarski\",\"https:\\\/\\\/x.com\\\/http:\\\/\\\/twitter.com\\\/adamwarski\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/Adam-Warski\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Java Modularity Approaches - Modules, modules, modules - Java Code Geeks","description":"I think everybody will agree that writing modular applications and modularity in general is a good thing. But how does support for modularity look like,","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/2011\/10\/java-modularity-approaches-modules.html","og_locale":"en_US","og_type":"article","og_title":"Java Modularity Approaches - Modules, modules, modules - Java Code Geeks","og_description":"I think everybody will agree that writing modular applications and modularity in general is a good thing. But how does support for modularity look like,","og_url":"https:\/\/www.javacodegeeks.com\/2011\/10\/java-modularity-approaches-modules.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2011-10-04T16:14:00+00:00","article_modified_time":"2012-10-21T20:32:53+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","type":"image\/jpeg"}],"author":"Adam Warski","twitter_card":"summary_large_image","twitter_creator":"@http:\/\/twitter.com\/adamwarski","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Adam Warski","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2011\/10\/java-modularity-approaches-modules.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2011\/10\/java-modularity-approaches-modules.html"},"author":{"name":"Adam Warski","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/1974bff2e48a09ab944a3f9eada83438"},"headline":"Java Modularity Approaches &#8211; Modules, modules, modules","datePublished":"2011-10-04T16:14:00+00:00","dateModified":"2012-10-21T20:32:53+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2011\/10\/java-modularity-approaches-modules.html"},"wordCount":881,"commentCount":0,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2011\/10\/java-modularity-approaches-modules.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","keywords":["Modularity"],"articleSection":["Enterprise Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2011\/10\/java-modularity-approaches-modules.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2011\/10\/java-modularity-approaches-modules.html","url":"https:\/\/www.javacodegeeks.com\/2011\/10\/java-modularity-approaches-modules.html","name":"Java Modularity Approaches - Modules, modules, modules - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2011\/10\/java-modularity-approaches-modules.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2011\/10\/java-modularity-approaches-modules.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","datePublished":"2011-10-04T16:14:00+00:00","dateModified":"2012-10-21T20:32:53+00:00","description":"I think everybody will agree that writing modular applications and modularity in general is a good thing. But how does support for modularity look like,","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2011\/10\/java-modularity-approaches-modules.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2011\/10\/java-modularity-approaches-modules.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2011\/10\/java-modularity-approaches-modules.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/enterprise-java-logo.jpg","width":150,"height":150,"caption":"java-interview-questions-answers"},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2011\/10\/java-modularity-approaches-modules.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java","item":"https:\/\/www.javacodegeeks.com\/category\/java"},{"@type":"ListItem","position":3,"name":"Enterprise Java","item":"https:\/\/www.javacodegeeks.com\/category\/java\/enterprise-java"},{"@type":"ListItem","position":4,"name":"Java Modularity Approaches &#8211; Modules, modules, modules"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/1974bff2e48a09ab944a3f9eada83438","name":"Adam Warski","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/5c6fae14426526780cf8a2cb4c9d3e4941c61329d31a7ed9e451aa53b93407f0?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/5c6fae14426526780cf8a2cb4c9d3e4941c61329d31a7ed9e451aa53b93407f0?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5c6fae14426526780cf8a2cb4c9d3e4941c61329d31a7ed9e451aa53b93407f0?s=96&d=mm&r=g","caption":"Adam Warski"},"description":"Adam is one of the co-founders of SoftwareMill, a company specialising in delivering customised software solutions. He is also involved in open-source projects, as a founder, lead developer or contributor to: Hibernate Envers, a Hibernate core module, which provides entity versioning\/auditing capabilities; ElasticMQ, an SQS-compatible messaging server written in Scala; Veripacks, a tool to specify and verify inter-package dependencies, and others.","sameAs":["http:\/\/www.warski.org\/blog","http:\/\/www.linkedin.com\/in\/adamwarski","https:\/\/x.com\/http:\/\/twitter.com\/adamwarski"],"url":"https:\/\/www.javacodegeeks.com\/author\/Adam-Warski"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/650","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/89"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=650"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/650\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/112"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=650"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=650"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=650"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}