{"id":10487,"date":"2013-03-27T22:00:55","date_gmt":"2013-03-27T20:00:55","guid":{"rendered":"http:\/\/www.javacodegeeks.com\/?p=10487"},"modified":"2013-03-27T21:36:17","modified_gmt":"2013-03-27T19:36:17","slug":"how-to-replace-a-build-module-with-veripacks","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2013\/03\/how-to-replace-a-build-module-with-veripacks.html","title":{"rendered":"How to replace a build module with Veripacks"},"content":{"rendered":"<p>Compare the two trees below. In both cases the goal is to have an application with two independent modules (<code>frontend<\/code> and <code>reporting<\/code>), and one shared\/common module (<code>domain<\/code>). The code in <code>frontend<\/code> shouldn\u2019t be able to access code in <code>reporting<\/code>, and vice versa. Both modules can use the <code>domain<\/code> code. Ideally, we would like to check these access rules at build-time.<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2013\/03\/2013-03-20_1910.png\"><img decoding=\"async\" class=\"aligncenter\" alt=\"2013-03-20_1910\" src=\"http:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2013\/03\/2013-03-20_1910.png\" width=\"300\" height=\"297\" \/><\/a><\/p>\n<p>On the left, there\u2019s a traditional solution using Maven build modules. Each build module has a pretty elaborate <code>pom.xml<\/code>, e.g.:<\/p>\n<pre class=\" brush:xml\">&lt;?xml version='1.0' encoding='UTF-8'?&gt;\r\n&lt;project xmlns='http:\/\/maven.apache.org\/POM\/4.0.0'\r\n         xmlns:xsi='http:\/\/www.w3.org\/2001\/XMLSchema-instance'\r\n         xsi:schemaLocation='http:\/\/maven.apache.org\/POM\/4.0.0 http:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd'&gt;\r\n    &lt;parent&gt;\r\n        &lt;artifactId&gt;parent&lt;\/artifactId&gt;\r\n        &lt;groupId&gt;org.veripacks.battle&lt;\/groupId&gt;\r\n        &lt;version&gt;1.0.0-SNAPSHOT&lt;\/version&gt;\r\n    &lt;\/parent&gt;\r\n    &lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt;\r\n    &lt;name&gt;Veripacks vs Build Modules: Frontend&lt;\/name&gt;\r\n\r\n    &lt;artifactId&gt;frontend&lt;\/artifactId&gt;\r\n\r\n    &lt;dependencies&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.veripacks.battle&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;domain&lt;\/artifactId&gt;\r\n            &lt;version&gt;1.0.0-SNAPSHOT&lt;\/version&gt;\r\n        &lt;\/dependency&gt;\r\n    &lt;\/dependencies&gt;\r\n&lt;\/project&gt;<\/pre>\n<p>On the right, on the other hand, we have a much simpler structure with only one build module. Each application module now corresponds to one top-level project package (see also <a href=\"http:\/\/blog.schauderhaft.de\/2013\/01\/13\/the-importance-of-packages\/\">this blog<\/a> on package naming conventions).<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<p>Notice the <code>package-info.java<\/code> files. There, using <a href=\"http:\/\/veripacks.org\">Veripacks<\/a>, we can specify which packages are visible where. First of all, we specify that the code from top-level packages (<code>frontend<\/code>, <code>reporting<\/code> and <code>domain<\/code>) should be only accessible if explicitly imported, using <code>@RequiresImport<\/code>. Secondly, we specify that we want to access the <code>domain<\/code> package in <code>frontend<\/code> and <code>reporting<\/code> using <code>@Import<\/code>; e.g.:<\/p>\n<pre class=\" brush:java\">@RequiresImport\r\n@Import('org.veripacks.battle.domain')\r\npackage org.veripacks.battle.frontend;\r\n\r\nimport org.veripacks.Import;\r\nimport org.veripacks.RequiresImport;<\/pre>\n<p>Now, isn\u2019t the Veripacks approach simpler? There is still build-time checking, which is possible by running a simple test (see the README for details). Plus, you can also use other Veripacks features, like <code>@Export<\/code> annotations, which is a generalized version of package-private scope, taking into account package hierarchies. There are also other benefits, like trivial sharing of test code (which is kind of hard with Maven), or much easier refactoring (introducing a new application module is a matter of adding a top-level package).<\/p>\n<p>The immediate question that arises is \u2013 what about 3rd party libraries? Most probably, we\u2019d like frontend-specific libraries to be accessible only in the <code>frontend<\/code> module, and reporting-specific ones in the <code>reporting<\/code> module. Well, not supported yet, but good news \u2013 that will be the scope of the next Veripacks release. You can view the example projects <a href=\"https:\/\/github.com\/adamw\/veripacks-vs-buildmodules\">on GitHub<\/a>.<br \/>\n&nbsp;<\/p>\n<p><b><i>Reference: <\/i><\/b><a href=\"http:\/\/www.warski.org\/blog\/2013\/03\/how-to-replace-a-build-module-with-veripacks\/\">How to replace a build module with Veripacks<\/a> from our <a href=\"http:\/\/www.javacodegeeks.com\/p\/jcg.html\">JCG partner<\/a> Adam Warski at the <a href=\"http:\/\/www.warski.org\/blog\">Blog of Adam Warski<\/a> blog.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Compare the two trees below. In both cases the goal is to have an application with two independent modules (frontend and reporting), and one shared\/common module (domain). The code in frontend shouldn\u2019t be able to access code in reporting, and vice versa. Both modules can use the domain code. Ideally, we would like to check &hellip;<\/p>\n","protected":false},"author":89,"featured_media":73,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[68,751],"class_list":["post-10487","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-java","tag-apache-maven","tag-veripacks"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>How to replace a build module with Veripacks<\/title>\n<meta name=\"description\" content=\"Compare the two trees below. In both cases the goal is to have an application with two independent modules (frontend and reporting), and one shared\/common\" \/>\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\/2013\/03\/how-to-replace-a-build-module-with-veripacks.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to replace a build module with Veripacks\" \/>\n<meta property=\"og:description\" content=\"Compare the two trees below. In both cases the goal is to have an application with two independent modules (frontend and reporting), and one shared\/common\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2013\/03\/how-to-replace-a-build-module-with-veripacks.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=\"2013-03-27T20:00:55+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/apache-maven-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=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/03\\\/how-to-replace-a-build-module-with-veripacks.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/03\\\/how-to-replace-a-build-module-with-veripacks.html\"},\"author\":{\"name\":\"Adam Warski\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/1974bff2e48a09ab944a3f9eada83438\"},\"headline\":\"How to replace a build module with Veripacks\",\"datePublished\":\"2013-03-27T20:00:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/03\\\/how-to-replace-a-build-module-with-veripacks.html\"},\"wordCount\":338,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/03\\\/how-to-replace-a-build-module-with-veripacks.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/apache-maven-logo.jpg\",\"keywords\":[\"Apache Maven\",\"Veripacks\"],\"articleSection\":[\"Enterprise Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/03\\\/how-to-replace-a-build-module-with-veripacks.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/03\\\/how-to-replace-a-build-module-with-veripacks.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/03\\\/how-to-replace-a-build-module-with-veripacks.html\",\"name\":\"How to replace a build module with Veripacks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/03\\\/how-to-replace-a-build-module-with-veripacks.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/03\\\/how-to-replace-a-build-module-with-veripacks.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/apache-maven-logo.jpg\",\"datePublished\":\"2013-03-27T20:00:55+00:00\",\"description\":\"Compare the two trees below. In both cases the goal is to have an application with two independent modules (frontend and reporting), and one shared\\\/common\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/03\\\/how-to-replace-a-build-module-with-veripacks.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/03\\\/how-to-replace-a-build-module-with-veripacks.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/03\\\/how-to-replace-a-build-module-with-veripacks.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/apache-maven-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/apache-maven-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2013\\\/03\\\/how-to-replace-a-build-module-with-veripacks.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\":\"How to replace a build module with Veripacks\"}]},{\"@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":"How to replace a build module with Veripacks","description":"Compare the two trees below. In both cases the goal is to have an application with two independent modules (frontend and reporting), and one shared\/common","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\/2013\/03\/how-to-replace-a-build-module-with-veripacks.html","og_locale":"en_US","og_type":"article","og_title":"How to replace a build module with Veripacks","og_description":"Compare the two trees below. In both cases the goal is to have an application with two independent modules (frontend and reporting), and one shared\/common","og_url":"https:\/\/www.javacodegeeks.com\/2013\/03\/how-to-replace-a-build-module-with-veripacks.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2013-03-27T20:00:55+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/apache-maven-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":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2013\/03\/how-to-replace-a-build-module-with-veripacks.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2013\/03\/how-to-replace-a-build-module-with-veripacks.html"},"author":{"name":"Adam Warski","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/1974bff2e48a09ab944a3f9eada83438"},"headline":"How to replace a build module with Veripacks","datePublished":"2013-03-27T20:00:55+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2013\/03\/how-to-replace-a-build-module-with-veripacks.html"},"wordCount":338,"commentCount":0,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2013\/03\/how-to-replace-a-build-module-with-veripacks.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/apache-maven-logo.jpg","keywords":["Apache Maven","Veripacks"],"articleSection":["Enterprise Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2013\/03\/how-to-replace-a-build-module-with-veripacks.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2013\/03\/how-to-replace-a-build-module-with-veripacks.html","url":"https:\/\/www.javacodegeeks.com\/2013\/03\/how-to-replace-a-build-module-with-veripacks.html","name":"How to replace a build module with Veripacks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2013\/03\/how-to-replace-a-build-module-with-veripacks.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2013\/03\/how-to-replace-a-build-module-with-veripacks.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/apache-maven-logo.jpg","datePublished":"2013-03-27T20:00:55+00:00","description":"Compare the two trees below. In both cases the goal is to have an application with two independent modules (frontend and reporting), and one shared\/common","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2013\/03\/how-to-replace-a-build-module-with-veripacks.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2013\/03\/how-to-replace-a-build-module-with-veripacks.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2013\/03\/how-to-replace-a-build-module-with-veripacks.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/apache-maven-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/apache-maven-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2013\/03\/how-to-replace-a-build-module-with-veripacks.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":"How to replace a build module with Veripacks"}]},{"@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\/10487","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=10487"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/10487\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/73"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=10487"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=10487"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=10487"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}