{"id":1157,"date":"2017-12-20T07:32:35","date_gmt":"2017-12-20T07:32:35","guid":{"rendered":"https:\/\/www.javaadvent.com\/?p=1157"},"modified":"2019-11-27T09:47:37","modified_gmt":"2019-11-27T09:47:37","slug":"automatic-module-name-calling-java-library-maintainers","status":"publish","type":"post","link":"https:\/\/www.javaadvent.com\/2017\/12\/automatic-module-name-calling-java-library-maintainers.html","title":{"rendered":"Automatic-Module-Name: Calling all Java Library Maintainers"},"content":{"rendered":"<header><em>With the Java 9 release, developers can use the new module system to create modular applications. However, in order to modularize applications, libraries should be usable as modules as well.<\/em><\/header>\n<section>Creating modular applications using the Java module system is an enticing prospect. Modules have module descriptors in the form of\u00a0<code>module-info.java<\/code>, declaring which packages are exported and what dependencies it has on other modules. This means we finally have explicit dependencies between modules at the language level, and can strongly encapsulate code within these modules. The book\u00a0<a href=\"https:\/\/javamodularity.com\/\">Java 9 Modularity<\/a>\u00a0(O&#8217;Reilly) written by Paul Bakker and me explains these mechanisms and their benefits in detail.That, however, is not what this post is about. Today, we&#8217;ll talk about what needs to be done to move the Java library ecosystem toward modules. In the ideal world where all libraries have module descriptors, all is well. That&#8217;s not yet where we are in the Java community.<\/p>\n<h3>What You Need To Do Now<\/h3>\n<p>We need Java library maintainers to step up! Ultimately, it would be best for your library to have a module descriptor so that modular applications can depend on it. Getting there isn&#8217;t trivial in all cases. Fortunately, support for the Java module system can be incrementally added to libraries. This post explains the first step you can take as library maintainer on your way to becoming a Java module. This first step boils down to picking a module name, and adding it as\u00a0<code>Automatic-Module-Name: &lt;module name&gt;<\/code>\u00a0entry to the library&#8217;s MANIFEST.MF. That&#8217;s it.<\/p>\n<p>With this first step you make your library usable as Java module without moving the library itself to Java 9 or creating a module descriptor for the library, yet. It doesn&#8217;t even require re-compilation. So, do yourself a favor and do it now. If you&#8217;re not a library maintainer, encourage libraries you use by opening an issue and pointing to this post. Then, if you&#8217;d like to know why this is a good idea and how it actually works, keep reading.<\/p>\n<h3>Automatic Modules<\/h3>\n<p>Traditional applications are packaged into JARs and run from the classpath. Java 9 still supports this, but also opens the door to more reliable and efficient deployment. Modular applications on Java 9 and later are packaged into JARs which contain module descriptors (<em>modular JARs<\/em>) and run from the module path. Code in modular JARs on the module path can&#8217;t access code in traditional JARs on the classpath. So what happens when a modular application wants to use a library living on the classpath, which doesn&#8217;t have a module descriptor yet? The modular application can&#8217;t express such a dependency in its module descriptor.<\/p>\n<p>It would be unworkable if the only resort for application developers were to wait for the library maintainer to write a module descriptor, or worse, attempt to patch the JAR themselves with a module descriptor. To prevent this possibly indefinite waiting game, a feature called\u00a0<em>automatic modules<\/em>\u00a0was introduced. Moving a traditional JAR (without module descriptor) from the classpath to the module path turns it into an automatic module. Such an automatic module exports all of its packages and depends on all other resolved modules. Additionally, automatic modules themselves\u00a0<em>can<\/em>\u00a0still access code on the classpath.<\/p>\n<p>So, instead of waiting for libraries to be modularized, application developers can take matters into their own hands. Traditional JARs can be used as if they were modules. For an example of automatic modules in action, look at\u00a0<a href=\"http:\/\/paulbakker.io\/java\/java9-vertx\/\">Paul&#8217;s post<\/a>\u00a0where he uses Vert.x JARs as automatic modules in an application.<\/p>\n<h3>Automatic Module Name Derivation<\/h3>\n<p>Still, the question remains how you can express a dependency on an automatic module from application modules. Where does its name come from?<\/p>\n<p>There are two possible ways for an automatic module to get its name:<\/p>\n<ul>\n<li>When an\u00a0<code>Automatic-Module-Name<\/code>\u00a0entry is available in the manifest, its value is the name of the automatic module<\/li>\n<li>Otherwise, a name is derived from the JAR filename (see the\u00a0<a href=\"https:\/\/docs.oracle.com\/javase\/9\/docs\/api\/java\/lang\/module\/ModuleFinder.html#of-java.nio.file.Path...-\">ModuleFinder JavaDoc<\/a>\u00a0for the derivation algorithm)<\/li>\n<\/ul>\n<p>That second option probably had you shaking your head. Filenames are not exactly the hallmark of stability, and your library may be distributed in many ways that could lead to different filenames on the user&#8217;s end. (Maven&#8217;s standardized approach to artifact naming alleviates this a bit, but is still far from ideal.) Moreover, the module name derived from a filename might not be your ideal pick as module name. That&#8217;s exactly why you&#8217;re reading this call to action for adding\u00a0<code>Automatic-Module-Name<\/code>\u00a0to libraries. Pick an explicit module name, put it in the\u00a0<code>MANIFEST.MF<\/code>\u00a0and ensure a smooth ride into the modular age for users of your library. This way, you&#8217;re not forcing users of your library to depend on an &#8216;accidental&#8217; module name.<\/p>\n<h3>Naming Library Modules<\/h3>\n<p>Naming is hard. Picking the right module name for your library is important; module descriptors will refer to your library module by this name. It&#8217;s effectively part of your API\u2014once you pick a name, changing it constitutes a breaking change.<\/p>\n<p>For libraries it&#8217;s essential to pick a globally unique module name. A long-standing practice in Java is to use reverse DNS notation for packages (e.g.\u00a0<code>com.acme.mylibrary.core<\/code>). We can apply the same to module names. Name your module after the\u00a0<em>root package<\/em>\u00a0of your module. This is the longest shared prefix of all packages in the module (for the previous example it might be\u00a0<code>com.acme.mylibrary<\/code>). Read Stephen Colebourne&#8217;s\u00a0<a href=\"http:\/\/blog.joda.org\/2017\/04\/java-se-9-jpms-module-naming.html\">excellent advice<\/a>\u00a0on why this is a good idea. Ensure your module name is valid, meaning it consists of one or more\u00a0<a href=\"https:\/\/docs.oracle.com\/javase\/specs\/jls\/se7\/html\/jls-3.html#jls-3.8\">java identifiers<\/a>\u00a0separated by a dot.<\/p>\n<p>If you want to see examples of libraries who&#8217;ve already gone through this process, look at the module name discussion for\u00a0<a href=\"https:\/\/github.com\/google\/guava\/pull\/2846\">Google Guava<\/a>\u00a0and the\u00a0<a href=\"https:\/\/spring.io\/blog\/2017\/05\/08\/spring-framework-5-0-goes-rc1\">Spring Framework<\/a>.<\/p>\n<h3>Practical Tips<\/h3>\n<p>Most likely your library is built using Maven or Gradle. Adding a manifest entry to the resulting JAR is a breeze in both build tools. For Maven, make sure the jar plugin has the following configuration:<\/p>\n<pre><code>&lt;plugin&gt;\n  &lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\n  &lt;artifactId&gt;maven-jar-plugin&lt;\/artifactId&gt;\n  &lt;configuration&gt;\n    &lt;archive&gt;\n      &lt;manifestEntries&gt;\n        &lt;Automatic-Module-Name&gt;com.acme.mylibrary&lt;\/Automatic-Module-Name&gt;\n      &lt;\/manifestEntries&gt;\n    &lt;\/archive&gt;\n  &lt;\/configuration&gt;\n&lt;\/plugin&gt;\n<\/code><\/pre>\n<p>With Gradle, you can configure the jar plugin as follows:<\/p>\n<pre><code>jar {\n    manifest {\n        name = \"mylibrary\"\n        instruction \"Automatic-Module-Name\", \"com.acme.mylibrary\"\n    }\n}\n<\/code><\/pre>\n<h3>Sanity-Check Your Library<\/h3>\n<p>Is this really all there is to do as a first step toward modularization? Ideally, yes. But if you want your library to be used as automatic module on Java 9 and later, there&#8217;s a few other potential issues you need to verify:<\/p>\n<ul>\n<li>Make sure your library doesn&#8217;t use internal types from the JDK (run\u00a0<code>jdeps --jdk-internals mylibrary.jar<\/code>\u00a0to find offending code). JDeps (as bundled with Java 9 and later) will offer publicly supported alternatives for any use of encapsulated JDK APIs. When your library runs from the classpath on Java 9 and later, you can still\u00a0<a href=\"http:\/\/openjdk.java.net\/jeps\/261#Relaxed-strong-encapsulation\">get away<\/a>\u00a0with this. Not so if your library lives on the module path as automatic module.<\/li>\n<li>Your library can&#8217;t have classes in the default (unnamed) package. This is a bad idea regardless, but when your library is used as automatic module, this rule is enforced by the module system.<\/li>\n<li>Your library can&#8217;t split packages (two or more JARs defining the types in the same package), nor can it redefine JDK packages (<code>javax.annotation<\/code>\u00a0is a notorious example, being defined in the JDK&#8217;s\u00a0<code>java.xml.ws.annotation<\/code>\u00a0module but also in external libraries).<\/li>\n<li>When your library&#8217;s JAR has a META-INF\/services directory to specify service providers, then the specified providers must exist in this JAR (as described in the\u00a0<a href=\"https:\/\/docs.oracle.com\/javase\/9\/docs\/api\/java\/lang\/module\/ModuleFinder.html#of-java.nio.file.Path...-\">ModuleFinder JavaDoc<\/a>)<\/li>\n<\/ul>\n<p>Addressing these concerns is a matter of good hygiene. If you encounter one of these issues and you can&#8217;t address those, don&#8217;t add the\u00a0<code>Automatic-Module-Name<\/code>\u00a0entry yet. For now, your library is better off on the classpath. It will only raise false expectations if you do add the entry.<\/p>\n<h3>What You Need To Do Next<\/h3>\n<p>While your library can now be used as automatic module, it isn&#8217;t really a great module. Every package is exported and it doesn&#8217;t express its dependencies yet. That&#8217;s why your next step is to add a\u00a0<code>module-info.java<\/code>\u00a0file describing which packages must be exported and which dependencies on other modules the library has. This might even entail some refactoring, by dividing up your code into API (exported) packages and internal packages.<\/p>\n<p>If your library has no external dependencies, creating and compiling this module descriptor is relatively straightforward (see\u00a0<a href=\"http:\/\/blog.headius.com\/2017\/10\/migrating-to-java-9-modules-maven-osgi.html\">this real-world example<\/a>). However, if you have external dependencies, you&#8217;ll have to wait until those libraries have added module descriptors (or at least have an\u00a0<code>Automatic-Module-Name<\/code>\u00a0themselves). Writing your module descriptor to depend on filename-derived automatic module names is a sure way to break things for your users. When these transitive dependencies do start modularizing with a different module name, users of your library will experience breakage.<\/p>\n<p>In\u00a0<a href=\"https:\/\/javamodularity.com\/#features\">Chapter 10<\/a>\u00a0of our book, we give in-depth advice on how to migrate a library to a proper module step-by-step. For example, we explain how you add a module descriptor to your library without having to target Java 9+ when compiling your code. Features like the new\u00a0<code>--release<\/code>\u00a0flag and\u00a0<a href=\"http:\/\/openjdk.java.net\/jeps\/238\">Multi-Release JARs<\/a>\u00a0are very helpful. That all goes far beyond the scope of this post. So, please be a good citizen of the Java community. Decide upon a module name and add it to your library&#8217;s manifest. Then, keep the ball rolling by reading up on the module system and adding a real module descriptor.<\/p>\n<\/section>\n","protected":false},"excerpt":{"rendered":"<p>With the Java 9 release, developers can use the new module system to create modular applications. However, in order to modularize applications, libraries should be usable as modules as well. Creating modular applications using the Java module system is an enticing prospect. Modules have module descriptors in the form of\u00a0module-info.java, declaring which packages are exported [&hellip;]<\/p>\n","protected":false},"author":48,"featured_media":1100,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[276],"tags":[],"coauthors":[],"class_list":["post-1157","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-276"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Automatic-Module-Name: Calling all Java Library Maintainers - JVM Advent<\/title>\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.javaadvent.com\/2017\/12\/automatic-module-name-calling-java-library-maintainers.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Automatic-Module-Name: Calling all Java Library Maintainers - JVM Advent\" \/>\n<meta property=\"og:description\" content=\"With the Java 9 release, developers can use the new module system to create modular applications. However, in order to modularize applications, libraries should be usable as modules as well. Creating modular applications using the Java module system is an enticing prospect. Modules have module descriptors in the form of\u00a0module-info.java, declaring which packages are exported [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javaadvent.com\/2017\/12\/automatic-module-name-calling-java-library-maintainers.html\" \/>\n<meta property=\"og:site_name\" content=\"JVM Advent\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Java-Advent-Calendar-229536173843473\/\" \/>\n<meta property=\"article:published_time\" content=\"2017-12-20T07:32:35+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-11-27T09:47:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javaadvent.com\/content\/uploads\/2017\/12\/duke20.png\" \/>\n\t<meta property=\"og:image:width\" content=\"280\" \/>\n\t<meta property=\"og:image:height\" content=\"280\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Sander Mak\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@http:\/\/www.twitter.com\/Sander_Mak\" \/>\n<meta name=\"twitter:site\" content=\"@javaadvent\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Sander Mak\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/2017\\\/12\\\/automatic-module-name-calling-java-library-maintainers.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/2017\\\/12\\\/automatic-module-name-calling-java-library-maintainers.html\"},\"author\":{\"name\":\"Sander Mak\",\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/#\\\/schema\\\/person\\\/2a2348705f42c524b28687b4aa4a524a\"},\"headline\":\"Automatic-Module-Name: Calling all Java Library Maintainers\",\"datePublished\":\"2017-12-20T07:32:35+00:00\",\"dateModified\":\"2019-11-27T09:47:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/2017\\\/12\\\/automatic-module-name-calling-java-library-maintainers.html\"},\"wordCount\":1511,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/2017\\\/12\\\/automatic-module-name-calling-java-library-maintainers.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/www.javaadvent.com\\\/content\\\/uploads\\\/2017\\\/12\\\/duke20.png?fit=280%2C280&ssl=1\",\"articleSection\":[\"2017\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javaadvent.com\\\/2017\\\/12\\\/automatic-module-name-calling-java-library-maintainers.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/2017\\\/12\\\/automatic-module-name-calling-java-library-maintainers.html\",\"url\":\"https:\\\/\\\/www.javaadvent.com\\\/2017\\\/12\\\/automatic-module-name-calling-java-library-maintainers.html\",\"name\":\"Automatic-Module-Name: Calling all Java Library Maintainers - JVM Advent\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/2017\\\/12\\\/automatic-module-name-calling-java-library-maintainers.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/2017\\\/12\\\/automatic-module-name-calling-java-library-maintainers.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/www.javaadvent.com\\\/content\\\/uploads\\\/2017\\\/12\\\/duke20.png?fit=280%2C280&ssl=1\",\"datePublished\":\"2017-12-20T07:32:35+00:00\",\"dateModified\":\"2019-11-27T09:47:37+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/#\\\/schema\\\/person\\\/2a2348705f42c524b28687b4aa4a524a\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/2017\\\/12\\\/automatic-module-name-calling-java-library-maintainers.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javaadvent.com\\\/2017\\\/12\\\/automatic-module-name-calling-java-library-maintainers.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/2017\\\/12\\\/automatic-module-name-calling-java-library-maintainers.html#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/www.javaadvent.com\\\/content\\\/uploads\\\/2017\\\/12\\\/duke20.png?fit=280%2C280&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/www.javaadvent.com\\\/content\\\/uploads\\\/2017\\\/12\\\/duke20.png?fit=280%2C280&ssl=1\",\"width\":280,\"height\":280},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/2017\\\/12\\\/automatic-module-name-calling-java-library-maintainers.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javaadvent.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Automatic-Module-Name: Calling all Java Library Maintainers\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javaadvent.com\\\/\",\"name\":\"JVM Advent\",\"description\":\"The JVM Programming Advent Calendar\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javaadvent.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javaadvent.com\\\/#\\\/schema\\\/person\\\/2a2348705f42c524b28687b4aa4a524a\",\"name\":\"Sander Mak\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/6ba5e1d328568e5bb767a07051be9869ff1e5432158eac1d06374b8e74694421?s=96&d=retro&r=g32c65254fba939a34b1891ad2c9c8417\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/6ba5e1d328568e5bb767a07051be9869ff1e5432158eac1d06374b8e74694421?s=96&d=retro&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/6ba5e1d328568e5bb767a07051be9869ff1e5432158eac1d06374b8e74694421?s=96&d=retro&r=g\",\"caption\":\"Sander Mak\"},\"sameAs\":[\"http:\\\/\\\/branchandbound.net\",\"https:\\\/\\\/x.com\\\/http:\\\/\\\/www.twitter.com\\\/Sander_Mak\"],\"url\":\"https:\\\/\\\/www.javaadvent.com\\\/author\\\/sandermak\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Automatic-Module-Name: Calling all Java Library Maintainers - JVM Advent","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.javaadvent.com\/2017\/12\/automatic-module-name-calling-java-library-maintainers.html","og_locale":"en_US","og_type":"article","og_title":"Automatic-Module-Name: Calling all Java Library Maintainers - JVM Advent","og_description":"With the Java 9 release, developers can use the new module system to create modular applications. However, in order to modularize applications, libraries should be usable as modules as well. Creating modular applications using the Java module system is an enticing prospect. Modules have module descriptors in the form of\u00a0module-info.java, declaring which packages are exported [&hellip;]","og_url":"https:\/\/www.javaadvent.com\/2017\/12\/automatic-module-name-calling-java-library-maintainers.html","og_site_name":"JVM Advent","article_publisher":"https:\/\/www.facebook.com\/Java-Advent-Calendar-229536173843473\/","article_published_time":"2017-12-20T07:32:35+00:00","article_modified_time":"2019-11-27T09:47:37+00:00","og_image":[{"width":280,"height":280,"url":"https:\/\/www.javaadvent.com\/content\/uploads\/2017\/12\/duke20.png","type":"image\/png"}],"author":"Sander Mak","twitter_card":"summary_large_image","twitter_creator":"@http:\/\/www.twitter.com\/Sander_Mak","twitter_site":"@javaadvent","twitter_misc":{"Written by":"Sander Mak","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javaadvent.com\/2017\/12\/automatic-module-name-calling-java-library-maintainers.html#article","isPartOf":{"@id":"https:\/\/www.javaadvent.com\/2017\/12\/automatic-module-name-calling-java-library-maintainers.html"},"author":{"name":"Sander Mak","@id":"https:\/\/www.javaadvent.com\/#\/schema\/person\/2a2348705f42c524b28687b4aa4a524a"},"headline":"Automatic-Module-Name: Calling all Java Library Maintainers","datePublished":"2017-12-20T07:32:35+00:00","dateModified":"2019-11-27T09:47:37+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javaadvent.com\/2017\/12\/automatic-module-name-calling-java-library-maintainers.html"},"wordCount":1511,"commentCount":0,"image":{"@id":"https:\/\/www.javaadvent.com\/2017\/12\/automatic-module-name-calling-java-library-maintainers.html#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2017\/12\/duke20.png?fit=280%2C280&ssl=1","articleSection":["2017"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javaadvent.com\/2017\/12\/automatic-module-name-calling-java-library-maintainers.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javaadvent.com\/2017\/12\/automatic-module-name-calling-java-library-maintainers.html","url":"https:\/\/www.javaadvent.com\/2017\/12\/automatic-module-name-calling-java-library-maintainers.html","name":"Automatic-Module-Name: Calling all Java Library Maintainers - JVM Advent","isPartOf":{"@id":"https:\/\/www.javaadvent.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javaadvent.com\/2017\/12\/automatic-module-name-calling-java-library-maintainers.html#primaryimage"},"image":{"@id":"https:\/\/www.javaadvent.com\/2017\/12\/automatic-module-name-calling-java-library-maintainers.html#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2017\/12\/duke20.png?fit=280%2C280&ssl=1","datePublished":"2017-12-20T07:32:35+00:00","dateModified":"2019-11-27T09:47:37+00:00","author":{"@id":"https:\/\/www.javaadvent.com\/#\/schema\/person\/2a2348705f42c524b28687b4aa4a524a"},"breadcrumb":{"@id":"https:\/\/www.javaadvent.com\/2017\/12\/automatic-module-name-calling-java-library-maintainers.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javaadvent.com\/2017\/12\/automatic-module-name-calling-java-library-maintainers.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javaadvent.com\/2017\/12\/automatic-module-name-calling-java-library-maintainers.html#primaryimage","url":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2017\/12\/duke20.png?fit=280%2C280&ssl=1","contentUrl":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2017\/12\/duke20.png?fit=280%2C280&ssl=1","width":280,"height":280},{"@type":"BreadcrumbList","@id":"https:\/\/www.javaadvent.com\/2017\/12\/automatic-module-name-calling-java-library-maintainers.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javaadvent.com\/"},{"@type":"ListItem","position":2,"name":"Automatic-Module-Name: Calling all Java Library Maintainers"}]},{"@type":"WebSite","@id":"https:\/\/www.javaadvent.com\/#website","url":"https:\/\/www.javaadvent.com\/","name":"JVM Advent","description":"The JVM Programming Advent Calendar","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javaadvent.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.javaadvent.com\/#\/schema\/person\/2a2348705f42c524b28687b4aa4a524a","name":"Sander Mak","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/6ba5e1d328568e5bb767a07051be9869ff1e5432158eac1d06374b8e74694421?s=96&d=retro&r=g32c65254fba939a34b1891ad2c9c8417","url":"https:\/\/secure.gravatar.com\/avatar\/6ba5e1d328568e5bb767a07051be9869ff1e5432158eac1d06374b8e74694421?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/6ba5e1d328568e5bb767a07051be9869ff1e5432158eac1d06374b8e74694421?s=96&d=retro&r=g","caption":"Sander Mak"},"sameAs":["http:\/\/branchandbound.net","https:\/\/x.com\/http:\/\/www.twitter.com\/Sander_Mak"],"url":"https:\/\/www.javaadvent.com\/author\/sandermak"}]}},"jetpack_featured_media_url":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2017\/12\/duke20.png?fit=280%2C280&ssl=1","jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":1223,"url":"https:\/\/www.javaadvent.com\/2017\/12\/java-9-glance.html","url_meta":{"origin":1157,"position":0},"title":"Java 9 at a glance","author":"Martin Toshev","date":"December 25, 2017","format":false,"excerpt":"To many Java 9 may seem to be a maintenance release that pushes forward project Jigsaw that couldn't make it in Java 8. But along with the new module system in the JDK and a number of internal changes associated with it Java 9 brings also a number of cool\u2026","rel":"","context":"In &quot;2017&quot;","block_context":{"text":"2017","link":"https:\/\/www.javaadvent.com\/category\/2017"},"img":{"alt_text":"exporter","src":"https:\/\/i0.wp.com\/martin-toshev.com\/images\/articles\/tools\/java_9_at_a_glance\/exporter.gif?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":6289,"url":"https:\/\/www.javaadvent.com\/2025\/12\/chicory-webassembly-on-the-jvm.html","url_meta":{"origin":1157,"position":1},"title":"Bring WebAssembly to the JVM. How Chicory Is Powering a New Generation of Java Libraries","author":"Andrea Peruffo","date":"December 23, 2025","format":false,"excerpt":"Introduction: the promise of \u201cembed once, run anywhere\u201d reimagined \u00a0 What if you could embed native\u2011level capabilities into your Java applications, think of database engines, scripting runtimes, policy interpreters, even compilers and still remain pure Java, with no JNI, no native binaries, no concerns about OS or architecture compatibility? That\u2026","rel":"","context":"In &quot;2017&quot;","block_context":{"text":"2017","link":"https:\/\/www.javaadvent.com\/category\/2017"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2021\/12\/Feature-Image-Day-23.png?fit=800%2C800&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2021\/12\/Feature-Image-Day-23.png?fit=800%2C800&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2021\/12\/Feature-Image-Day-23.png?fit=800%2C800&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2021\/12\/Feature-Image-Day-23.png?fit=800%2C800&ssl=1&resize=700%2C400 2x"},"classes":[]},{"id":480,"url":"https:\/\/www.javaadvent.com\/2015\/12\/project-jigsaw-hands-on-guide.html","url_meta":{"origin":1157,"position":2},"title":"Project Jigsaw Hands-On Guide","author":"Nicolai Parlog","date":"December 10, 2015","format":false,"excerpt":"Project Jigsaw will bring modularization to the Java platform and according to the original plan it was going to be feature complete on the 10th of December. So here we are but where is Jigsaw? Surely a lot happened in the last six months: The prototype came out, the looming\u2026","rel":"","context":"In &quot;JDK 9&quot;","block_context":{"text":"JDK 9","link":"https:\/\/www.javaadvent.com\/category\/jdk-9"},"img":{"alt_text":"jigsaw-hands-on-splitting-into-modules","src":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2015\/12\/jigsaw-hands-on-splitting-into-modules.png?resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2015\/12\/jigsaw-hands-on-splitting-into-modules.png?resize=350%2C200 1x, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2015\/12\/jigsaw-hands-on-splitting-into-modules.png?resize=525%2C300 1.5x"},"classes":[]},{"id":1362,"url":"https:\/\/www.javaadvent.com\/2018\/12\/docker-and-the-jvm.html","url_meta":{"origin":1157,"position":3},"title":"Docker and the JVM","author":"Cesar Tron-Lozai","date":"December 7, 2018","format":false,"excerpt":"Even though Docker was a 2016 thing, it is still relevant today. It is the foundation of Kubernetes, the most popular Orchestration platform, that has become the go-to solution for cloud deployment. Docker is the defacto standard solution to containerise applications\/(micro)services. If you run Java application you need to beaware\u2026","rel":"","context":"In &quot;2018&quot;","block_context":{"text":"2018","link":"https:\/\/www.javaadvent.com\/category\/2018"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2018\/12\/image-300x161.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":5722,"url":"https:\/\/www.javaadvent.com\/2024\/12\/wasm-chicory-1.html","url_meta":{"origin":1157,"position":4},"title":"The Chicory Photo Album: Celebrating 1.0.0 and a Year of Wasm","author":"Andrea Peruffo","date":"December 25, 2024","format":false,"excerpt":"Intro Christmas is a time of tradition, and I\u2019m delighted to continue the one we started last year. On this very same date and blog, we unveiled the development of Chicory: Chicory: WebAssembly on the JVM. WebAssembly continues to grow steadily and strongly, much like we\u2019ve come to expect from\u2026","rel":"","context":"In &quot;2024&quot;","block_context":{"text":"2024","link":"https:\/\/www.javaadvent.com\/category\/2024"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/12\/Feature-Image-Day-25.webp?fit=800%2C800&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/12\/Feature-Image-Day-25.webp?fit=800%2C800&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/12\/Feature-Image-Day-25.webp?fit=800%2C800&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/12\/Feature-Image-Day-25.webp?fit=800%2C800&ssl=1&resize=700%2C400 2x"},"classes":[]},{"id":5014,"url":"https:\/\/www.javaadvent.com\/2023\/12\/chicory-wasm-jvm.html","url_meta":{"origin":1157,"position":5},"title":"A zero dependency Wasm runtime for the JVM","author":"Andrea Peruffo","date":"December 25, 2023","format":false,"excerpt":"All I want for Xmas is Chicory INTRO In a lot of cultures, during Christmas time, Santa would distribute toys and presents to the good kids around. If you are reading Java Advent Of Code, that means that you care about Java and I\u2019m sure you are a good one\u2026","rel":"","context":"In &quot;@Primary&quot;","block_context":{"text":"@Primary","link":"https:\/\/www.javaadvent.com\/category\/primary"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/12\/Feature-Image-Day-25.webp?fit=800%2C800&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/12\/Feature-Image-Day-25.webp?fit=800%2C800&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/12\/Feature-Image-Day-25.webp?fit=800%2C800&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.javaadvent.com\/content\/uploads\/2022\/12\/Feature-Image-Day-25.webp?fit=800%2C800&ssl=1&resize=700%2C400 2x"},"classes":[]}],"jetpack_likes_enabled":true,"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/posts\/1157","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/users\/48"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/comments?post=1157"}],"version-history":[{"count":2,"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/posts\/1157\/revisions"}],"predecessor-version":[{"id":1159,"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/posts\/1157\/revisions\/1159"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/media\/1100"}],"wp:attachment":[{"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/media?parent=1157"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/categories?post=1157"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/tags?post=1157"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.javaadvent.com\/wp-json\/wp\/v2\/coauthors?post=1157"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}