2015-09-18 15 views
14

Sto lavorando su un app utilizzando:problema Percorso di classe tra il molo-maven-plugin e Tomcat-JDBC 8.0.9+ che porta a ServiceConfigurationError

molo-maven-plugin: 9.3.2.v20150730
tomcat- jdbc: 8.0.8 (che ha tomcat-juli come dipendenza)

Dopo aver cercato di aggiornare il vaso tomcat-JDBC per qualsiasi versione di là 8.0.9+ ottengo il seguente errore:

java.util.ServiceConfigurationError: org.apache.juli.logging.Log: Provider org.eclipse.jetty.apache.jsp.JuliLog not a subtype

Guardando la changelog tra quelle 2 versioni ho trovato qualcosa che l ooks sospettoso:

"Aggiungi un semplice meccanismo di rilevamento basato su ServiceLoader su JULI LogFactory per semplificare l'utilizzo di componenti JULI e Tomcat che dipendono da JULI (come Jasper) indipendentemente da Tomcat. Patch fornita da Greg Wilkins. (Markt)"

Inoltre, ho trovato che una nuova proprietà di sistema è stato introdotto nel collegamento Pool Apache Tomcat JDBC:

org.apache.tomcat.jdbc.pool.onlyAttemptCurrentClassLoader

"Controlla il caricamento in classe delle classi dinamiche, come driver JDBC, intercettatori e validatori. Se impostato su false, valore predefinito, il pool tenterà innanzitutto di caricare utilizzando il caricatore corrente (ad esempio il programma di caricamento classe che ha caricato le classi del pool) e se il caricamento della classe non riesce a caricare utilizzando il caricatore di contesto del thread. Impostare questo valore su true, se si desidera rimanere retrocompatibili con Apache Tomcat 8.0.8 e versioni precedenti e tentare solo il caricatore corrente. Se non è impostato il valore predefinito è false "

Purtroppo, a partire il plugin con molo:..!! Run usando questa proprietà non ha risolto il problema

Qualsiasi aiuto sarebbe apprezzato Grazie

traccia stack e le dipendenze albero:

 
Caused by: 
java.util.ServiceConfigurationError: org.apache.juli.logging.Log: Provider org.eclipse.jetty.apache.jsp.JuliLog not a subtype 
    at java.util.ServiceLoader.fail(ServiceLoader.java:239) 
    at java.util.ServiceLoader.access$300(ServiceLoader.java:185) 
    at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:376) 
    at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404) 
    at java.util.ServiceLoader$1.next(ServiceLoader.java:480) 
    at org.apache.juli.logging.LogFactory.(LogFactory.java:78) 
    at org.apache.juli.logging.LogFactory.(LogFactory.java:66) 
    at org.apache.tomcat.jdbc.pool.DataSourceFactory.(DataSourceFactory.java:58) 
    at local.ristretto.persistence.datasource.mail.MailDataSourceConfiguration.dataSource(MailDataSourceConfiguration.java:31) 
    at local.ristretto.persistence.datasource.mail.MailDataSourceConfiguration$$EnhancerBySpringCGLIB$$497970dd.CGLIB$dataSource$0() 
    at local.ristretto.persistence.datasource.mail.MailDataSourceConfiguration$$EnhancerBySpringCGLIB$$497970dd$$FastClassBySpringCGLIB$$2ba2dde9.invoke() 
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) 
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:309) 
    at local.ristretto.persistence.datasource.mail.MailDataSourceConfiguration$$EnhancerBySpringCGLIB$$497970dd.dataSource() 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162) 
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1119) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1014) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1120) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1044) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:942) 
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:813) 
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741) 
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:464) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1119) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1014) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:956) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:747) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) 
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:434) 
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306) 
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) 
    at org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized(ContextHandler.java:798) 
    at org.eclipse.jetty.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.java:530) 
    at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:771) 
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:342) 
    at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1368) 
    at org.eclipse.jetty.maven.plugin.JettyWebAppContext.startWebapp(JettyWebAppContext.java:320) 
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1335) 
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:735) 
    at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:259) 
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:511) 
    at org.eclipse.jetty.maven.plugin.JettyWebAppContext.doStart(JettyWebAppContext.java:403) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132) 
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114) 
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61) 
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:161) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132) 
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114) 
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132) 
    at org.eclipse.jetty.server.Server.start(Server.java:405) 
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:106) 
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61) 
    at org.eclipse.jetty.server.Server.doStart(Server.java:372) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
    at org.eclipse.jetty.maven.plugin.AbstractJettyMojo.startJetty(AbstractJettyMojo.java:457) 
    at org.eclipse.jetty.maven.plugin.AbstractJettyMojo.execute(AbstractJettyMojo.java:328) 
    at org.eclipse.jetty.maven.plugin.JettyRunMojo.execute(JettyRunMojo.java:170) 
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:132) 
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208) 
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) 
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) 
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116) 
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80) 
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51) 
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:120) 
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:347) 
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:154) 
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:582) 
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:214) 
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:158) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356) 
    at org.codehaus.classworlds.Launcher.main(Launcher.java:46) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) 
 
