Chaque fois que j'appelle IJavaProject.findPackageFragmentRoots(IClasspathEntry cpe)
et lui passer un IClasspathEntry de type CPE_PROJECT, il renvoie une liste vide. J'ai mis en pause le débogueur et j'ai exécuté les lignes suivantes dans la vue Eclipse Display pour voir ce qui se passait :
IClasspathEntry cpe = javaProject.getRawClasspath()[8];
cpe.toString();
(java.lang.String) /Some Project[CPE_PROJECT][K_SOURCE][isExported:false][combine access rules:false]
// Show that the referenced project exists and has a root containing source
IClasspathEntry cpe = javaProject.getRawClasspath()[8];
IProject someProject = ResourcesPlugin.getWorkspace().getRoot().getProject(cpe.getPath().toString());
IJavaProject someJavaProject = (IJavaProject) someProject.getNature(JavaCore.NATURE_ID);
IPackageFragmentRoot pfr = someJavaProject.getPackageFragmentRoots()[0];
new Boolean(pfr.getKind() == IPackageFragmentRoot.K_SOURCE).toString();
(java.lang.String) true
IClasspathEntry cpe = javaProject.getRawClasspath()[8];
javaProject.findPackageFragmentRoots(cpe);
(org.eclipse.jdt.core.IPackageFragmentRoot[]) []
L'entrée classpath fait partie du classpath du projet Java et est de type CPE_PROJECT. En outre, le projet Java référencé (intitulé "Some Project") possède au moins une racine contenant la source. Selon le javadoc pour IJavaProject il semble que cela devrait retourner au moins un IPackageFragmentRoot, mais ce n'est pas le cas.
Une idée de ce que je comprends mal ? Comment puis-je obtenir l'IPackageFragmentRoots à partir d'une IClasspathEntry de type CPE_PROJECT sans faire quelque chose de pirate (je veux dire, je pourrais obtenir l'IJavaProject à partir de l'entrée classpath et itérer dans son classpath brut, en ignorant les entrées non exportées, à la recherche de l'IPackageFragmentRoots).