Requires runtime considered?
Alan Bateman
Alan.Bateman at oracle.com
Mon Jun 28 09:21:08 UTC 2021
On 28/06/2021 09:49, Christian Beikov wrote:
> Hello experts,
>
> I am in the process of modularizing one of my projects and hit some
> rather annoying limitations that requires me to change parts of my
> build and dependencies due to the way the Java module system works.
>
> I usually have modules like x-api, x-impl and x-testsuite where I have
> a compile time dependency from x-impl to x-api. In x-testsuite I only
> code against x-api, so I define a Maven runtime dependency on x-impl
> in order for my CDI container to pick up the implementations. The
> annoying part is that with modularization I now need to declare my
> dependency in x-testsuite on x-impl as compile time dependency,
> because otherwise I can't list the module in the module-info. If I
> don't list the module, then it is not "visible" to the CDI container,
> which I guess is on purpose, even though it probably ends up in the
> module path.
>
> Is that by design that classes are not visible if no module depends on
> a module like x-impl in such a scenario, or is that maybe something
> that could work and should be improved in the CDI implementation? I
> was thinking that if "requires runtime ..." were allowed without
> checking that the module is available during compilation, this would
> work fine. Did this idea come up before already?
The module system supports services. x-api uses a service, x-impl
provides an implementation of the service. If x-api is resolved then all
observable modules that provide an implementation of the services used
by x-api will be resolved too. In this scenario, x-impl requires x-api,
x-api does not require x-impl. You used the phrase "compile time
dependency" but it's more than that, it's all phases as there will be
references in x-impl to x-api's exported API.
I don't know if you control the CDI implementation or not but if you
aren't using services then you'll need to help the module system with
"--add-modules x-impl". This is because no other module requires x-impl
and it's not providing an implementation of a service. It may be
observable but it's the same directory as 99,999 other modules that you
don't care about.
-Alan
More information about the jigsaw-dev
mailing list