2017-10-17 10 views
0

Une équipe travaille sur une application Struts. Les membres de l'équipe utilisent de nombreux systèmes d'exploitation différents.struts 2 NoSuchFieldError PROTOTYPE dans TomCat sur Fedora

Nous utilisons Java 8. À l'heure actuelle, je me sers 1.8.0_152-b16, mais je l'ai testé en utilisant plusieurs versions de Java 8, y compris 131 et 144.

J'utilise actuellement TomCat 8.5.23 , mais ont également essayé 8.0.20 et 9.0.1.

J'installe TomCat en décompressant la version tar.gz en place, puis en modifiant le fichier tomcat-users.xml.

Le déploiement est effectué en laissant tomber le fichier WAR en place.

sur Fedora 22 et Fedora 26, je vois l'erreur suivante dans le fichier journal localhost:

17-Oct-2017 17:06:13.077 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.filterStart Exception starting filter [struts2] 
java.lang.NoSuchFieldError: PROTOTYPE 
    at org.apache.struts2.config.DefaultBeanSelectionProvider.register(DefaultBeanSelectionProvider.java:389) 
    at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:226) 
    at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:67) 
    at org.apache.struts2.dispatcher.Dispatcher.getContainer(Dispatcher.java:897) 
    at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:437) 
    at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:478) 
    at org.apache.struts2.dispatcher.InitOperations.initDispatcher(InitOperations.java:75) 
    at org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrepareAndExecuteFilter.java:63) 
    at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:285) 
    at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:266) 
    at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:108) 
    at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4591) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5233) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:752) 
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:728) 
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734) 
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:988) 
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1860) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 
    at java.lang.Thread.run(Thread.java:748) 

Le fichier web.xml se présente comme suit:

<!DOCTYPE web-app PUBLIC 
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
"http://java.sun.com/dtd/web-app_2_3.dtd" > 

<web-app> 
    <display-name>Struts 2 Web Application</display-name> 

    <filter> 
     <filter-name>struts2</filter-name> 
     <filter-class> 
      org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter 
     </filter-class> 
    </filter> 

    <filter-mapping> 
     <filter-name>struts2</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 
</web-app> 

Je vois cette erreur sur un ancien ordinateur Fedora 22. J'ai ensuite testé sur une nouvelle installation de Fedora 26. L'étrange est que je peux déposer le fichier WAR sur un CENTOS, Ubuntu et Windows 7 sans problème. Je vois seulement cette erreur sur les machines Fedora.

Je ne sais pas grand-chose sur les entretoises, mais j'ai utilisé Java depuis longtemps. Je comprends les implications de NoSuchFieldError, et cela me fait suspecter qu'une version incorrecte de certains fichiers Jar est utilisée, mais il me semble très étrange que sur Fedora, je vois l'erreur, mais pas sur un autre fonctionnement système.

Toute aide pour diagnostiquer ce problème est appréciée.

Répondre

1

Il semble /com/opensymphony/xwork2/inject/Scope.class a été remplacé par une version plus ancienne de 18 juin 2015. A cette date DEFAULT est changé à PROTOTYPE selon this commit mais il semble une version plus ancienne classe est chargée.

+0

Alors maintenant, j'ai juste besoin de comprendre d'où cela vient sur les machines Fedora et pas sur les autres. Merci! – Andrew

+0

@Andrew, oui, vous pouvez utiliser les options java '-XX: + TraceClassLoading -XX: + TraceClassUnloading' :) –