32

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を検索して、エクスポートされていないエントリを無視して、生のクラスパスを反復処理することができます。)

4

1 に答える 1

0

これはEclipse3.7で修正されたバグでした(https://bugs.eclipse.org/bugs/show_bug.cgi?id=324367を参照)。

新しいAPIによると:

結果には、このプロジェクトのクラスパスで参照されている他のプロジェクトのパッケージフラグメントルートは含まれていません。

http://help.eclipse.org/indigo/index.jsp?topic=/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/IJavaProject.htmlを参照してください

于 2011-07-23T20:55:27.450 に答える