Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[JDOM] problème avec SAXBuilder

23 réponses
Avatar
sylsau
Bonjour,

Mon probl=E8me est une peu particulier dans la mesure o=F9 il concerne
plusieurs domaines mais =E9tant donn=E9 que le vrai probl=E8me semble
venir de la classe SAXBuilder de l'API JDOM je pense qu'il a sa place
dans ce forum.
J'ai donc fait un programme JAVA qui prend en entr=E9e un fichier XML et
qui va dans un premier temps parser ce fichier, puis faire des
traitements sur les donn=E9es pars=E9es avant de finalement cr=E9er un
nouveau fichier XML r=E9sultat de ce traitement.

Ce programme fonctionne tr=E8s bien dans la console. Pour l'application
que je d=E9veloppe j'ai besoin de passer par php sur un serveur Apache2
donc pour utiliser le programme JAVA.

J'ai donc dans mon programme PHP utilis=E9 la fonction system("java
monProgramme donnees.xml", $retval); qui ex=E9cute la commande pass=E9e
en param=E8tre dans un shell. J'ai bien v=E9rifi=E9 que l'utilisateur sur
lequel tourne le serveur Apache2 a les droits n=E9cessaires, et que le
CLASSPATH et le PATH soient bien configur=E9s. D'ailleurs lorsque
j'=E9x=E9cute mon programme JAVA en mode console en =E9tant loggu=E9 sous
cet utilisateur tout marche bien.

Et l=E0, bizarrement quand j'ex=E9cute le programme, il y a un probl=E8me.
Apr=E8s pas mal de temps de recherche je suis arriv=E9 =E0 isoler ce qui
emp=EAchait le programme de fonctionner et apparemment cela viendrait de
la ligne suivante dans le programme JAVA :

[CODE]
SAXBuilder sxb =3D new SAXBuilder();
[/CODE]

J'ai r=E9duit au maximum mon programme pour ne laisser plus que =E7a dans
la classe principale du programme :

[CODE]
public ParseurDOM()
{
SAXBuilder sxb =3D new SAXBuilder();
System.out.println("Test");
}
[/CODE]

En ex=E9cutant le programme JAVA depuis PHP avec =E7a dans la classe
principale, j'ai un retour d'ex=E9cution =E0 1 qui indique qu'il y a une
erreur (qui ne peut donc venir que du constructeur SAXBuilder) et
l'affichage de la ligne "Test" ne se fait pas.

En enlevant l'appel au constructeur SAXBuilder(), j'ai bien l'affichage
de la ligne "Test". Le probl=E8me se situe donc dans le constructeur
SAXBuilder().

J'ai donc =E9t=E9 voir dans les sources de JDOM dans la classe SAXBuilder
et je ne vois rien de sp=E9cial en fait. Lors de l'instanciation, il y a
juste une instanciation de la classe DefaultJDOMFactory dont le
constructeur ne fait rien !

Donc, je ne vois vraiment pas d'o=F9 =E7a peut venir =E0 ce niveau l=E0, je
pensais =E0 un probl=E8me de localisation du driver SAX utilis=E9 par
SAXBuilder mais m=EAme en changeant et en mettant dans le constructeur
SAXBuilder() un driver SAX valide : org.apache.xerces.parsers.SAXParser
par exemple (et en modifiant le classpath), le probl=E8me reste le
m=EAme.

J'ai m=EAme tent=E9 d'utiliser d'autres API du m=EAme genre comme DOM4J ou
autres mais =E7a bloque toujours au m=EAme niveau lorsque l'on cr=E9e une
instance de la classe cherchant les drivers SAX apparemment.


Quelqu'un aurait une id=E9e de ce que je peux faire ? Peut-=EAtre
modifier des options dans Apache2 (je ne vois pas trop ce que je peux
modifier de plus en fait)? Modifier un chemin d'acc=E8s ? Ou peut =EAtre
cela ne peut pas se faire et =E7a ne marchera pas ?

Merci d'avance de votre aide.

10 réponses

1 2 3
Avatar
alexandre cartapanis
Bonjour,

Mon problème est une peu particulier dans la mesure où il concerne
plusieurs domaines mais étant donné que le vrai problème semble
venir de la classe SAXBuilder de l'API JDOM je pense qu'il a sa place
dans ce forum.
J'ai donc fait un programme JAVA qui prend en entrée un fichier XML e t
qui va dans un premier temps parser ce fichier, puis faire des
traitements sur les données parsées avant de finalement créer un
nouveau fichier XML résultat de ce traitement.

Ce programme fonctionne très bien dans la console. Pour l'application
que je développe j'ai besoin de passer par php sur un serveur Apache2
donc pour utiliser le programme JAVA.

