2010-08-10 3 views
3

J'essaye de compiler et charger une classe à l'exécution, sans connaître le paquet de la classe. Je sais que la classe devrait se conformer à une interface, et l'emplacement de la source, (et donc le nom de la classe). Je suis en train de ce qui suit:Comment fournir une interface à JavaCompiler lors de la compilation dynamique d'un fichier source?

/* Compiling source */ 
File root = new File("scripts"); 
File sourceFile = new File(root, "Test.java"); 
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 
compiler.run(null, null, null, sourceFile.getPath()); 

où le fichier Test.java ressemble

import foo.Itest; 
public class Test implements Itest{ 
... 
} 

et je reçois une erreur cannot find symbol symbol : class Itest du compilateur. Comment puis-je fournir le compilateur avec l'interface (qui a déjà été chargé) pour éviter cette erreur?

[EDIT - RÉSOLU]: L'erreur vient du fait de la l'interface était ITest et la source appelée à une interface Itest.

+1

Motherfriggin typo! L'interface chargée est 'ITest', pas' Itest'. – brice

+0

Si un modérateur voit ce message et pense qu'il devrait être supprimé, je suis content de ça. – brice

+0

Copie possible de [Comment compiler et charger dynamiquement des classes java externes?] (Https://stackoverflow.com/questions/21544446/how-do-you-dynamically-compile-and-load-external-java-classes) – ldmtwo

Répondre

1

Vous ne savez pas si c'est ce que vous cherchez, mais, comme mentionné par @Phil here, vous pouvez essayer de passer un argument classpath dans votre méthode compiler.run.

+0

Aioobe, je suis juste un idiot. Merci pour l'aide. – brice

2

Il semble probable que le compiler.run() s'exécute en externe et nécessite que le chemin de classe soit défini. Avez-vous essayé de lui transmettre un paramètre de chemin de classe approprié en utilisant le dernier paramètre args à l'appel run()? Peut-être c'est pourquoi ToolProvider.getSystemToolClassLoader(). Ce numéro stackoverflow post peut également vous aider.

+0

Merci jowierun, Il s'est avéré que c'était une erreur beaucoup plus banale. – brice

0

Avez-vous envisagé de générer votre classe avec javassist ou quelque chose comme ça?

Questions connexes