IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Servlets/JSP Java Discussion :

Servlet Tomcat problème chargement librairie


Sujet :

Servlets/JSP Java

  1. #1
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 57
    Points : 43
    Points
    43
    Par défaut Servlet Tomcat problème chargement librairie
    Bonjour,
    J'ai un servlet sout Tomcat qui est censé se connecter à SAP. Le connecteur se trouve dans la librairie sapjco.jar.
    Lorsque j'exécute ma classe java en ligne de commande, exemple:
    C:\java>java -classpath "c:\JCO\sapjco.jar;" Stat_Prix_SPR_Application
    J'arrive sans problème à me connecter à SAP.
    Sans problème... mais je dois malgré tout utiliser l'option - classpath "c:\JCO\sapjco.jar;".

    J'ai ensuite donc transformé ma classe java en servlet et tenté de le déployer sous Tomcat..
    Et lorsque j'essaie de lancer mon servlet, j'ai l'erreur "Could not initialize class com.sap.mw.jco.JCO"
    J'ai pourtant créé un répertoire lib dans le répertoire WEB-INF qui contient ma librairie "sapjco.jar". Que dois-je faire pour pouvoir inclure ma librairie dans mon servlet.

    De plus, pour se connecter à SAP, on peut faire un fichier de login Style login.properties ou mettre directement le login dans la commande de connection.
    Lorsque j'essaie d'inclure le fichier de connection, je n'arrive pas, le servlet n'arrive pas à le lire(il ne le trouve pas). J'ai mis le fichier de connection dans le même répertoire que mes classes.

    Quelqu'un pourrait-il m'aider.. Je suis novice en java..
    D'avance merci.
    Vl@d

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Vlacar Voir le message

    J'ai ensuite donc transformé ma classe java en servlet et tenté de le déployer sous Tomcat..
    Et lorsque j'essaie de lancer mon servlet, j'ai l'erreur "Could not initialize class com.sap.mw.jco.JCO"
    le could not initialize signifie qu'il y a eu, dans la classes com.sap.mw.jco.JCO, un exception lors de l'initialization de blocs statiques. C'est probablement les valeurs par défauts de certains champs statiques qui posent problème et génère des exception. Regarde en avant dans les logs, tu devrais avoir le stacktrace de l'exception qui s'est produite lors du chargement de la classe. Lorsqu'une exception se produit au chargement d'une classe, java n'essaie plus de la charger par la suite et la marque simplement comme invalide.

    Exemple de code pouvant provoquer ce problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private static Map maMap;
    private static int mapSize=maMap.size();

    Que dois-je faire pour pouvoir inclure ma librairie dans mon servlet.
    Dans WEB-INF/lib, çà c'est correct

    De plus, pour se connecter à SAP, on peut faire un fichier de login Style login.properties ou mettre directement le login dans la commande de connection.
    En version webapp, tout dépend de comment ta librairie récupère le fichier. Si elle passe pas Class.getResource(), tu peux le mettre sans problème dans WEB-INF/classes/. Si elle pass par new File(), c'est mal barré, car le "répertoire par défaut" de File n'est pas précisé dans les spécification J2EE et tu peux donc atterrir n'importe ou...


    Quelqu'un pourrait-il m'aider.. Je suis novice en java..
    Le prend pas mal, mais étant novice en java, c'est pas un peu tôt pour s'attaquer à du java enterprise et des webapps? Tu risque de patauger encore quelques mois, il faut bien çà pour commencer à maitriser toutes les technologies impliquées par le java enterprise...

  3. #3
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 57
    Points : 43
    Points
    43
    Par défaut
    Tout d'abord, merci pour ta réponse extrêmement rapide.

    L'erreur exacte est la suivante:
    java.lang.NoClassDefFoundError: Could not initialize class com.sap.mw.jco.JCO
    Stat_Prix_SPR.GetStat_Prix_SPR(Stat_Prix_SPR.java:40)
    Stat_Prix_SPR_Application.doGet(Stat_Prix_SPR_Application.java:37)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

    Lorsque je n'utilise pas les servlets, il n'y a aucun problème.. Bon en lisant correctement je m'en rends compte d'où vient le problème..

    Bon j'ai l'impression que si je mets ou non la librairie dans le répertoire lib, ça ne change rien au message d'erreur!!

    Voici le code de mon applis
    import java.math.*;
    import com.sap.mw.jco.*;

    /**
    * Class to get Status and Prices for SPR.
    *
    * @author Vladimir, Luca
    * @version 1.00 21/september/2007
    */


    class Stat_Prix_SPR {

    // Declare the instance variables for the IMPORT parameters of the function Z_STAT_PRIX.
    public String I_MATNR;
    public BigDecimal I_GAMNG;
    public String I_KUNNR;
    public String I_KONWA;

    // Declare the instance variables for the EXPORT parameters of the function Z_STAT_PRIX.
    public String I_STATUT;
    public BigDecimal I_KBETR;
    public String I_CODE_RET;

    // Method to call the SAP function module through JCO.
    public void GetStat_Prix_SPR() {

    // The JCO is initialized and the program can use the different SAP objects
    try {

    // Get the properties for the JCO connection.
    //Properties mylogin_properties = new Properties();
    //mylogin_properties.load(new FileInputStream("./login.properties"));

    // Create a client connection to a dedicated SAP system.
    //JCO.Client myclient = JCO.createClient(mylogin_properties);
    JCO.Client myclient = JCO.createClient("mandant","user","passwd","langue","server_appli","sytem-_num");

    // Create a new SAP repository for this client.
    IRepository myrepository = JCO.createRepository("MYRepository", myclient);

    // Open the connection to the SAP system.
    myclient.connect();

    // Load the function interface from the SAP repository into the JCO reposotory
    IFunctionTemplate myftemplateA = myrepository.getFunctionTemplate("Z_STAT_PRIX");

    // The function interfaces has been successfully loaded
    if (myftemplateA != null) {

    // Create a function Z_STAT_PRIX from the template.
    JCO.Function myfunctionA = myftemplateA.getFunction();

    // Set the IMPORT parameters of the function Z_STAT_PRIX from the object variables.
    JCO.Field myfieldI1 = myfunctionA.getImportParameterList().getField("I_MATNR");
    myfieldI1.setValue(I_MATNR);
    JCO.Field myfieldI2 = myfunctionA.getImportParameterList().getField("I_GAMNG");
    myfieldI2.setValue(I_GAMNG);
    JCO.Field myfieldI3 = myfunctionA.getImportParameterList().getField("I_KUNNR");
    myfieldI3.setValue(I_KUNNR);
    JCO.Field myfieldI4 = myfunctionA.getImportParameterList().getField("I_KONWA");
    myfieldI4.setValue(I_KONWA);

    // We can call the SAP function module Z_STAT_PRIX.
    myclient.execute(myfunctionA);

    // Get the EXPORT parameters of the function Z_STAT_PRIX into the object variables.
    JCO.Field myfieldE1 = myfunctionA.getExportParameterList().getField("I_STATUT");
    I_STATUT = myfieldE1.getString();
    JCO.Field myfieldE2 = myfunctionA.getExportParameterList().getField("I_KBETR");
    I_KBETR = myfieldE2.getBigDecimal();
    JCO.Field myfieldE3 = myfunctionA.getExportParameterList().getField("I_CODE_RET");
    I_CODE_RET = myfieldE3.getString();

    }

    else {
    System.out.println("The function Z_STAT_PRIX cannot be loaded from the SAP system.");
    }

    // Close the SAP connection and free the JCO client.
    myclient.disconnect();
    myclient = null;

    }

    catch (Exception ex) {
    System.out.println("Caught an exception: \n" + ex);
    }

    }

    }




    Ma fonction est effectivement un new FileInputStream("./login.properties");

    Je me suis pas bien exprimé.
    Je suis pas exactement novice en programmation. 4 ans d'expériences(7 avec mes études) et j'ai fait mes études en C++. Je ne suis pas surpris de la syntaxe de java et du moment que je reste dans du java classique je n'ai aucun problème. Mais c'est évident que je nage complètement(car je débute) avec Tomcat et les servlets.. Je suis 100% d'accord avec ta remarque. C'est ambitieux de ma part de vouloir allez si vite..

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Sauf erreur de ma part, ta classe est bien lue par le classloader, et l'exception que tu donne n'est pas la cause mais la conséquence d'une autre erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.lang.NoClassDefFoundError:
    Ca dit "classe pas disponible" mais ce qui compte c'est la raison:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Could not initialize class com.sap.mw.jco.JCO
    Ca dit que l'initialization de la classe a foiré. La classe com.sap.mw.jco.JCO est là, son byte code a été chargé par le classloader mais pour une raison ou une autre, elle n'a pas pu être passé dans l'état "initializée". Les raisons sont diverses

    • Exception lors de l'initialization d'un champ statique (NullPointerException, NoClassDefFoundError sur une autre classe)
    • Dépendance (extends, implements) à une autre classe qui n'est pas dans le classpath
    • Si c'est une classe "native" dépendance à une dll/.so qui n'a pas pu être chargée

    Ces problèmes sont dans "com.sap.mw.jco.JCO" et pas dans ton code à toi!

    Si ta classe n'avais juste pas été présente, tu aurais eu ceci:
    java.lang.NoClassDefFoundError: com.sap.mw.jco.JCO
    Sans la partie "could not initialize".


    Donc, je te suggère de regarder tes logs de tomcat (fichier catalina.out).
    Avant le premier "Could not initialize class com.sap.mw.jco.JCO" tu devrais trouver la cause mère qui fait que com.sap.mw.jco.JCO foire son initialization.

  5. #5
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 57
    Points : 43
    Points
    43
    Par défaut
    Merci mille fois..
    J'ai compris ce qu'il manquait grâce à tes remarques..

    Le connecteur Java pour SAP requiert non seulement la libraire .jar nommé sapjco.jar mais également les 2 dll suivantes: librfc32.dll et sapjcorfc.dll.

    J'avais oublié d'importer ces 2 dll.

    Maintenant tout fonctionne à merveille.
    Merci bcp..

    Ceci explique également pourquoi le message d'erreur était le même avec ou sans la librairie sapjco.jar.

    Encore merci.

  6. #6
    Membre habitué Avatar de TheBlue
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 167
    Points : 147
    Points
    147
    Par défaut
    Bonjour.
    Vlacar > Comment tu as fait pour ajouter les .dll au projet ?
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. tomcat eclipse chargement de servlet-api.jar
    Par khaniang dans le forum Tomcat et TomEE
    Réponses: 0
    Dernier message: 08/05/2010, 03h41
  2. Problème chargement de librairie
    Par ArnaudDev dans le forum Windows
    Réponses: 15
    Dernier message: 09/06/2008, 16h56
  3. [TOMCAT] Problème de timeout d'une servlet
    Par tuxor dans le forum Tomcat et TomEE
    Réponses: 5
    Dernier message: 18/09/2007, 12h04
  4. [Tomcat] problème requête client vers servlet
    Par danyboy85 dans le forum Tomcat et TomEE
    Réponses: 14
    Dernier message: 30/01/2006, 09h53
  5. [Tomcat] Problème pour accéder à une servlet
    Par david71 dans le forum Tomcat et TomEE
    Réponses: 9
    Dernier message: 08/04/2005, 13h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo