valor - retornar una lista en java
¿Por qué IJavaProject.findPackageFragmentRoots devuelve una matriz vacía? (1)
Este fue un error que se solucionó en Eclipse 3.7 (ver bugs.eclipse.org/bugs/show_bug.cgi?id=324367 ).
Según la nueva API:
El resultado no incluye las raíces del fragmento del paquete en otros proyectos a los que se hace referencia en el classpath de este proyecto.
Cada vez que llamo a IJavaProject.findPackageFragmentRoots(IClasspathEntry cpe)
y le paso un IClasspathEntry del tipo CPE_PROJECT, devuelve una lista vacía. Hice una pausa en el depurador y ejecuté las siguientes líneas en la vista Eclipse Display para ver qué sucedía:
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[]) []
La entrada classpath es parte del classpath del proyecto Java y es del tipo CPE_PROJECT. Además, el proyecto de Java al que se hace referencia (titulado "Some Project") tiene al menos una raíz que contiene la fuente. De acuerdo con javadoc para IJavaProject , parece que esto debería devolver al menos un IPackageFragmentRoot, pero no es así.
¿Alguna idea de lo que estoy malinterpretando aquí? ¿Cómo puedo obtener el IPackageFragmentRoots de un IClasspathEntry del tipo CPE_PROJECT sin hacer algo hackish? (Es decir, podría obtener IJavaProject de la entrada classpath e iterar a través de su classpath sin formato, ignorando las entradas no exportadas, en busca de IPackageFragmentRoots).