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

Langage Java Discussion :

java.lang.instrument.Instrumentation en dehors d'un JavaAgent


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 141
    Par défaut java.lang.instrument.Instrumentation en dehors d'un JavaAgent
    Bonjour,

    Je dispose d'un jar qui possède un "Main-Class" et qui dispose aussi d'un "Premain-Class"

    Ce jar modifié à la volée en utilisant ClassFileTransformer, quelques classes d'une api qui est utilisé par la suite.

    En utilisant ce jar en tant que javaagent, cela fonctionne très bien.

    Le problème vient quand on utilise ce jar en tant de main java.

    Quand ce jar est appelé, l'option javaagent n'est pas renseigné donc forcement il n'y a pas de transformer qui modifie le bytecode.

    Est-il possible de faire appel le classFileTransformer pour modifier le bytecode sans utiliser VirtualMachine.attach car cela utilise tools.jar (le tools.jar n'est pas rajouté dans le classpath par l'appel) et de plus VirtualMachine permet d'attacher l'agentjava avec le mainagent pour une autre instance de la JVM ?

    Voila voila

  2. #2
    Modérateur

    Avatar de Robin56
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2009
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juin 2009
    Messages : 5 297
    Par défaut
    Je ne suis pas sur d'avoir bien tout compris mais je tente une réponse. Ton soucis semble être de ne pas vouloir démarrer ton agent java dès le démarrage de la JVM. C'est bien ça ?

    En Java 1.5, tu n'avais que la solution du JAR avec un premain. Ceci se lançait donc au démarrage. Depuis Java 1.6, tu peux démarrer ton agent Java plus tard dans ton code. Ce principe est évoqué dans la Javadoc :
    - Interface Instrumentation
    - package java.lang.instrument
    Responsable Java de Developpez.com (Twitter et Facebook)
    Besoin d'un article/tutoriel/cours sur Java, consulter la page cours
    N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
    --------
    Architecte Solution
    LinkedIn : https://www.linkedin.com/in/nicolascaudard/

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 141
    Par défaut
    Oui tout a fait depuis java 1.6.

    On peut "attacher" un javaagent pendant l'execution de la jvm.
    Cale fonctionne tres bien:
    Il faut avoir le pid de la jvm ou on veut inserer l'agent.
    Et a l'execution de la seconde jvm qui permet d'attacher le javaagent, il faut dans le classpath avoir tools.jar du jdk

    http://docs.oracle.com/javase/6/docs...alMachine.html

    Un petit exemple :

    J'ai une application qui tourne, par exemple un tomcat avec une webapp.

    Je dispose d'un javaagent qui permet de faire du profiling (ou autre chose).

    2 solutions :
    -Depuis JAVA 5 : Arreter mon tomcat rajouter le parametre "javaagent" à la commande "java" et relancer le tomcat
    -Depuis JAVA 6 : je laisse mon tomcat tourner, je récupere le pid de la jvm (un petit ps aux sous linux suffit ). J'écris un main java en utilisant VirtualMachine et je lance mon main.

    La jvm exécutant le main va communiquer avec la jvm qui fait tourner le tomcat et lui rajouter à chaud le javaagent.


    Moi mon probleme est tout autre, je lance mon application sans javaagent car je n'ai pas la maitrise des parametres d'execution de l'application mais je veux avoir le meme fonctionnement que si c'etait un agent. Au chargement des classes, plus précisement à l'appel de la methode native defineClass du ClassLoader, faire appel au transformer de mon agent.

  4. #4
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 141
    Par défaut
    en faites, la solution est assez simple pour garder le mecanisme de java.lang.instrumentation sans etre dans un javaagent, il est nécessaire de faire un classloader utilisant l'interface ClassFileTransformer.

    par exemple : comme ceci :

    http://code.google.com/p/thread-weav...ader.java?r=11

    contrairement à mon besoin, il utilise leur interface "Instrumenter instrumenter"

    J'ai fait la meme chose en utilisant la gestion du manifest si c'est un jar et en replacant leur instrumenter par celui du jdk, pour etre plus précis, j'ai utilisé directement ClassFileTransformer.

    Cela me permet d'avoir la meme injection de bytecode que ce soit en javaagent ou avec un main java.

Discussions similaires

  1. java.lang.Instrumentation, probleme avec redefineClass
    Par GroRelou dans le forum API standards et tierces
    Réponses: 0
    Dernier message: 24/07/2009, 17h18
  2. [Struts] java.lang.NoClassDefFoundError
    Par Zephoria dans le forum Struts 1
    Réponses: 2
    Dernier message: 08/02/2005, 10h51
  3. [Débutant] java.lang.object
    Par bonnefr dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 27/05/2004, 14h54
  4. [IMAGE JAI] java.lang.Error
    Par babyboy dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 18/05/2004, 14h29
  5. Réponses: 4
    Dernier message: 22/01/2004, 08h27

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