Création dynamique de classes [java] - Java - Programmation
Marsh Posté le 14-04-2005 à 16:41:27
jnoune a écrit : |
C'est le compilateur qui peut compiler des fichiers qui ne lui sont pas spécifié en argument.
Par contre la jvm ne fonctionne qu'avec des classes compilé. D'ailleurs une JRE ne contient pas de compilo.
Regarde du coté de javacc pour compiler des classes à partir de ton prog.
Marsh Posté le 14-04-2005 à 17:07:15
Ah oui effectivement je crois que j'avais un peu mélangé les rôles entre compilo et jvm.. :-/
Ca doit être l'effet ide où on voit plus ce qui se passe.
Merci beaucoup de ton éclairage, je vais de ce pas voir du coté de javacc si je peux y trouver mon bonheur!
Marsh Posté le 14-04-2005 à 18:33:02
euh javacc c'est pas pour generer des parsers ?
et y'a des tas de libs qui generent du bytecode à la volée(cglib entre autres), ainsi qu'une palanquée de langage de scripts basés sur java (groovy, tous les dérivés de beanshell, ...)
Marsh Posté le 15-04-2005 à 10:01:53
As tu pensé aussi à bien configurer Eclipse en mode Build Automatically? (Oglet Projet/ Option Buld Automatically)
Comme cela, Eclipse "decouvre" les nouveaux fichiers tout seul
Marsh Posté le 15-04-2005 à 10:07:12
zombinette a écrit : As tu pensé aussi à bien configurer Eclipse en mode Build Automatically? (Oglet Projet/ Option Buld Automatically) |
meme avec le build automatique faudra qu'il refresh son workspace et puis ca regle pas son probleme, il veut compiler pendant l'execution.
Marsh Posté le 15-04-2005 à 14:13:06
tu peux aussi regarder comment s'est fait du côté de tomcat pour compiler les servlets générée à partir des jsps.
au début ils utilisaient la classe cachée du compilateur (com.sun.tools.javac.Main ou un truc dans le genre), ensuite ils ont utilisé la librairie ant (qui utilisait javac.Main derrière je pense), puis je crois que dans la version 5.5 ils utilisent le compilateur d'eclipse.
ca te fait quelques pistes de recherche
remarque : que ca soit avec lavac.Main ou ant, un des gros soucis était qu'il fallait se mapper sur la compilation enlign de commande, c'est à dire filer une chaine contenant le classpath (=> impossible de filer simplement un ClassLoader), filer le chemain vers un .java (impossible de filer un InputStream), etc ...
Je ne sais pas si c'est mieux fait dans le compilo d'eclipse
Marsh Posté le 15-04-2005 à 17:33:47
benou >> tu veux dire "jsps" et pas "jars", dans ta premiere phrase.
(et si vous voulez mon avis, je subodore la grosse anguille sous la roche du design foireux)
Marsh Posté le 15-04-2005 à 17:43:17
the real moins moins a écrit : benou >> tu veux dire "jsps" et pas "jars", dans ta premiere phrase. |
tout à fait
Marsh Posté le 15-04-2005 à 21:38:03
Clair qu'il y a quelques pistes
Merci beaucoup pour toutes ces bonnes idées.
Pas eu le temps de trop approfondir mais je suis parti sur javacc et en effet fallait se générer son parseur etc, légèrement fastidieux s'il faut se recoder un compilateur..
Par contre CgLib ça l'air pile-poil l'outil qu'il faut pour ce genre de trucs! Seul problème, je n'arrive pas à comprendre comment on peut utiliser cet engin pour faire une simple génération.. Je pensais qu'il fallait passer par le enhancer() mais impossible de trouver comment lui envoyer la source de ma classe. C'est surement simple mais comme je ne suis pas encore super initié au java et que les exemples ne pululent pas trop je suis un peu perdu..
Sinon il ya toujours la soluce du javac.Main, juste l'histoire du classpath un peu génante, mais bon comme ça me semble de loin le plus simple à mettre en place et que ce n'est pas non plus primordial dans le cadre de mon programme, ça me paraît encore le plus abordable..
Si jamais je peux fouiller tomcat je donnerai des retours car cette soluce me plairait bien aussi!
Marsh Posté le 14-04-2005 à 16:24:15
Bonjour,
Je génère une série de sources java en dynamique (des .java) dans le but de réutiliser ces objets par la suite, au cours de la même exécution. Seul problème il semble que les fichiers sources générés durant l'exécution ne soient pas automatiquement détectés par ma jvm.
Je résume :
- Génération d'un .java définissant une classe "Foo" conforme et dans un repertoire recensé par le classpath
- Recherche de la classe "Foo" pour faire de la réflexivité dessus ou instanciation d'un Foo
Class monFoo = Class.forName( "Foo" );
--> et là j'obtiens un beau classNotFound
A ce que j'ai cru comprendre, la JVM recherche dynamiquement dans son classpath les définitions des classes qu'elle ne connaît pas encore. Au démarrage, elle est parfaitement capable de détecter le .java et le compiler à la volée si nécessaire, est-ce aussi le cas en cours d'exécution ou n'est-elle capable de ne retrouver que des classes compilées (et ne peut forcer la compilation automatique à l'excécution)?
Autre piste j'utilise Eclipse et j'ai pu remarquer que même en relançant une seconde fois l'application, elle ne compile toujours pas mes nouveaux fichiers. Il faut auparavant faire un "refresh" physique du projet ou du répertoire pour qu'il relise et découvre les nouveaux fichiers. Il compile alors sans problème après le refresh, mes classes sont bien trouvées. Le problème peut-il alors venir d'Eclipse qui créerait des caches pour éviter le parcours 'live' des répertoires à chaque fois, et dans ce cas y'a-t-il moyen de le forcer à rafraîchir et reparcourir toute l'arborescence?
Si quelqu'un a une idée pour me permettre de faire ça, je suis preneur!