[INFO] | +- org.springframework.data:spring-data-jpa:jar:1.8.2.RELEASE:compile    
[INFO] | | +- org.springframework.data:spring-data-commons:jar:1.10.2.RELEASE:compile  
[INFO] | | +- org.springframework:spring-orm:jar:4.1.7.RELEASE:compile      
[INFO] | | | \- org.springframework:spring-jdbc:jar:4.1.7.RELEASE:compile     
[INFO] | | +- org.springframework:spring-tx:jar:4.1.7.RELEASE:compile      
[INFO] | | \- org.aspectj:aspectjrt:jar:1.8.6:compile          
[INFO] | +- org.postgresql:postgresql:jar:9.4-1202-jdbc42:compile        
[INFO] | +- org.apache.tomcat:tomcat-jdbc:jar:8.0.9:compile         
[INFO] | | \- org.apache.tomcat:tomcat-juli:jar:8.0.9:compile        
[INFO] | +- org.hibernate:hibernate-entitymanager:jar:5.0.1.Final:compile      
[INFO] | | +- org.jboss.logging:jboss-logging:jar:3.3.0.Final:compile      
[INFO] | | +- org.hibernate:hibernate-core:jar:5.0.1.Final:compile       
[INFO] | | | +- antlr:antlr:jar:2.7.7:compile            
[INFO] | | | \- org.jboss:jandex:jar:1.2.2.Final:compile         
[INFO] | | +- dom4j:dom4j:jar:1.6.1:compile             
[INFO] | | | \- xml-apis:xml-apis:jar:1.0.b2:compile          
[INFO] | | +- org.hibernate.common:hibernate-commons-annotations:jar:5.0.0.Final:compile  
[INFO] | | +- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:jar:1.0.0.Final:compile 
[INFO] | | +- org.apache.geronimo.specs:geronimo-jta_1.1_spec:jar:1.1.1:compile    
[INFO] | | \- org.javassist:javassist:jar:3.18.1-GA:compile         
[INFO] | \- com.fasterxml.jackson.core:jackson-databind:jar:2.6.1:compile      
[INFO] |  +- com.fasterxml.jackson.core:jackson-annotations:jar:2.6.1:compile    
[INFO] |  \- com.fasterxml.jackson.core:jackson-core:jar:2.6.1:compile      

