Salut,
Dans le cadre d'une extension d'un projet WTP, lors de l'installation de ma facet, je cherche à installer automatiquement la javadoc sur des jars précédemment copiés programmatiquement dans le dossier WEB-INF/lib, créé lui aussi programmatiquement. Pour cela, j'ai écrit cette méthode, pour chercher le IClasspathEntry correspondant au jar :
Cela fonctionne sauf à de très rares occasions, où l'entrée n'est pas trouvée. Comme c'est rare, je ne parviens pas le reproduire en débogage (j'ai essayé 10 fois, mais je n'ai pas insisté). Je ne sais pas si c'est parce que resolved peut être null ou pas, malgré que que curr corresponde bien à libPath. J'ai ajouté une trace pour observer ce cas lorsque le bogue apparaîtra.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 public static Optional<IClasspathEntry> findEntryInContainer(final IClasspathContainer container, final IPath libPath) { final IClasspathEntry[] entries= container.getClasspathEntries(); for (int i= 0; i < entries.length; i++) { final IClasspathEntry curr = entries[i]; final IClasspathEntry resolved = JavaCore.getResolvedClasspathEntry(curr); if (resolved != null && libPath.equals(resolved.getPath())) { return Optional.of(curr); // return the real entry } } return Optional.empty(); // attachment not possible }
Il est en revanche certain que je passe par cette méthode (le IClasspathContainer est lui forcément trouvé (correspondant à WEB-INF/lib).
J'essaye donc de comprendre pourquoi mon jar n'est pas trouvé à chaque fois. Est-ce que ça pourrait venir du fait que la construction du classpath est asynchrone ? Dans ce cas, comment m'assurer que je fais bien ce travail au bon moment (synchronisation sur un job, évènement ?). Est-ce que ce serait une mauvaise compréhension de ma part de getResolvedClasspathEntry() ?
Y aurait-il une autre façon de procéder pour récupérer le IClasspathEntry ? Ou même d'installer la javadoc programmatiquement ?
Merci par avance de vos avis.
Partager