[ 
https://issues.apache.org/jira/browse/GROOVY-10475?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17489943#comment-17489943
 ] 

Paul King commented on GROOVY-10475:
------------------------------------

The JPMS requirement for JDK9+ make providing an Uber jar problematic. The 
individual Groovy jars have all of the required information to make an Uber jar 
but I don't know of Maven tooling that can piece it together - but I am far 
from a Maven expert - perhaps someone else can assist there.

Since we don't create an Uber jar any more, we have no need for something like 
assemble.groovy. It was just suggested as a workaround. Looking at the created 
my-app shaded jars it indeed seems to have just a random extension from one 
module - I presume the last module processed wins or something like that. It 
happens to be DateTimeExtensions in what you provided - so numerous other 
extensions will also be disabled not just swing (which console needs). As well 
as looking in META-INF/groovy for (currently) a single specific file, Groovy 
also finds extension methods also from a special META-INF/dgminfo file. So, 
another workaround would be to pre-merge extensions from modules into that 
file. (We have a DgmConverter tool that might assist - I could probably provide 
further suggestions on using Gradle to invoke that class but I haven't tried to 
use it with Maven.)

Could anything change on the Groovy side to make existing Maven tooling work 
more easily? I suspect the Uber jar isn't an option - JPMS restrictions don't 
make that easy. We _could _store the extension method metadata slightly 
differently perhaps. Rather than looking for a single dgminfo file or single 
org.codehaus.groovy.runtime.ExtensionModule file, we could look for multiple. 
We'd need to work out some details and it may have a performance impact.

We _might_ be able to pre-calculate the uber version of what should be in the 
org.codehaus.groovy.runtime.ExtensionModule file and provide that somehow in a 
form that existing tooling could make use of - but as soon as someone wants to 
exclude or include a module outside the normal groovy-all modules, it would 
become out of date, so I am not sure this is particularly valuable.

> Groovy console fails to launch if Jar built by Maven
> ----------------------------------------------------
>
>                 Key: GROOVY-10475
>                 URL: https://issues.apache.org/jira/browse/GROOVY-10475
>             Project: Groovy
>          Issue Type: Bug
>          Components: Groovy Console
>    Affects Versions: 3.0.9, 4.0.0
>         Environment: Ubuntu 18.04/20.04, Debian 10
> OpenJDK 11.0.13
> Groovy 3.0.9/4.0.0
> Maven 3.6.0
>            Reporter: Olga Lobanova
>            Priority: Major
>         Attachments: groovy-console-test.tgz
>
>
> The same error like in GROOVY-8253 still exists for Groovy 3(or 4) and Java 
> 11 if Jar with main method is build by Maven.
> Use to reproduce the attached project  [^groovy-console-test.tgz]
> Execute via:
> {noformat}
> mvn package
> java -jar ./target/my-app-1.0-SNAPSHOT.jar
> {noformat}
> The exception stacktrace:
> {noformat}
> Exception in thread "main" groovy.lang.MissingMethodException: No signature 
> of method: javax.swing.JMenu.setMnemonic() is applicable for argument types: 
> (String) values: [F]
> Possible solutions: setMnemonic(char), setMnemonic(int), getMnemonic()
>       at 
> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:72)
>       at 
> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:78)
>       at 
> org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:82)
>       at 
> org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:194)
>       at 
> groovy.console.ui.view.BasicMenuBar$_run_closure1.doCall(BasicMenuBar.groovy:22)
>       at 
> groovy.console.ui.view.BasicMenuBar$_run_closure1.doCall(BasicMenuBar.groovy)
>       at 
> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>       at 
> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>       at java.base/java.lang.reflect.Method.invoke(Method.java:566)
>       at 
> org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:343)
>       at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:328)
>       at 
> org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:279)
>       at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1009)
>       at groovy.lang.Closure.call(Closure.java:418)
>       at groovy.lang.Closure.call(Closure.java:412)
>       at 
> groovy.util.FactoryBuilderSupport.dispatchNodeCall(FactoryBuilderSupport.java:892)
>       at 
> groovy.util.FactoryBuilderSupport.doInvokeMethod(FactoryBuilderSupport.java:784)
>       at 
> groovy.util.FactoryBuilderSupport.invokeMethod(FactoryBuilderSupport.java:503)
>       at 
> groovy.util.FactoryInterceptorMetaClass.invokeMethod(FactoryBuilderSupport.java:1342)
>       at 
> org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:75)
>       at 
> org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:50)
>       at 
> org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:85)
>       at 
> org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:185)
>       at groovy.console.ui.view.BasicMenuBar.run(BasicMenuBar.groovy:21)
>       at 
> groovy.util.FactoryBuilderSupport.build(FactoryBuilderSupport.java:1174)
>       at 
> groovy.util.FactoryBuilderSupport.build(FactoryBuilderSupport.java:1157)
>       at 
> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>       at 
> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>       at java.base/java.lang.reflect.Method.invoke(Method.java:566)
>       at 
> org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:343)
>       at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:328)
>       at groovy.lang.MetaClassImpl.doInvokeMethod(MetaClassImpl.java:1369)
>       at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1103)
>       at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1009)
>       at 
> org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.java:610)
>       at 
> org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:593)
>       at 
> org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeOnDelegationObjects(ClosureMetaClass.java:405)
>       at 
> org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:328)
>       at 
> org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:63)
>       at 
> org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:185)
>       at 
> groovy.console.ui.Console$__clinit__closure30.doCall(Console.groovy:409)
>       at 
> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>       at 
> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>       at java.base/java.lang.reflect.Method.invoke(Method.java:566)
>       at 
> org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:343)
>       at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:328)
>       at 
> org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:279)
>       at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1009)
>       at 
> org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:39)
>       at 
> org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:139)
>       at 
> groovy.console.ui.ConsoleView$_run_closure1.doCall(ConsoleView.groovy:65)
>       at 
> groovy.console.ui.ConsoleView$_run_closure1.doCall(ConsoleView.groovy)
>       at 
> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>       at 
> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>       at java.base/java.lang.reflect.Method.invoke(Method.java:566)
>       at 
> org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:343)
>       at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:328)
>       at 
> org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:279)
>       at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1009)
>       at groovy.lang.Closure.call(Closure.java:418)
>       at groovy.lang.Closure.call(Closure.java:412)
>       at 
> groovy.util.FactoryBuilderSupport.dispatchNodeCall(FactoryBuilderSupport.java:892)
>       at 
> groovy.util.FactoryBuilderSupport.doInvokeMethod(FactoryBuilderSupport.java:784)
>       at 
> groovy.util.FactoryBuilderSupport.invokeMethod(FactoryBuilderSupport.java:503)
>       at 
> groovy.util.FactoryInterceptorMetaClass.invokeMethod(FactoryBuilderSupport.java:1342)
>       at 
> org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:75)
>       at 
> org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:50)
>       at 
> org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:171)
>       at 
> org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:194)
>       at groovy.console.ui.ConsoleView.run(ConsoleView.groovy:62)
>       at 
> groovy.util.FactoryBuilderSupport.build(FactoryBuilderSupport.java:1174)
>       at 
> groovy.util.FactoryBuilderSupport.build(FactoryBuilderSupport.java:1157)
>       at groovy.util.FactoryBuilderSupport$build$4.call(Unknown Source)
>       at 
> org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:46)
>       at 
> org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
>       at 
> org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:139)
>       at groovy.console.ui.Console.run(Console.groovy:440)
>       at groovy.console.ui.Console$run$0.callCurrent(Unknown Source)
>       at 
> org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:50)
>       at 
> org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:171)
>       at 
> org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:185)
>       at groovy.console.ui.Console.run(Console.groovy:414)
>       at com.mycompany.app.App.main(App.java:11)
> {noformat}



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

Reply via email to