44 votes

Comment définir le classpath lorsque j'utilise javax.tools.JavaCompiler pour compiler la source ?

J'utilise la classe javax.tools.JavaCompiler (jdk6) pour compiler un fichier source, mais le fichier source dépend d'un fichier jar. Comment définir le classpath de l'application javax.tools.JavaCompiler ?

42voto

Pascal Thivent Points 295221

Le site javax.tools.JavaCompiler#getTask() La méthode prend un options qui permet de définir les options du compilateur. Les options suivantes message décrit une manière simple de les définir afin d'accéder au classpath du programme appelant :

Vous devez configurer l'option standard java pour qu'il connaisse les fichiers fichiers jar - vous utilisez l'argument des options du compilateur pour ce faire.

Par défaut, l'objet du compilateur java ne semble connaître que les emplacements par défaut par défaut pour bootclasspath, extdirs et endorseddirs en ce qui concerne de son classpath.

Vous devez ajouter l'adresse du programme appelant du programme appelant au compilateur java qui est transmise à l'instance du le gestionnaire de fichiers standard, qui va trouvera alors les classes dans les fichiers jar.

Voici comment je le fais dans le compilateur que j'ai écrit

List<String> optionList = new ArrayList<String>();
// set compiler's classpath to be same as the runtime's
optionList.addAll(Arrays.asList("-classpath",System.getProperty("java.class.path")));

// any other options you want
optionList.addAll(Arrays.asList(options));

JavaCompiler.CompilationTask task = compiler.getTask(out,jfm,diagnostics,optionList,null,jfos);

Il ne vous reste plus qu'à définir le bon classpath lors de l'exécution du programme appelant.

0 votes

Satheesh a posté ceci comme réponse, "Pourriez-vous partager votre compilateur wrapper( le lien ne fonctionne pas) merci d'avance".

0 votes

Merci beaucoup pour cet article, je me suis débattu avec cela pendant des années et c'était la réponse... merci :)

2 votes

BTW, classpath option de JavaCompiler ne "comprend" pas les caractères génériques. Ainsi, chaque jar que vous devez ajouter directement dans cette chaîne.

5voto

user486005 Points 72

Le même problème m'est arrivé récemment, j'ai finalement trouvé deux solutions de contournement. Vous pouvez définir le chemin de la classe soit en invoquant StandardJavaFileManager.setLocation(StandardLocation.CLASS_PATH, "YOUR_CLASS_PATH") o Compiler.getTask(ARG_0, ARG_1, ARG_2, CLASS_PATH_OPTIONS, comme le dit la première réponse postée ici.

2 votes

Pour que cela fonctionne, j'ai dû faire StandardJavaFileManager.setLocation(StandardLocation.CLASS_P‌​ATH, Arrays.asList(new File(classpath)));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X