J'ai donc dans mon programme PHP utilisé la fonction system("java
monProgramme donnees.xml", $retval); qui exécute la commande passé e
en paramètre dans un shell. J'ai bien vérifié que l'utilisateur s ur
lequel tourne le serveur Apache2 a les droits nécessaires, et que le
CLASSPATH et le PATH soient bien configurés. D'ailleurs lorsque
j'éxécute mon programme JAVA en mode console en étant loggué so us
cet utilisateur tout marche bien.

Et là, bizarrement quand j'exécute le programme, il y a un problè me.
Après pas mal de temps de recherche je suis arrivé à isoler ce qu i
empêchait le programme de fonctionner et apparemment cela viendrait d e
la ligne suivante dans le programme JAVA :

[CODE]
SAXBuilder sxb = new SAXBuilder();
[/CODE]

J'ai réduit au maximum mon programme pour ne laisser plus que ça da ns
la classe principale du programme :

[CODE]
public ParseurDOM()
{
SAXBuilder sxb = new SAXBuilder();
System.out.println("Test");
}
[/CODE]

En exécutant le programme JAVA depuis PHP avec ça dans la classe
principale, j'ai un retour d'exécution à 1 qui indique qu'il y a un e
erreur (qui ne peut donc venir que du constructeur SAXBuilder) et
l'affichage de la ligne "Test" ne se fait pas.

En enlevant l'appel au constructeur SAXBuilder(), j'ai bien l'affichage
de la ligne "Test". Le problème se situe donc dans le constructeur
SAXBuilder().

J'ai donc été voir dans les sources de JDOM dans la classe SAXBuild er
et je ne vois rien de spécial en fait. Lors de l'instanciation, il y a
juste une instanciation de la classe DefaultJDOMFactory dont le
constructeur ne fait rien !

Donc, je ne vois vraiment pas d'où ça peut venir à ce niveau là , je
pensais à un problème de localisation du driver SAX utilisé par
SAXBuilder mais même en changeant et en mettant dans le constructeur
SAXBuilder() un driver SAX valide : org.apache.xerces.parsers.SAXParser
par exemple (et en modifiant le classpath), le problème reste le
même.

J'ai même tenté d'utiliser d'autres API du même genre comme DOM4J ou
autres mais ça bloque toujours au même niveau lorsque l'on crée u ne
instance de la classe cherchant les drivers SAX apparemment.


Quelqu'un aurait une idée de ce que je peux faire ? Peut-être
modifier des options dans Apache2 (je ne vois pas trop ce que je peux
modifier de plus en fait)? Modifier un chemin d'accès ? Ou peut êtr e
cela ne peut pas se faire et ça ne marchera pas ?

Merci d'avance de votre aide.



Heu est-ce que les librairies nécessaires sont bien dans ton classpath?
Que ce soit JDom ou Dom4j, il faut que les jar soit accessible...

--
Alexandre CARTAPANIS - Responsable Système et Réseau
Email
Gsm. 06 72 07 51 55

Macymed SARL - 9 bvd Kraëmer 13014 Marseille France
Tél. 04 91 48 31 58 - Fax. 04 91 02 36 47
Web http://www.macymed.fr - Email

Avatar
sylsau
Oui, j'ai bien mis les chemins vers les jar dans le CLASSPATH.
Et j'ai bien vérifié que l'utilisateur sur lequel tourne Apache
(www-data) donc l'utilisateur qui va exécuter le script ait bien le
bon CLASSPATH et c'est le cas.
Dans le CLASSPATH, j'ai ça :

:/usr/share/java/jdom.jar:/usr/share/java/dom4j-1.6.1.jar


Et puis lorsque j'exécute le programme java en tant que www-data, tout
se passe correctement donc il a accès normalement à ces jar.
Avatar
alexandre cartapanis
Oui, j'ai bien mis les chemins vers les jar dans le CLASSPATH.
Et j'ai bien vérifié que l'utilisateur sur lequel tourne Apache
(www-data) donc l'utilisateur qui va exécuter le script ait bien le
bon CLASSPATH et c'est le cas.
Dans le CLASSPATH, j'ai ça :

:/usr/share/java/jdom.jar:/usr/share/java/dom4j-1.6.1.jar


Et puis lorsque j'exécute le programme java en tant que www-data, tou t
se passe correctement donc il a accès normalement à ces jar.



Et tu ne peux pas récupérer la sortie, via system.out ou quoi? Ca
t'aiderais quand même a connaître l'erreur...

--
Alexandre CARTAPANIS - Responsable Système et Réseau
Email
Gsm. 06 72 07 51 55

