[
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)