IJavaProject.findPackageFragmentRoots(IClasspathEntry cpe)
種類CPE_PROJECTのIClasspathEntryを呼び出して渡すたびに、空のリストが返されます。デバッガーを一時停止し、Eclipseディスプレイビューで次の行を実行して、何が起こっているかを確認しました。
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[]) []
クラスパスエントリは、Javaプロジェクトのクラスパスの一部であり、CPE_PROJECTのようなものです。さらに、参照されるJavaプロジェクト(「SomeProject」というタイトル)には、ソースを含むルートが少なくとも1つあります。IJavaProjectのjavadocによると、これは少なくとも1つのIPackageFragmentRootを返すはずですが、そうではありません。
私がここで誤解していることについて何か考えはありますか?何かハックをすることなく、CPE_PROJECTの種類のIClasspathEntryからIPackageFragmentRootsを取得するにはどうすればよいですか?(つまり、クラスパスエントリからIJavaProjectを取得し、IPackageFragmentRootsを検索して、エクスポートされていないエントリを無視して、生のクラスパスを反復処理することができます。)