Ogni volta che chiamo IJavaProject.findPackageFragmentRoots(IClasspathEntry cpe)
e gli passiamo un IClasspathEntry di tipo CPE_PROJECT, restituisce una lista vuota. Mi fermai il debugger e corse le seguenti righe nella Eclipse display per vedere cosa stava succedendo:Perché IJavaProject.findPackageFragmentRoots restituisce un array vuoto?
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'entrata classpath fa parte del percorso di classe del progetto Java ed è di tipo CPE_PROJECT. Inoltre, il progetto Java di riferimento (intitolato "Alcuni progetti") ha almeno una radice contenente l'origine. Secondo lo javadoc for IJavaProject, sembra che questo dovrebbe restituire almeno un IPackageFragmentRoot, ma non è così.
Qualche idea di cosa sto fraintendendo qui? Come posso ottenere IPackageFragmentRoots da un IClasspathEntry di tipo CPE_PROJECT senza fare qualcosa di hackish? (Voglio dire, potrei ottenere IJavaProject dalla voce classpath e scorrere il suo classpath raw, ignorando le voci non esportate, in cerca di IPackageFragmentRoots.)
Un bug è stata depositata: https://bugs.eclipse.org/bugs/show_bug.cgi?id=324367 – peskal
il bug è stato corretto. Ha risolto il tuo problema? –
Se il problema è stato risolto, si prega di postare l'auto-risposta e accettare in modo che questo possa essere chiuso :) –