2010-01-14 7 views
6

J'ai the following problem (signalé par quelqu'un d'autre) lors de l'exécution de mon application d'entreprise sous Glassfish. Sous Jetty cela fonctionne bien. Mentionne la création d'une ressource META-INF/services/javax.xml.ws.spi.Provider, mais cela est déjà fourni avec CXF et la création d'un fichier de ressources supplémentaire ne résout pas ce problème sous Glassfish.Comment choisir CXF sur Metro sur Glassfish

Est-ce que quelqu'un sait comment s'assurer que CXF est récupéré sous GlassFish?
(J'utilise un projet Maven Multi-modules avec dépendance CXF 2.2.5)

Merci!
Tim


EDIT # 1

Skipping le problème pour l'instant et juste travailler avec Metro, mais je voudrais vraiment savoir comment utiliser CXF à la place si quelqu'un a des pointeurs .. Si rien ne fonctionne que je pourrais avoir à changer de conteneur d'applications Web (ou regarder en métro pour combler mes besoins)


EDIT # 2

Certaines des solutions détaillent le correctif pour war en ajoutant <class-loader delegate="false"/> au fichier sun-web.xml. Cependant, cela ne fonctionne pas pour les applications ee non-guerre.

+0

Je trouve la même question que d'un ejb emballé dans une oreille. J'ai ouvert une prime car j'aimerais vraiment entendre de bonnes réponses sans avoir à dupliquer la question, d'où mes modifications. – javamonkey79

+0

+1: Ceci est une mauvaise fonctionnalité de Glassfish que je suis actuellement confronté avec 'jsf': Glassfish a construit dans les bibliothèques jsf et ceux-ci génèrent des conflits sur un code ayant jsf dedans. Vraiment énervant et la solution vaut la prime qui est ouverte! Je veux absolument savoir aussi la solution! – mico

+0

Aussi [cet article] (http: //www.shareyourwork.org/roller/ralphsjavablog/entry/axiom_jar_conflict_in_glassfish) raconte comment les choses fonctionnent seulement dans certaines versions de Glassfish et dans d'autres. – mico

Répondre

1

Les bocaux Metro (Glassfish's JAX-WS implementation) sont probablement inclus avec Glassfish, pouvez-vous les exclure du classpath? Puisque vous utilisez maven, vous devez analyser les dépendances glassfish et utiliser une exclusion pour les jarres de métro. Il semble que vous ayez besoin des jarres CXF sur le chemin de classes d'applications avant les jarres Metro. Vous ne pouvez probablement pas modifier le classloader/classpath du système, mais vous pouvez modifier le Thread.currentThread().getContextClassLoader() de manière à charger CXF en premier. Il aussi pourrait un des paramètres classpath dans Glassfish vous pouvez modifier

Vérifiez la source javax.xml.ws.spi.FactoryFinder#find() pour voir comment le fournisseur est en fait chargé

+0

Cela pourrait très bien être le cas, mais je ne sais pas comment y remédier. C'est un .war compilé que je télécharge sur GlassFish, Maven exclut donc toujours un effet après la compilation? (C'est à dire: ces exclus seront-ils transmis à la guerre et utilisés sur le serveur?) – Tim

+0

Donc, le fait de prendre le fournisseur de Metro lorsque vous avez une application est déployé dans Glassfish, pas pendant le développement? – Kevin

+0

Le développement est fait avec Jetty .. Il n'y a pas de dépendance GlassFish à exclure .. – Tim

5

Ajouter un soleil web.xml et définissez délégué = false à la classe -loader:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE sun-web-app PUBLIC '-//Sun Microsystems, Inc.//DTD 
Application Server 9.0 Servlet 2.5//EN' 
'http://www.sun.com/software/appserver/dtds/sun-web-app_2_5-0.dtd'> 
<sun-web-app> 
    <class-loader delegate="false"/> 
</sun-web-app> 
+0

L'ajout de ce fichier au répertoire war web-inf a fonctionné pour moi. Merci! – sdoca

0

La solution que je suis venu avec (et je suis pas satisfait) est d'utiliser JaxWsProxyFactoryBean. Il y a un exemple [ici]. 1.

C'est le jist de ce que vous avez à faire:

public static void main(String args[]) throws Exception { 

    JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); 

    // I didn't need these next 2 calls, but I doubt they hurt 
    factory.getInInterceptors().add(new LoggingInInterceptor()); 
    factory.getOutInterceptors().add(new LoggingOutInterceptor()); 

    factory.setServiceClass(AuthService.class); 
    factory.setAddress("http://localhost:7001/authManager/services/cxfAuth"); 

    // 'AuthService' is whatever your interface type is 
    AuthService client = (AuthService) factory.create(); 

    Employee employee = client.getEmployee("0223938"); 
    System.out.println("Server said: " + employee.getLastName() + ", " + employee.getFirstName()); 
    System.exit(0); 

} 
+0

Pourriez-vous copier sur les parties pertinentes de la solution? Les liens externes ont tendance à se rompre avec le temps .. – Tim

+1

Oh, bien sûr. Bon appel. – javamonkey79

Questions connexes