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

Entrée/Sortie Java Discussion :

JNI ou pas, mais transparent


Sujet :

Entrée/Sortie Java

  1. #21
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par ToTo13 Voir le message
    ... que l'url ne soit pas déjà dans le classpath, ne serait il pas équivalent de simplement faire "URLClassLoader ucl = new URLClassLoader(new URL[]{url} )" ?
    Ça, ça créé un nouveau classloader indépendant du classloader système. On peut le faire, mais un new ne fonctionnera pas, parce que le classloader système ne connaitra pas cet url, donc ne trouveras pas la classe. Pour instancier la classe, il faudra la charger par ucl.loadClass() qui te renveras une instance de Class, sur laquelle tu pourras faire un newInstance() pour l'instancier. Une autre solution serait de faire un classloader personalisé (à base d'URLClassLoader, mais en gérant soit-même ce que fait le system classloader(!)) et de lancer l'application avec ce classloader (java -Djava.system.class.loader=la classe de classloader personalisée...).

  2. #22
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Addendum : j'ai aussi essayé en changeant le classloader du contexte (Thread.currentThread().setContextClassLoader()), mais ça ne fonctionnait pas d'une part (peut-être pour la même raison qu'actuellement, puisque je n'ai testé qu'avec les jars embarqués — cependant entre temps, m'est venue une petite idée de la raison que je testerai peut-être ce soir), mais aussi parce qu'on ne modifie que le classloader du thread courant (donc, potentiellement, on aura des problèmes sur d'autres threads).

  3. #23
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    J'ai utilisé ce code :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    	String jar = "monjar.jar" ;
    	URLClassLoader ucl = (URLClassLoader) ClassLoader.getSystemClassLoader() ;
    	Class<?> sysclass = URLClassLoader.class;
     
    	try {
    		Method method = sysclass.getDeclaredMethod("addURL", new Class<?>[]{URL.class}) ;
    		method.setAccessible(true) ;
    		method.invoke(ucl, new Object[]{new URL("jar", "", jar)}) ;
    		}
    	catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e)
    		{
    		e.printStackTrace() ;
    		System.err.println("Error, could not add URL to system class loader") ;
    		System.exit(-1) ;
    		}

    Tout ce passe bien alors que ça ne devrait pas, car monjar.jar n'existe pas.
    Du coup lorsque j'appelle l'une des méthodes qui aurait dû être chargée, j'ai très logiquement une java.lang.NoClassDefFoundError
    Une idée pourquoi je n'ai pas d'erreur ?

  4. #24
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par ToTo13 Voir le message
    Une idée pourquoi je n'ai pas d'erreur ?
    Oui, il n'y a pas d'erreur lorsqu'on donne une url qui référence un fichier qui n'existe pas. Comme quand on fait un java -cp .;machin.jar toto et que machin.jar n'existe pas.

  5. #25
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Ok, tout fonctionne très bien sur le principe, sauf un petit détail.

    Je construit jar avec NetBeans et pour pouvoir compilé correctement il faut que j'indique l'un des deux jar (natif ou non). Du coup son nom se retrouve automatiquement dans le classpath et par conséquent il est chargé au lancement.

    Est ce qu'il est possible de préciser à NetBeans de ne pas lister un jar ?
    Ou est ce que l'on peut modifier le classpath d'un jar une fois que celui-ci a été construit/compilé ?

  6. #26
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Personnellement, pour faire le test, j'ai simplement modifié le manifest pour virer le jar dans la classpath. Je ne sais pas si on peut paramétrer NetBeans pour que le jar ne soit pas inclus dans la classpath, mais on doit pouvoir faire une task ant pour automatiser ça.

  7. #27
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Oui, mais le manifest est dans le jar ! Comment est ce que tu peux le modifier ?

    L'idéal serait de la faire avant la construction du jar.

  8. #28
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par ToTo13 Voir le message
    Oui, mais le manifest est dans le jar ! Comment est ce que tu peux le modifier ?
    Je l'ai fait avec 7z : tu ouvres le jar, et tu édites le manifest avec la fonction Editer, dans la propriété Class-Path Class-Path: .
    Citation Envoyé par ToTo13 Voir le message
    L'idéal serait de la faire avant la construction du jar.
    Certes. Mais je n'utilise pas NetBeans pour développeer (seulement pour profiler) , donc je ne sais pas si c'est possible de le faire dans NetBeans. La création du jar dans NetBeans ne modifie-t-elle pas le build.xml qu'il y a dans le project ? Il suffirait alors de modifier le build.xml pour faire une build spécifique. Sinon, il faut l'écrire complètement.

  9. #29
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    N'importe quel soft de décompression fait le boulot pour décompresser, puis il suffit juste d'utiliser "jar", via la commande : jar -cmf META-INF/MANIFEST.MF monjar.jar *

    Malheureusement, je m'aperçois maintenant que mon code ne charge pas du tout le fichier jar :-(
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    String jar = "lib/Core" + (CallNative ? "Native" : "") + ".jar" ;
    if ( new File(jar).exists() )
    	{
    	URLClassLoader ucl = (URLClassLoader) ClassLoader.getSystemClassLoader() ;
    	Class<?> sysclass = URLClassLoader.class ;
    	Method method = sysclass.getDeclaredMethod("addURL", new Class<?>[]{URL.class}) ;
    	method.setAccessible(true) ;
    	method.invoke(ucl, new Object[]{new URL("jar", "", jar)}) ;
    	}

    Le jar existe et je n'ai aucune erreur au chargement.
    Mais lorsque j'appelle une classe qu'il contient, j'ai une magnifique java.lang.NoClassDefFoundError :-(

  10. #30
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Là, ton jar est un fichier, donc il faut que tu crées l'URL avec le protocole file, par jar.

    Ou tout simplement : file.toURI().toURL()

  11. #31
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Merci infiniment, tout fonctionne parfaitement !!!

    Par ailleurs, je viens de trouver cela à l'instant et ça semble faire la même chose : JCL.

  12. #32
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par ToTo13 Voir le message
    Merci infiniment, tout fonctionne parfaitement !!!


    Citation Envoyé par ToTo13 Voir le message
    Par ailleurs, je viens de trouver cela à l'instant et ça semble faire la même chose : JCL.
    Interessant ! Peut-être y trouvera-t-on la solution pour faire fonctionner le programme avec des jars embarqués. Je n'ai pas eu le temps de creuser de mon côté (j'ai dans l'idée que peut-être que l'URLClassLoader ne gère pas le protocole jar justement, et qu'il faut implémenter cette prise en charge).
    Mais si ça te convient de fonctionner avec des jars externes, je ne poursuivrai probablement pas mon investigation (surtout si une API fait déjà le boulot).

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. fonction qui ne s'execute pas mais qui ne retourne pas d'erreur
    Par duplo dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 03/06/2006, 21h43
  2. [Mac] Lien ne fonctionnant pas mais ok sous Windows
    Par bractar dans le forum Balisage (X)HTML et validation W3C
    Réponses: 11
    Dernier message: 26/01/2006, 18h38
  3. La FAQ qui ne marche pas mais pourquoi?
    Par Antoine_1977 dans le forum Access
    Réponses: 3
    Dernier message: 27/09/2005, 16h22
  4. [Process] pb exec sous unix, ne plante pas mais ne fait rien
    Par NiBicUs dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 10/12/2004, 05h27
  5. [Système] loadLibrary ne marche pas mais Load oui
    Par fredericL dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 26/05/2004, 15h32

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