[INFO] | +- org.slf4j:jcl-over-slf4j:jar:1.7.12:compile          
[INFO] | +- org.slf4j:jul-to-slf4j:jar:1.7.12:compile           
[INFO] | +- org.slf4j:log4j-over-slf4j:jar:1.7.12:compile          
[INFO] | +- org.slf4j:slf4j-api:jar:1.7.12:compile           
[INFO] | +- ch.qos.logback:logback-classic:jar:1.1.3:compile         
[INFO] | | \- ch.qos.logback:logback-core:jar:1.1.3:compile         
[INFO] | +- org.wicketstuff:wicketstuff-logback:jar:6.20.0:compile       
[INFO] | +- org.apache.commons:commons-lang3:jar:3.4:compile         
[INFO] | +- org.apache.commons:commons-collections4:jar:4.0:compile       
[INFO] | +- commons-io:commons-io:jar:2.4:compile            
[INFO] | +- commons-codec:commons-codec:jar:1.10:compile          
[INFO] | +- commons-beanutils:commons-beanutils:jar:1.9.2:compile        
[INFO] | | \- commons-collections:commons-collections:jar:3.2.1:compile      
[INFO] | \- com.google.guava:guava:jar:18.0:compile           
[INFO] +- junit:junit:jar:4.12:test               
[INFO] | \- org.hamcrest:hamcrest-core:jar:1.3:test           
[INFO] +- org.springframework:spring-test:jar:4.1.7.RELEASE:test        
[INFO] | \- org.springframework:spring-core:jar:4.1.7.RELEASE:compile       
[INFO] +- org.springframework:spring-web:jar:4.1.7.RELEASE:compile        
[INFO] | +- org.springframework:spring-aop:jar:4.1.7.RELEASE:compile       
[INFO] | | \- aopalliance:aopalliance:jar:1.0:compile          
[INFO] | +- org.springframework:spring-beans:jar:4.1.7.RELEASE:compile      
[INFO] | \- org.springframework:spring-context:jar:4.1.7.RELEASE:compile      
[INFO] |  \- org.springframework:spring-expression:jar:4.1.7.RELEASE:compile    
[INFO] \- javax:javaee-web-api:jar:7.0:provided 
+0

completa analisi dello stack? –

+0

Aggiunto traccia dello stack e albero delle dipendenze @ChristopherSchultz – vsampaio

+0

Hai copiato 'tomcat-juli.jar' dalla directory' conf/'di Tomcat alla directory' WEB-INF/lib' della tua applicazione web o in qualsiasi altro posto che potrebbe finire nella classe percorso della tua applicazione web? –

risposta

8

sembra che questo è causato da Jetty utilizzando un pacchetto Apache JSP modificato Jasp ER. Ha una sua versione di Juli logging (controlla lib/apache-jsp/org.mortbay.jasper.apache-jsp-8.0.27.jar nella directory home di Jetty) che sembra causare tutta la confusione. Penso che la webapp predefinita di Jetty class loading logic causi il caricamento di Juli LogFactory dalla tua webapp ogni volta che viene richiesta la classe. Va tutto bene e dandy quando lo LogFactory deve caricare le classi tomcat-jdbc. Diventa complicato quando vengono superate le classi Jasper modificate di Jetty, perché si rende conto che esistono conflitti di tipo.

Come si può risolvere questo? Penso che ci sono 2 modi per farlo:

1. Modificare Jetty logiche webapp classloader

È possibile modificare la logica di caricamento classe, di delegare sempre di classe di carico di caricamento classe genitore. Hai solo bisogno di chiamare setParentLoaderPriority(true) su particolare WebAppContext. Puoi farlo tramite la configurazione di Jetty o includendo il file jetty-web.xml con la tua guerra.

2. Esclusione tomcat-juli dipendenza

Utilizzando Maven di Dependency exclusions è possibile saltare qualsiasi dipendenza transitiva che non ti piace. Quindi includi semplicemente tomcat-jdbc senza tomcat-juli e il gioco è fatto.

L'unico problema è che entrambe le soluzioni ti obbligano a utilizzare il pacchetto Juli modificato di Jetty. Non ho ancora riscontrato un problema con questo scenario, ma a un certo punto potreste scoprire che mancano alcune funzionalità, perché il Juli modificato di Jetty non è stato sincronizzato con l'ultima versione di Apache.

+0

Solo una nota, se usi 'setParentLoaderPriority (true)' stai cambiando il comportamento del classloader della specifica servlet (prima webapp) al comportamento del classloader della specifica Java (genitore prima). Se la tua webapp si aspetta il comportamento delle specifiche Servlet, allora questo non è il modo corretto per risolvere questo problema. –

+0

Con il secondo apporach, i miei JUnits falliscono. –

14

La dipendenza dal web di avvio dell'avvio a molla includerà tomcat per impostazione predefinita. Questo confonderà jetty quando lo si avvia, poiché utilizza diverse versioni di juli lib.

semplicemente fissare nella vostra pom.xml, exlude il motorino di avviamento-gatto e comprendono separatamente la dipendenza pontile:

<dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
     <exclusions> 
      <exclusion> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-starter-tomcat</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-jetty</artifactId> 
    </dependency>