Unnamed module and duplicate package

Alex Buckley alex.buckley at oracle.com
Thu Mar 10 21:59:23 UTC 2016


Yes -- and also the javax.** APIs in the modules directly required by 
java.se.ee (see http://openjdk.java.net/jeps/200).

Alex

On 3/10/2016 1:41 PM, David M. Lloyd wrote:
> One case to consider is javax.transaction.xa, which is part of the JDK
> and also in the JTA API along with javax.transaction.
>
> On 03/09/2016 05:13 PM, Alex Buckley wrote:
>> Paul, thank you for asking. The module system's treatment of the unnamed
>> module vis-a-vis named modules is probably the biggest factor affecting
>> usability of the module system. This is true almost by definition
>> because at JDK 9 GA the only named modules in the world will be the
>> JDK's while every other class will be in the unnamed module of the
>> application class loader.
>>
>> So please, ask more questions about the unnamed module. I am especially
>> interested to know if anyone has JARs that contain javax packages (or
>> heaven forbid, sun or com.sun packages) found in the JDK -- such JARs
>> are a mortal danger to interop between unnamed and named modules.
>>
>> Alex
>>
>> On 3/9/2016 1:47 PM, Paul Benedict wrote:
>>> Thank you Alex. Since it's roughly the same as JDK 8, then it's also not
>>> worse. I defer to your explanation on that point.
>>>
>>> Cheers,
>>> Paul
>>>
>>> On Wed, Mar 9, 2016 at 3:37 PM, Alex Buckley <alex.buckley at oracle.com
>>> <mailto:alex.buckley at oracle.com>> wrote:
>>>
>>>     Presumably you would count the equivalent scenario on JDK 8 -- my
>>>     package A is in Alex.jar on the classpath and your package A is in
>>>     Paul.jar on the classpath -- as a security issue too, because some
>>>     of my classes may substitute for yours (or some of yours for mine,
>>>     depending on how the classpath is constructed).
>>>
>>>     On JDK 9, we do the "substitution" cleanly. Package A is not split.
>>>     That avoids one category of error (ClassCastException). What about
>>>     poor package B that finds itself accessing a different package A
>>>     than it was compiled with? Well, since package A is exported by a
>>>     named module, it's reasonable to assume that the named module "owns"
>>>     package A [*], and that the developer of package B co-bundled some
>>>     version of package A without renaming it. Dangerous in JDK 8,
>>>     dangerous in JDK 9. (We're trying to encapsulate the internals of a
>>>     module, which is different from trying to isolate modules from each
>>>     other.)
>>>
>>>     [*] Advanced scenario: the named module exporting A is actually an
>>>     automatic module which happened to co-bundle package A. By placing
>>>     this JAR on the modulepath to form an automatic module, it dominates
>>>     the JAR left on the classpath which also co-bundled package A.
>>>
>>>     Alex
>>>
>>>     On 3/9/2016 1:17 PM, Paul Benedict wrote:
>>>
>>>         But isn't what your proposing a security issue? Let's say my
>>>         package A
>>>         is in the unnamed module and your package A is in a named
>>>         module. You
>>>         basically took over my code; your classes will be substituted
>>>         for mine.
>>>
>>>         Cheers,
>>>         Paul
>>>
>>>         On Wed, Mar 9, 2016 at 2:38 PM, Alex Buckley
>>>         <alex.buckley at oracle.com <mailto:alex.buckley at oracle.com>
>>>         <mailto:alex.buckley at oracle.com
>>>         <mailto:alex.buckley at oracle.com>>> wrote:
>>>
>>>              On 3/9/2016 10:36 AM, Paul Benedict wrote:
>>>
>>>                    From the doc:
>>>                  "If a package is defined in both a named module and the
>>>         unnamed
>>>                  module then
>>>                  the package in the unnamed module is ignored. This
>>>         preserves
>>>                  reliable
>>>                  configuration even in the face of the chaos of the
>>>         class path,
>>>                  ensuring
>>>                  that every module still reads at most one module
>>> defining a
>>>                  given package.
>>>                  If, in our example above, a JAR file on the class path
>>>         contains
>>>                  a class
>>>                  file named com/foo/bar/alpha/AlphaFactory.class then
>>>         that file
>>>                  will never
>>>                  be loaded, since the com.foo.bar.alpha package is
>>>         exported by the
>>>                  com.foo.bar module."
>>>
>>>                  I would like some clarification. Correct me if wrong,
>>> but I
>>>                  think this
>>>                  entire paragraph is really meant to be about the
>>>         perspective from a
>>>                  modularized JAR? If a module has package A, and the
>>> unnamed
>>>                  module has
>>>                  package A, then of course the module's package A should
>>>         win.
>>>
>>>                  However, if it is meant to be absolute language, then I
>>>         disagree.
>>>
>>>                  The unnamed module should be coherent among itself.
>>> If the
>>>                  unnamed module
>>>                  has package B and relies on classes from package A, it
>>>         should
>>>                  still be able
>>>                  to see its own package A. I don't think modules should
>>>         be able
>>>                  to impact
>>>                  how the unnamed module sees itself. That's a surprising
>>>         situation.
>>>
>>>
>>>              The unnamed module is not a root module during resolution.
>>>         If your
>>>              main class is in the unnamed module (i.e. you did java -jar
>>>              MyApp.jar rather than java -m MyApp), then the module
>>> graph is
>>>              created by resolving various root modules (what are they?
>>>         separate
>>>              discussion) and only then is the unnamed module hooked up
>>>         to read
>>>              every module in the graph.
>>>
>>>              Hope we're OK so far.
>>>
>>>              If some named module in the graph exports package A (more
>>>         than one
>>>              module exporting A? separate discussion), then since the
>>>         unnamed
>>>              module reads that named module, the unnamed module will
>>>         access A.*
>>>              types from that named module.
>>>
>>>              It's hard to imagine the unnamed module NOT accessing A.*
>>>         types from
>>>              that named module. Primarily, we need to avoid a split
>>> package
>>>              situation where code in the unnamed module sometimes
>>>         accesses A.*
>>>              types from the named module and sometimes from the unnamed
>>>         module.
>>>
>>>              You might say, OK, let code in the unnamed module
>>>         exclusively access
>>>              A.* in the unnamed module rather than exclusively access
>>>         A.* in the
>>>              named module. Then you have two problems:
>>>
>>>              1. There are issues for named modules in the same class
>>>         loader as
>>>              the unnamed module -- such named modules MUST get A.* from
>>>         the named
>>>              module rather than the unnamed module, and the class
>>> loading
>>>              mechanism is incapable of switching based on accessor.
>>> It'll be
>>>              common for named modules to exist in the same class loader
>>>         as the
>>>              unnamed module, as modular JARs on the modulepath and
>>>         non-modular
>>>              JARs on the classpath all end up in the application class
>>>         loader
>>>              (modular JARs as named modules; non-modular JARs jointly
>>> as the
>>>              unnamed module).
>>>
>>>              2. While the module system is sure that package A exists
>>> in the
>>>              named module, how would the module system possibly know
>>>         that package
>>>              A exists in the unnamed module? Scanning every class file
>>>         in every
>>>              non-modular JAR on the classpath at startup sounds bad.
>>>
>>>              Alex
>>>
>>>
>>>
>


More information about the jigsaw-dev mailing list