Hi Jochen,
a quick follow-up:
with your suggested modification to the module-info.java file now it works

*opens <MODULENAME> to org.apache.groovy;*

Thank you
Mirco

Il Dom 30 Mar 2025, 22:00 Mirco Colletta <mirch...@gmail.com> ha scritto:

> Hi Jochen,
> thanks for the observations.
>
> > It could also be solved by using static compilation for the module.
>
> Actually the app is already statically compiled through a compiler
> configuration:
>
> https://github.com/mcolletta/groovy-modular-example/blob/4f9862d87fedd7a883b358ea0619faa0b5834374/build.gradle#L32
>
> https://github.com/mcolletta/groovy-modular-example/blob/main/config/src/main/groovy/compiler-config.groovy
>
> > So maybe
> opens io.modular.example to org.apache.groovy;
> > in the module info might be already enough?
>
> Well, it's worth a try, will see
>
> Bye
> Mirco
>
> Il Dom 30 Mar 2025, 18:05 Jochen Theodorou <blackd...@gmx.org> ha scritto:
>
>> On 29.03.25 12:18, Mirco Colletta wrote:
>> > Hi all,
>> > I'd like to know if some of you has experience on how to create a full
>> > modular (JPMS, JSR 376) groovy application.
>>  >
>> > First of all, is it possible, at the moment, to create a full modular
>> > groovy application? If yes, what is the recommended approach?
>>
>> the question though is what full modular means. Getting my knowledge
>> about modules refreshed a bit... we have normal modules, automatic
>> modules and unnamed modules. Groovy comes as automatic module, so it can
>> be referenced by name, but does not follow all the rules named modules
>> do. Latest JVMs might have done relevant changes here of course.
>>
>> Then there are the two cases of a script run by Groovy from source and
>> precompiled Groovy code in a different module.
>>
>> I think running scripts works to some extend, a full fledged Groovy app
>> in a module... maybe not.
>>
>> [...]
>> > running the app using the NON modular (gradle) build file it works just
>> > fine: (Gradle v. 8.13)
>> > gradle --build-file=build.gradle.nm runApp
>> >
>> > but as you can see this solution is not ideal nor elegant due to these
>> > jvmArgs "--add-exports" to all unnamed modules (the many exports are
>> > extracted from my real project)
>> >
>> https://github.com/mcolletta/groovy-modular-example/blob/main/build.gradle.nm
>> <
>> https://github.com/mcolletta/groovy-modular-example/blob/main/build.gradle.nm
>> >
>>
>> yes... that is exactly what I expected :(
>>
>> > Eventually I've tried a different approach. I created a
>> > /module-info.java/ file with all the necessary "requires", including
>> >
>> >     requires org.apache.groovy;
>> >
>> >
>> https://github.com/mcolletta/groovy-modular-example/blob/main/src/main/java/module-info.java
>> <
>> https://github.com/mcolletta/groovy-modular-example/blob/main/src/main/java/module-info.java
>> >
>> >
>> > this way the application somewhat compiles with:
>> >
>> >     gradle build
>> >
>> >
>> https://github.com/mcolletta/groovy-modular-example/blob/main/build.gradle
>> <
>> https://github.com/mcolletta/groovy-modular-example/blob/main/build.gradle
>> >
>> >
>> > but for strange reasons it starts to give very weird errors at runtime
>> > when /enums /are present
>> >
>> >     gradle run
>> >
>> >
>> >     Caused by: java.lang.ExceptionInInitializerError
>> >              at io.modular.example/io.modular.example.App
>> >     <http://io.modular.example.App>.<init>(App.groovy)
>> >              at
>> >
>>  
>> java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)
>> >              ... 11 more
>> >     Caused by: groovy.lang.GroovyRuntimeException: Could not find
>> >     matching constructor for: io.modular.example.Mode(String, Integer)
>> >              at
>> >     org.apache.groovy@4.0.26
>> /groovy.lang.MetaClassImpl.createCachedConstructor(MetaClassImpl.java:1726)
>> >              at
>> >     org.apache.groovy@4.0.26
>> /groovy.lang.MetaClassImpl.selectConstructorAndTransformArguments1(MetaClassImpl.java:1752)
>> >              at
>> >     org.apache.groovy@4.0.26
>> /groovy.lang.MetaClassImpl.selectConstructorAndTransformArguments(MetaClassImpl.java:1679)
>> >              at
>> >     org.apache.groovy@4.0.26
>> /org.codehaus.groovy.runtime.ScriptBytecodeAdapter.selectConstructorAndTransformArguments(ScriptBytecodeAdapter.java:252)
>> >              at
>> io.modular.example/io.modular.example.Mode.$INIT(App.groovy)
>> >              at
>> >     io.modular.example/io.modular.example.Mode.<clinit>(App.groovy)
>> >
>> >
>> > Here "Mode" is a simple /enum /and the problematic statement is this
>> one:
>> >
>> >     Mode mode = Mode.Edit
>>
>> actually this line Mode.$INIT(App.groovy) tells me we are in the
>> constructor of Mode, that is not explicitly in the code, but would be
>> related more to the enum definition itself. Even though it is a enum it
>> still looks roughly like this (same in Java):
>>
>> final static class Mode extend Enum {
>>    Mode(){super()}
>>   ...
>> }
>>
>> The call to super is realized by selectConstructorAndTransformArguments
>>
>> >
>> https://github.com/mcolletta/groovy-modular-example/blob/4f9862d87fedd7a883b358ea0619faa0b5834374/src/main/groovy/io/modular/example/App.groovy#L20
>> <
>> https://github.com/mcolletta/groovy-modular-example/blob/4f9862d87fedd7a883b358ea0619faa0b5834374/src/main/groovy/io/modular/example/App.groovy#L20
>> >
>>
>> my assumption is that because of the module system Groovy cannot see the
>> the non-public constructor of the enum. I think you need to add an
>> add-opens... or was it add-exports.... well the groovy modules must be
>> able to read the hidden methods in the module of the groovy app. So maybe
>>
>> opens io.modular.example to org.apache.groovy;
>>
>> in the module info might be already enough?
>>
>> > It seems that in a modular context something interferes with the groovy
>> > runtime for (at least) enums.
>>
>> It could also be solved by using static compilation for the module. But
>> the problem will come back for other places
>>
>> > (Beside the opaque behavior of the "run" task of the application plugin
>> > I got however the same error adding my module explicitly with the
>> > command line argument --module-path)
>> > However as I stated above I'm not sure if this is a lecit and correct
>> > strategy to make a groovy modular application.
>> >
>> > Do you have any suggestions/advice?
>>
>> We tweaked many places already in preparation for the module system and
>> keep changing things here an there, but we might be missing something
>> somewhere. I am afraid you would be the one to discover that then. We
>> will try to support you of course. Just don't expect things to go easy.
>>
>> bye Jochen
>>
>>
>>
>>

Reply via email to