Каждый раз, когда я вызываю IJavaProject.findPackageFragmentRoots(IClasspathEntry cpe)
и передаю ему IClasspathEntry вида CPE_PROJECT, он возвращает пустой список. Я приостановил отладчик и запустил следующие строки в представлении Eclipse Display, чтобы узнать, что происходит:
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[]) []
Элемент classpath является частью пути к классу Java-проекта, и он имеет вид CPE_PROJECT. Кроме того, ссылка на проект Java (под названием "Some Project" ) содержит по крайней мере один корневой источник. Согласно javadoc для IJavaProject, кажется, что это должно возвращать хотя бы один IPackageFragmentRoot, но его нет.
Любая идея, что я не понимаю здесь? Как я могу получить IPackageFragmentRoots из IClasspathEntry из вида CPE_PROJECT, не делая что-то хакерское? (Я имею в виду, я мог бы получить IJavaProject из записи в classpath и выполнить итерацию через свой rawpathpath, игнорируя не экспортируемые записи, в поисках IPackageFragmentRoots.)