Macymed SARL - 9 bvd Kraëmer 13014 Marseille France
Tél. 04 91 48 31 58 - Fax. 04 91 02 36 47
Web http://www.macymed.fr - Email

Avatar
David JOURAND
Bonjour,

Il faut déterminer la nature de l'erreur. Que donne la sortie de :

[CODE]
public ParseurDOM()
{


try {

SAXBuilder sxb = new SAXBuilder();
System.out.println("Test");


} catch (Exception e) {
e.printStackTrace();
}

}
[/CODE]



--
David Jourand

Avatar
Alberto Cabello Sanchez
sylsau wrote:
Oui, j'ai bien mis les chemins vers les jar dans le CLASSPATH.
Et j'ai bien vérifié que l'utilisateur sur lequel tourne Apache
(www-data) donc l'utilisateur qui va exécuter le script ait bien le
bon CLASSPATH et c'est le cas.


Tu peut aussi exécuter avec

system("java -cp /usr/share/java/jdom.jar monProgramme donnees.xml",
$retval);

au lieu de

system("java monProgramme donnees.xml", $retval);

pour t'en rassurer.

Avatar
sylsau
j'ai essayé en rajoutant le classpath de jdom en lançant le programme
java mais ça ne change rien.

Je viens d'essayer avec le try catch. Ca ne me renvoie rien c'est ça
le pire ! Il y a pourtant une erreur puisque le code de retour du
programme java est 1 mais rien ne s'affiche dans le catch. Ca aide pas
pour trouver d'où vient le problème
Avatar
sylsau
Voici les deux programmes que j'utilises :

- le programme java (réduit au minimum ici)

import org.jdom.*;
import org.jdom.input.*;


public class JDOM3
{
static org.jdom.Document document;
static Element racine;

public static void main(String[] args)
{
//On crée une instance de SAXBuilder
try{

SAXBuilder sxb = new SAXBuilder();
System.out.println("test");


}catch(Exception e){

e.printStackTrace();
}

}
}


- le programme php

<?php

$line = system("/usr/bin/java -cp /usr/share/java/jdom.jar JDOM3",
$retval);
echo"Statut : ".$retval;

?>


- Et la librairie JDOM : http://www.jdom.org/dist/binary/jdom-1.0.zip
Il suffit de prendre l'archive jdom.jar se trouvant dans le dossier
build une fois l'archive zip décompressée. Et ensuite d'ajouter au
classpath jdom.jar


Si quelqu'un a le temps d'essayer sur son serveur perso, ça serait
sympa pour voir si ça marche chez quelqu'un (auquel cas voir la
configuration qu'il a comparé à moi) au moins.

Merci d'avance.
Avatar
David JOURAND
Je viens d'essayer avec le try catch. Ca ne me renvoie rien c'est ça
le pire ! Il y a pourtant une erreur puisque le code de retour du
programme java est 1 mais rien ne s'affiche dans le catch. Ca aide pas
pour trouver d'où vient le problème


C'est sans doute une Error qui est lancée... Il faut donc remplacer :

} catch (Exception e) {

par :

} catch (Throwable e) {

et voir ce que cela donne...

--
David Jourand

Avatar
sylsau
Je viens d'essayer avec Throwable et toujours pas d'affichage d'un
quelconque message d'erreur.
Avatar
alexandre cartapanis
Je viens d'essayer avec Throwable et toujours pas d'affichage d'un
quelconque message d'erreur.



Ouais mais ça c'est normal, PHP ne peut récupérer que la valeur de
retour, pas la sortie "texte".
Ce que tu peux faire, c'est de rediriger la sortie dans un fichier.
Par exemple:

try {
//code a problème...
} catch (Exception excp) {
PrintStream out = new PrintStream("/var/log/test");
excp.printStackTrace(out);
out.close();
}


tu exécutes ton code en PHP, et normalement, dans le fichier
/var/log/test, tu dois avoir l'erreur.


Une autre solution, c'est de recuperer la totalité de ta sortie dans le
fichier.

En faisant (en tout premier, ça doit être la première instruction d u
main par exemple):

PrintStream out = new PrintStream("/var/log/test");
System.setOut(out);
System.setErr(out);

Et laisser ton excp.printStackTrace(); (qui est automatiquement redirigé
vers System.out).

--
Alexandre CARTAPANIS - Responsable Système et Réseau
Email
Gsm. 06 72 07 51 55

Macymed SARL - 9 bvd Kraëmer 13014 Marseille France
Tél. 04 91 48 31 58 - Fax. 04 91 02 36 47
Web http://www.macymed.fr - Email

1 2 3