Hi Sebastian, thanks again for your time to feed back! It's really a
great help.

Regarding the web app doesn't work, it always a good practice to enable
devMode and set log mode to warn or at next step to debug.

Kind Regards.

On 1/24/2019 2:11 PM, Sebastian Götz wrote:
> Hello Yasser,
> 
> I have followed your instructions. The exceptions are gone although my
> webapp does not work either.
> But I need more time to figure out whether this is a general
> compatibility issue between struts2 2.5.2 and 2.5.20 or a matter of the
> Java 11 compiler.
> 
> 
> Am 23.01.2019 um 08:17 schrieb Yasser Zamani:
>>
>>> -----Original Message-----
>>> From: Sebastian Götz <s.go...@inform-technology.de>
>>> Sent: Thursday, January 17, 2019 4:41 PM
>>> To: user@struts.apache.org
>>> Subject: Re: Java 11 support
>>>
>>> Hi folks,
>>>
>>> it appears that there is some work left in the convention plugin. As I can 
>>> see from
>>> my IVY resolve process this plugin drags in asm 5.2. From its sources it 
>>> looks like it
>>> supports class version up to 1.8 (class version 52).
>>> As we compile with JDK 11 already (class version 55) we get a lot of these
>>> exceptions:
>>>
>>>  java.lang.IllegalArgumentException
>>>     at org.objectweb.asm.ClassReader.<init>(Unknown Source)
>>>     at org.objectweb.asm.ClassReader.<init>(Unknown Source)
>>>     at org.objectweb.asm.ClassReader.<init>(Unknown Source)
>>>     at
>>> org.apache.struts2.convention.DefaultClassFinder.readClassDef(DefaultClassFind
>>> er.java:461)
>>>     at
>>> org.apache.struts2.convention.DefaultClassFinder.<init>(DefaultClassFinder.java:
>>> 93)
>>>     at
>>> org.apache.struts2.convention.PackageBasedActionConfigBuilder.buildClassFind
>>> er(PackageBasedActionConfigBuilder.java:395)
>>>     at
>>> org.apache.struts2.convention.PackageBasedActionConfigBuilder.findActions(Pa
>>> ckageBasedActionConfigBuilder.java:377)
>>>     at
>>> org.apache.struts2.convention.PackageBasedActionConfigBuilder.buildActionCo
>>> nfigs(PackageBasedActionConfigBuilder.java:333)
>>>     at
>>> org.apache.struts2.convention.ClasspathPackageProvider.loadPackages(Classpat
>>> hPackageProvider.java:52)
>>>     at
>>> com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(D
>>> efaultConfiguration.java:206)
>>>     at
>>> com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(Con
>>> figurationManager.java:66)
>>>     at
>>> org.apache.struts2.dispatcher.Dispatcher.getContainer(Dispatcher.java:957)
>>>     at
>>> org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.j
>>> ava:463)
>>>     at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:496)
>>>     at
>>> org.apache.struts2.dispatcher.InitOperations.initDispatcher(InitOperations.java:7
>>> 3)
>>>     at
>>> org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrep
>>> areAndExecuteFilter.java:61)
>>>     at
>>> eu.inform.servlet.context.URIExcludeFilter.init(URIExcludeFilter.java:37)
>>>     at
>>> org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig
>>> .java:270)
>>>     at
>>> org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig
>>> .java:251)
>>>     at
>>> org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.ja
>>> va:102)
>>>     at
>>> org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4491)
>>>     at
>>> org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:51
>>> 35)
>>>     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
>>>     at
>>> org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1432
>>> )
>>>     at
>>> org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1422
>>> )
>>>     at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
>>>     at
>>> org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorServ
>>> ice.java:75)
>>>     at
>>> java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorS
>>> ervice.java:140)
>>>     at
>>> org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:944)
>>>     at
>>> org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:831)
>>>     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
>>>     at
>>> org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1432
>>> )
>>>     at
>>> org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1422
>>> )
>>>     at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
>>>     at
>>> org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorServ
>>> ice.java:75)
>>>     at
>>> java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorS
>>> ervice.java:140)
>>>     at
>>> org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:944)
>>>     at
>>> org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:261)
>>>     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
>>>     at
>>> org.apache.catalina.core.StandardService.startInternal(StandardService.java:422)
>>>     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
>>>     at
>>> org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:801)
>>>     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
>>>     at org.apache.catalina.startup.Catalina.start(Catalina.java:695)
>>>     at
>>> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native
>>> Method)
>>>     at
>>> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodA
>>> ccessorImpl.java:62)
>>>     at
>>> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Delegating
>>> MethodAccessorImpl.java:43)
>>>     at java.base/java.lang.reflect.Method.invoke(Method.java:566)
>>>     at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:350)
>>>     at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:492)
>>>
>>> I tried to exclude asm 5.2 on favor of 7.0 which works from the dependency
>>> resolving side. But the Struts2 ClassVisitor implementation is tied to ASM 
>>> 5:
>>>
>>> public class InfoBuildingVisitor extends ClassVisitor {
>>>         private Info info;
>>>         private ClassFinder classFinder;
>>>
>>>         public InfoBuildingVisitor(ClassFinder classFinder) {
>>>             super(Opcodes.ASM5);
>>>             this.classFinder = classFinder;
>>>         }
>>> ...
>>> }
>>>
>>> Therefore this leads to the following problem:
>>>
>>> java.lang.UnsupportedOperationException: This feature requires ASM7
>>>     at
>>> org.objectweb.asm.ClassVisitor.visitNestMember(ClassVisitor.java:236)
>>>     at org.objectweb.asm.ClassReader.accept(ClassReader.java:651)
>>>     at org.objectweb.asm.ClassReader.accept(ClassReader.java:391)
>>>     at
>>> org.apache.struts2.convention.DefaultClassFinder.readClassDef(DefaultClassFind
>>> er.java:462)
>>>     at
>>> org.apache.struts2.convention.DefaultClassFinder.<init>(DefaultClassFinder.java:
>>> 93)
>>>     at
>>> org.apache.struts2.convention.PackageBasedActionConfigBuilder.buildClassFind
>>> er(PackageBasedActionConfigBuilder.java:395)
>>>     at
>>> org.apache.struts2.convention.PackageBasedActionConfigBuilder.findActions(Pa
>>> ckageBasedActionConfigBuilder.java:377)
>>>     at
>>> org.apache.struts2.convention.PackageBasedActionConfigBuilder.buildActionCo
>>> nfigs(PackageBasedActionConfigBuilder.java:333)
>>>     at
>>> org.apache.struts2.convention.ClasspathPackageProvider.loadPackages(Classpat
>>> hPackageProvider.java:52)
>>>     at
>>> com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(D
>>> efaultConfiguration.java:206)
>>>     at
>>> com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(Con
>>> figurationManager.java:66)
>>>     at
>>> org.apache.struts2.dispatcher.Dispatcher.getContainer(Dispatcher.java:957)
>>>     at
>>> org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.j
>>> ava:463)
>>>     at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:496)
>>>     at
>>> org.apache.struts2.dispatcher.InitOperations.initDispatcher(InitOperations.java:7
>>> 3)
>>>     at
>>> org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrep
>>> areAndExecuteFilter.java:61)
>>>     at
>>> eu.inform.servlet.context.URIExcludeFilter.init(URIExcludeFilter.java:37)
>>>     at
>>> org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig
>>> .java:270)
>>>     at
>>> org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig
>>> .java:251)
>>>     at
>>> org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.ja
>>> va:102)
>>>     at
>>> org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4491)
>>>     at
>>> org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:51
>>> 35)
>>>     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
>>>     at
>>> org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1432
>>> )
>>>     at
>>> org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1422
>>> )
>>>     at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
>>>     at
>>> org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorServ
>>> ice.java:75)
>>>     at
>>> java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorS
>>> ervice.java:140)
>>>     at
>>> org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:944)
>>>     at
>>> org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:831)
>>>     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
>>>     at
>>> org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1432
>>> )
>>>     at
>>> org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1422
>>> )
>>>     at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
>>>     at
>>> org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorServ
>>> ice.java:75)
>>>     at
>>> java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorS
>>> ervice.java:140)
>>>     at
>>> org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:944)
>>>     at
>>> org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:261)
>>>     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
>>>     at
>>> org.apache.catalina.core.StandardService.startInternal(StandardService.java:422)
>>>     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
>>>     at
>>> org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:801)
>>>     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
>>>     at org.apache.catalina.startup.Catalina.start(Catalina.java:695)
>>>     at
>>> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native
>>> Method)
>>>     at
>>> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodA
>>> ccessorImpl.java:62)
>>>     at
>>> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Delegating
>>> MethodAccessorImpl.java:43)
>>>     at java.base/java.lang.reflect.Method.invoke(Method.java:566)
>>>     at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:350)
>>>     at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:492)
>>>
>>> Can someone verfiy that and propose a fix?
>>>
>>
>> Hi Sebastian,
>>
>> Thank you very much for your explores share!
>>
>> Yes you're right. It seems we should upgrade to ASM7 in 2.5.21 also if it 
>> passed all tests as well. And sorry for these troubles above! We missed 
>> those because we run our integration tests in struts showcase app only on 
>> JDK8 and only with target java 7 (as you discovered).
>>
>> Could you please check if any further issue persists with my following 
>> solution (beside your workaround for drop-in ASM7 dependency)? I think "This 
>> feature requires ASM7" will vanished with it but I'm not comprehensively 
>> sure if any further issue arises after. If so, it would be nice to fix them 
>> in 2.5.21 as well (beside asm.version=7.0).
>>
>> The solution (with thanks to Struts awesome design) :) :
>> 1. Copy org.apache.struts2.convention.DefaultClassFinder and paste to 
>> your.app.target.package.ASM7DefaultClassFinder.
>> 2. Replace all Opcodes.ASM5 with Opcodes.ASM7 in 
>> your.app.target.package.ASM7DefaultClassFinder.
>> 3. Define the new class your.app.target.package.ASM7ClassFinderFactory as 
>> below:
>> import com.opensymphony.xwork2.util.finder.ClassFinder;
>> import com.opensymphony.xwork2.util.finder.ClassFinderFactory;
>> import com.opensymphony.xwork2.util.finder.ClassLoaderInterface;
>> import com.opensymphony.xwork2.util.finder.Test; 
>> public class ASM7ClassFinderFactory implements ClassFinderFactory {
>>     public ClassFinder buildClassFinder(ClassLoaderInterface 
>> classLoaderInterface, Collection urls, boolean extractBaseInterfaces, Set 
>> protocols, Test classNameFilter) {
>>         return new ASM7DefaultClassFinder(classLoaderInterface, urls, 
>> extractBaseInterfaces, protocols, classNameFilter);
>>     }
>> }
>> 4. Register it in your struts.xml as below:
>> <bean type="com.opensymphony.xwork2.util.finder.ClassFinderFactory" 
>> class="your.app.target.package.ASM7ClassFinderFactory" scope="singleton"/>
>>
>> Thanks in advance!
>>
>> Kind Regards.
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: user-unsubscr...@struts.apache.org
>> For additional commands, e-mail: user-h...@struts.apache.org
> 

Reply via email to