2015-07-14 11 views
6

Ho Jenkins 1.613 in esecuzione su WebLogic 12c e anche su JBoss EAP 6.3. Sono riuscito a far funzionare il plugin email-ext di Jenkins su JBoss. Tuttavia, ogni volta che utilizzo i token come $ PROJECT_NAME, il plugin email-ext fallisce su WebLogic (funziona perfettamente su JBoss, dovrei sottolineare ancora).LinkageError with Jenkins on WebLogic

Ottengo il seguente stacktrace che sembra indicare alcuni problemi con il plugin tokenmacro.

java.lang.LinkageError: loader constraint violation: when resolving method 
"com.google.common.collect.Multimaps.newListMultimap(java/util/Map; com/google/common/base/Supplier;) com/google/common/collect/ListMultimap;" 

the class loader (instance of hudson/ClassicPluginStrategy$AntClassLoader2) of the current class, org/jenkinsci/plugins/tokenmacro/Tokenizer, 

and the class loader (instance of sun/misc/Launcher$AppClassLoader) for resolved class, com/google/common/collect/Multimaps, 

have different Class objects for the type ap; com/google/common/base/Supplier;) com/google/common/collect/ListMultimap; used in signature 

at org.jenkinsci.plugins.tokenmacro.Tokenizer.find(Tokenizer.java:109) 
at org.jenkinsci.plugins.tokenmacro.TokenMacro.expand(TokenMacro.java:167) 
at org.jenkinsci.plugins.tokenmacro.TokenMacro.expandAll(TokenMacro.java:233) 
at hudson.plugins.emailext.plugins.ContentBuilder.transformText(ContentBuilder.java:71) 
at hudson.plugins.emailext.ExtendedEmailPublisher.setSubject(ExtendedEmailPublisher.java:659) 

Domande:

  1. in base alla mia comprensione di questa traccia, il problema è che ci sono contrastanti copie della classe Multimaps che sono stati caricati? È giusto?
  2. Perché dovrebbero essere coinvolti più programmi di caricamento classi (AntClassLoader2 e AppClassLoader)? Non dovrebbe essere il caso che, una volta che il classloader trova la classe richiesta, semplicemente "restituisce" quella classe e delega il classloading ai classloader genitori solo quando non trova la classe?
  3. Perché la mia configurazione funziona in JBoss ma non in WebLogic?
  4. Cosa si può fare per risolvere questo problema? Ho provato a collocare Guava 11 nel WEB-INF della directory dei plugin tokenmacro, ma non aiuta. Ho anche provato lo stesso con Guava 13.

Ulteriori informazioni che potrebbero essere utili:

  • Token versione Macro Plugin installata è 1,10
  • Email versione Plugin estensione installata è 2.40.5
  • Nel mio jenkins.war, ho un file weblogic.xml dove wls: prefer-web-inf-classes è impostato su true.
+0

Domanda inattesa: Jenkins può essere eseguito standalone- perché non utilizzare questa funzione? – Jayan

risposta

3

1.) Assumerei lo stesso.

2.a (più classloader): esistono classload speciali in contenitori di applicazioni come JBoss. Servono per separare le classi in diverse applicazioni. Dovresti essere in grado di utilizzare qualsiasi versione di una classe nella tua applicazione indipendentemente dalla versione utilizzata in una diversa applicazione.

Pertanto, due classi sono considerate diverse se hanno lo stesso nome ma diversi classloader.

I problemi si verificano quando due applicazioni diventano "in contatto" o le classi vengono fornite dal contenitore. Direi che il problema è che Guava viene fornito da WebLogic.

Inoltre, Jenkins è una sorta di contenitore dell'applicazione stesso, deve separare plug-in diversi, quindi AntClassLoader2.

2b (Delega classloader): in genere è solo il contrario: chiedi sempre al classloader genitore, se non riesce a trovare la classe, prova a cercarlo da solo. Ma l'intera storia è molto più complessa (per avere un'idea vedi https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html, forse c'è anche qualche documentazione simile per WebLogic).

3) Come prima ipotesi, vorrei verificare se WebLogic (come è configurata l'istanza) fornisce Guava.

4) Vorrei provare a isolare il problema e renderlo riproducibile scrivendo una piccola webapp che utilizza il Fornitore. Forse dovrei cercare e leggere la documentazione su come viene gestito il caricamento di classe in WebLogic.

1

Sono in grado di testare l'e-mail ext tempate ma non in grado di inviare.

+0

per favore modifica la tua domanda. – Jayan

0

Si dovrebbe forzare il caricamento delle classi di applicazioni prima che le classi Weblogic si potrebbe raggiungere questo obiettivo facendolo passare utilizzando la direttiva preferirebbero-Application-pacchetti come descritto qui: http://docs.oracle.com/cd/E24329_01/web.1211/e21049/weblogic_xml.htm#WBAPP592

Questo è un esempio estratto da uno della mia applicazione di produzione: file inserito all'interno del pacchetto EAR a application/META-INF/weblogic-application.xml

<?xml version="1.0" encoding="UTF-8"?> 
<weblogic-application xmlns="http://xmlns.oracle.com/weblogic/weblogic-application" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/javaee_5.xsd http://xmlns.oracle.com/weblogic/weblogic-application http://xmlns.oracle.com/weblogic/weblogic-application/1.0/weblogic-application.xsd"> 
    <classloader-structure> 
     <module-ref> 
      <module-uri>j2ee-connector.rar</module-uri> 
     </module-ref> 
     <module-ref> 
      <module-uri>ejb-1.0-SNAPSHOT.jar</module-uri> 
     </module-ref> 
    </classloader-structure> 
    <prefer-application-packages> 
     <package-name>org.slf4j.*</package-name> 
     <package-name>org.apache.commons.logging.*</package-name> 
     <package-name>org.apache.commons.io.*</package-name> 
     <package-name>ch.qos.logback.*</package-name> 
    </prefer-application-packages> 
    <prefer-application-resources> 
     <resource-name>org/slf4j/impl/StaticLoggerBinder.class</resource-name> 
    </prefer-application-resources> 
</weblogic-application> 

la parte rilevante qui è la preferire-application-pacchetti e, facoltativamente, preferire-ap risorse di plicazione (a seconda di come si sta comportando il codice).

messo lì com.google.common. *

So che Jenkins è una guerra normale e non un orecchio Così si potrebbe assamble un progetto Maven che includono la guerra e che definiscono come caricare i pacchetti all'interno l'orecchio o guarda la documentazione e modifica direttamente i descrittori di guerra usando weblogic.xml e le prefer-web-inf-class documentate e impostalo su true.