2010-11-30 48 views
0

Lorsque vous essayez l'extrait suivant dans une application Grails 1.3.5 (vous pouvez le tester via la console) ...:problème de liaison avec Amazon AWS SDK Java et Grails

import com.amazonaws.services.ec2.model.* 
def ec2 = ctx.ec2Client 
def rir = new RunInstancesRequest("<some-ami-id>", 1, 1) 
Placement placement = new Placement() 
placement.setGroupName("<yourPlacementGroup>") 
rir.setPlacement(placement) 
rir.setKeyName("<yourKeyPairName>") 
RunInstancesResult result = ec2.runInstances(rir) 

je reçois la trace de la pile suivante :

Exception lancée

java.lang.LinkageError: loader constraint violation: when resolving field "NODE" the class loader (instance of org/codehaus/groovy/grails/cli/support/GrailsRootLoader) of the referring class, javax/xml/xpath/XPathConstants, and the class loader (instance of <bootloader>) for the field's resolved type, javax/xml/namespace/QName, have different Class objects for that type 
    at com.amazonaws.util.XpathUtils.asNode(XpathUtils.java:319) 
    at com.amazonaws.util.XpathUtils.evaluateAsString(XpathUtils.java:363) 
    at com.amazonaws.util.XpathUtils.asString(XpathUtils.java:120) 
    at com.amazonaws.transform.LegacyErrorUnmarshaller.parseErrorCode(LegacyErrorUnmarshaller.java:96) 
    at com.amazonaws.transform.LegacyErrorUnmarshaller.unmarshall(LegacyErrorUnmarshaller.java:62) 
    at com.amazonaws.transform.LegacyErrorUnmarshaller.unmarshall(LegacyErrorUnmarshaller.java:29) 
    at com.amazonaws.http.DefaultErrorResponseHandler.handle(DefaultErrorResponseHandler.java:76) 
    at com.amazonaws.http.DefaultErrorResponseHandler.handle(DefaultErrorResponseHandler.java:36) 
    at com.amazonaws.http.HttpClient.handleErrorResponse(HttpClient.java:508) 
    at com.amazonaws.http.HttpClient.execute(HttpClient.java:215) 
    at com.amazonaws.services.ec2.AmazonEC2Client.invoke(AmazonEC2Client.java:3804) 
    at com.amazonaws.services.ec2.AmazonEC2Client.runInstances(AmazonEC2Client.java:267) 
    at ConsoleScript2.run(ConsoleScript2:10) 

je suit dans mon BuildConfig.groovy:

runtime 'com.amazonaws:aws-java-sdk:1.1.0' 

Une idée de ce qui pourrait causer cela?

Répondre

0

Solution:
En BuildConfig.groovy, dans les dépendances secion, ajoutez:

runtime('com.amazonaws:aws-java-sdk:1.1.0'){ 
    excludes "stax-api" 
} 
runtime('stax:stax:1.2.0'){ 
    excludes "stax-api" 
} 

En effet, à la fois Stax 1.2.0 et l'amazone SKD ont une dépendance à l'égard Stax-api 1.0.1. Dans Java 1.6.0, l'API stax est déjà incluse dans les jres jre.

0

La réponse acceptée ci-dessus n'a pas fonctionné pour moi. J'ai fait l'ajustement à mon BuildConfig.groovy comme indiqué, mais l'erreur a persisté. Finalement, j'ai dû grep tous mes fichiers JAR à la recherche de javax/xml/namespace/QName et j'ai trouvé que jaxrpc.jar dans notre plugin PayPal interne avait l'inclusion de la classe errant. La bibliothèque JAX-RPC a depuis été mise à jour et après avoir mis à jour ce fichier JAR (qui n'inclut plus QName) tout a bien fonctionné. Donc juste le mentionner ici dans le cas où la solution ci-dessus ne fonctionne pas pour d'autres. Si ce n'est pas le cas, continuez à chercher - quelque part il y a un fichier JAR qui inclut QName, mais qui ne devrait pas.

+0

Merci ... mais le principe est le même, n'est-ce pas? Est-ce que vous venez de définir une exclusion différente dans votre BuildConfig.groovy? – Philippe

+0

Non, dans mon cas, j'ai simplement mis à jour ce JAR de dépendance vers une version plus récente qui ne contenait pas la classe QName. Il semble que cela ait causé des problèmes à d'autres personnes. – jondow