I just read it all .. sigh. Looks like our concerns got ignored to me
Manfred
Robert Scholte wrote on 2017-02-16 09:23:
> FYI,
>
> Robert
>
> ------- Forwarded message -------
> From: mark.reinh...@oracle.com
> To: jpms-spec-expe...@openjdk.java.net
> Cc:
> Subject: How to name modules, automatic and otherwise
> Date: Thu, 16 Feb 2017 17:48:27 +0100
>
> This note is in reply to the concerns about automatic modules raised
by
> Robert Scholte and Brian Fox [1], and by Stephen Colebourne and
others
> [2]. I've collected my conclusions here rather than in separate
messages
> because there are several distinct yet intertwined issues.
>
> Summary:
>
> - Module names should not include Maven group identifiers, because
> modules are more abstract than the artifacts that define them.
>
> - Module names should use the reverse-domain-name-prefix
convention
> or, preferably, the project-name-prefix convention.
>
> - We should not abandon automatic modules, since they are a key
tool
> for migration and adoption.
>
> - We can address the problems of automatic modules with two fairly
> minor technical enhancements.
>
> If any of these points strikes you as controversial, please read on!
>
> * * *
>
> Module names should not include Maven group identifiers, as Robert
> Scholte and Brian Fox suggest [1], even for modules declared
explicitly
> in `module-info.java` files. Modules in JPMS are a construct of the
Java
> programming language, implemented in both the compiler and the
virtual
> machine. As such, they are more abstract entities than the artifacts
> that define them. This distinction is useful, both conceptually and
> practically, hence module names should remain more abstract.
>
> This distinction is useful conceptually because it makes it easier,
as
> we read source code, to think clearly about the nature of a module.
We
> can reason about a module's dependences, exports, services, and so
forth
> without cluttering our minds with the details of group identifiers
and
> version constraints. Today, e.g., we can write, and read:
>
> module foo.data {
> exports com.bar.foo.data;
> requires hibernate.core;
> requires hibernate.jcache;
> requires hibernate.validator;
> }
>
> If we were to extend the syntax of module names to include group
> identifiers, and encourage people to use them, then we'd be faced
with
> something much more verbose:
>
> module com.bar:foo.data {
> exports com.bar.foo.data;
> requires org.hibernate:hibernate.core;
> requires org.hibernate:hibernate.jcache;
> requires org.hibernate:hibernate.validator;
> }
>
> Group identifiers make perfect sense in the context of a build system
> such as Maven, where they bring necessary structure to the names of
the
> millions of artifacts available across different repositories. Such
> structure is superfluous and distracting in the context of a module
> system, where the number of relevant modules in any particular
situation
> is more likely to be in the tens, or hundreds, or (rarely) thousands.
> All else being equal, simpler names are better.
>
> At a practical level, the distinction between modules and artifacts
is
> useful because it leaves the entire problem of artifact selection to
the
> build system. This allows us to switch from one artifact to another
> simply by editing a `pom.xml` file to adjust a version constraint or
a
> group identifier; if module names included group identifiers then
we'd
> also have to edit the `module-info.java` file. This flexibility can
be
> helpful if, e.g., a project is forked and a new module with the same
name
> and artifact identifier is published under a different group
identifier.
> We long ago decided not to do version selection in the module system,
> which surprised some people but has worked out fairly well. We
should
> treat group selection in the same manner.
>
> Another practical benefit of the module/artifact distinction is that
it
> keeps the module system independent of any particular build system,
so
> that build systems can continue to improve and evolve independently
over
> time. Maven-style coordinates are the most popular way to name
artifacts
> in repositories today, but that might not be true ten years from
now. It
> would be unwise to adopt Maven's naming convention for module names
just
> because it's popular now, and doubly so to bake Maven's
group-identifier
> concept into the Java programming language.
>
> * * *
>
> If module names don't include group identifiers, then how should
modules
> be named? What advice should we give to someone who's creating a new
> module from scratch, or modularizing an existing component by
writing a
> `module-info.java` file for it? (Continue to set aside, for the
moment,
> the problems of automatic modules.)
>
> In structuring any particular space of names we must balance (at
least)
> three fundamental tensions: We want names that are long enough to be
> descriptive, short enough to be memorable, and unique enough to avoid
> needless conflicts.
>
> If you control all of the modules upon which your module depends, and
> all of the modules that depend upon it, then you can of course name
your
> module whatever you want, and change its name at any time. If,
however,
> you're going to publish your module for use by others -- whether just
> within your own organization or to a global repository such as Maven
> Central -- then you should take more care. There are two well-known
> ways to go about this.
>
> - Choose module names that start with the reversed form of an
Internet
> domain name that you control, or are at least associated with.
The
> Java Language Specification has long suggested this convention
as a
> way to minimize conflicts amongst package names, and it has been
> widely though not universally adopted for that purpose.
>
> - Choose module names that start with the name of your project or
> product. Module (and package) names that start with reversed
domain
> names are less likely to conflict but they're unnecessarily
verbose,
> they start with the least-important information (e.g., `com`,
`org`,
> or `net`), and they don't read well after exogenous changes
such as
> open-source donations or corporate acquisitions (e.g.,
`com.sun.*`).
>
> The reversed domain-name approach was sensible in the early days of
Java,
> before we had development tools sophisticated enough to help us deal
with
> the occasional conflict. We have such tools now, so going forward
the
> superior readability of short module and package names that start
with
> project or product names is preferable to the onerous verbosity of
those
> that start with reversed domain names.
>
> This advice will strike some readers as controversial. I respect
those
> who will choose, for the sake of tradition or an abundance of
caution, to
> use the reversed domain-name convention for module names and
continue to
> use that convention for package names. I do know, however, of at
least
> one major, well-known project whose developers intend to adopt the
> project-name-prefix convention for their module names.
>
> * * *
>
> If module names don't include group identifiers, then how should
automatic
> modules be named? Or are automatic modules so troublesome that we
should
> remove them from the design?
>
> To answer the second question first: It would be a tragic shame to
drop
> automatic modules, since otherwise top-down migration is impossible
if
> you're not willing to modify artifacts that you don't maintain, which
> most people (quite sensibly) aren't. Even if you limit your use of
> automatic modules to closed systems, as Stephen Colebourne suggests
[2],
> they're still of significant value. Let's see if we can rescue them.
>
> The present algorithm for naming automatic modules has two problems:
>
> (A) Conflicts are possible across large artifact repositories,
since
> the name of an automatic module is computed from the name of
the
> artifact that defines it. [1]
>
> (B) It's risky to publish a module that `requires` some other
module
> that has not yet been modularized, and hence must be used as
an
> automatic module. If the maintainer of that module later
chooses
> an explicit name different from the automatic name then you
must
> publish a new version of your module with an updated
`requires`
> directive. [2]
>
> As to (A), yes, conflicts exist, though it's worth observing that
many of
> the conflicts in the Maven Central data are due to poorly-chosen
artifact
> names: `parent`, `library`, `core`, and `common` top the list, which
then
> falls off in a long-tail distribution. When conflicts are detected
then
> build tools can rename artifacts either automatically or,
preferably, to
> user-specified names that map to sensible automatic-module names. If
> renaming artifacts in the filesystem proves impractical then we could
> extend the syntax of the `--module-path` option to allow a module
name
> to be specified for each specifically-named artifact, though strictly
> speaking that would be a feature of the JDK rather than JPMS.
>
> We can address (B) by enabling the maintainers of existing
components to
> specify the module names that should be given to their components
when
> used as automatic modules, without having to write `module-info.java`
> files. This can be done very simply, with a single new JAR-file
manifest
> `Module-Name` attribute, as first suggested almost a year ago [3].
>
> If we add this one feature then the maintainer of an existing
component
> that, e.g., must still build and run on JDK 7 can choose a module
name
> for that component, record it in the manifest by adding a few lines
to
> the `pom.xml` file, and tell users that they can use it as an
automatic
> module on JDK 9 without fear that the module name will change when
the
> component is properly modularized some years from now. The actual
change
> to the component is small and low-risk, so it can reasonably be done
in
> a patch release. There's no need to write a `module-info.java` file,
> and in fact doing so may be inadvisable at this point if the
component
> depends on other components that have not yet been given module
names.
>
> This approach for (B) does add one more (optional) step to the
migration
> path, but it will hopefully lead to a larger number of
explicitly-named
> modules in the world -- and in particular in Maven Central -- sooner
> rather than later.
>
> - Mark
>
>
> [1]
> http://mail.openjdk.java.net/pipermail/jpms-spec-experts/
2017-January/000537.html
> [2]
> http://mail.openjdk.java.net/pipermail/jigsaw-dev/2017-
January/011106.html
> [3]
> http://openjdk.java.net/projects/jigsaw/spec/issues/#
ModuleNameInManifest
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@maven.apache.org
> For additional commands, e-mail: dev-h...@maven.apache.org
>
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@maven.apache.org
For additional commands, e-mail: dev-h...@maven.apache.org