3

Eclipseワークスペースにプロジェクトがあります。

ここに画像の説明を入力してください

次のコードを使用してこのプロジェクトをIJavaProjectとして開くと、プロジェクトが「開かない」状態になります。

IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IProject orig = root.getProject(this.projectName);
orig.open(null /* IProgressMonitor */);
orig.refreshLocal(IResource.DEPTH_ZERO, null);
this.javaProject = JavaCore.create(orig);

IProject withメソッドを開き、「リソースがファイルシステムと同期していない」という回避策を使用しopen()て手動で更新しました。refreshLocal

ここに画像の説明を入力してください

他のリソースが開かれていません。

ここに画像の説明を入力してください

「F5」でプロジェクトを更新してみましたが、うまくいきません。

何が悪いのでしょうか?リソースを開くにはどうすればよいですか?

追加した

新しいNullProgressMonitor()でリソースを開こうとしましたが、機能しませんでした。

orig.open(new NullProgressMonitor());
orig.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());

追加2

javaModelを使用するこのコードを使用して、ワークスペース内のすべてのプロジェクトが閉じられているという情報を取得しました。これは私のワークスペースが壊れていることを意味しますか?Eclipse IDEを使用してワークスペースを開くと、Javaコードを開いてコンパイルできました。

IJavaModel javaModel = JavaCore.create(root);
this.javaProject = javaModel.getJavaProject(this.projectName);

ここに画像の説明を入力してください

4

1 に答える 1

3

コードスタイル:

可能な場合は、パラメータとして「null」を避ける必要があります。これは、読みやすさ(および保守性)にとって常に優れています。ここで、API設計者は、「値なし」と言う実際のオブジェクトを提供しています。

orig.open(new NullProgressMonitor());
orig.refreshLocal(IResource.DEPTH_ZERO, new NullProgressMonitor());

問題 :

あなたの問題はこれらの2行目にあると思います。プロジェクトを更新しますが、そのメンバーは更新しません。含まれているすべてのファイルが実際に更新されるように、INFINITEの深さで試してみるとどうなりますか?

orig.open(new NullProgressMonitor());
orig.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());

アップデート :

実際、リソースのtoStringのこの「(開いていない)」はワークスペースレベルではありません。IProjectとIFilesは適切に開かれ、更新されます(プロジェクトが既に開かれている場合は、おそらくそれは必要ありません)。

Javaモデルはワークスペースと同じではなく、「開かれていない」Java要素はワークスペースレベルでは意味がありません。これは、Java要素のコンテンツで開かれているバッファがないことを意味するだけです。java要素を開くことを心配する必要はありません。jdtは、要素の操作中に必要に応じて作業を行います。

ただし、プロジェクトに対応するものだけでなく、Javaモデル全体を作成することもできます。

IJavaModel javaModel = JavaCore.create(root);
this.javaProject = javaModel.getJavaProject(this.projectName);

これにより、後で奇妙なエラーを回避できる可能性があります:)。

于 2013-01-11T10:59:44.160 に答える