EclipsePDE:在PDE和开发人员之间模拟IJavaProject创建的IResourceChangeEvents';谁的工作空间?
(注意-最终解决方案如下) 在我的插件中,我试图创建一个EclipsePDE:在PDE和开发人员之间模拟IJavaProject创建的IResourceChangeEvents';谁的工作空间?,java,eclipse,eclipse-plugin,Java,Eclipse,Eclipse Plugin,(注意-最终解决方案如下) 在我的插件中,我试图创建一个IJavaProject(最后使用eclipsejdt,代码),它创建一个Java项目,几乎就像IJavaProject是由开发人员(或使用该插件的任何人)创建的一样。我能够从我的PDE创建IJavaProject,它工作得很好,但是我需要模拟在我的PDE中创建项目时产生的IResourceChangeEvents,以匹配在开发人员工作区中创建Java项目时产生的IResourceChangeEvents 我正在使用我的IResourceC
IJavaProject
(最后使用eclipsejdt,代码),它创建一个Java项目,几乎就像IJavaProject是由开发人员(或使用该插件的任何人)创建的一样。我能够从我的PDE创建IJavaProject
,它工作得很好,但是我需要模拟在我的PDE中创建项目时产生的IResourceChangeEvents
,以匹配在开发人员工作区中创建Java项目时产生的IResourceChangeEvents
我正在使用我的IResourceChangeListener
测量“IResourceChangeEvents”(它使用访问者,应该是正确的-查看代码)。在开发人员的工作区中创建Java项目时,我正在测量以下IResourceChangeEvents
:
CHANGE-ROOT (1 child)
ADD-PROJECT (5 children)
ADD-FILE ".classpath"
ADD-FILE ".project"
ADD-FOLDER ".settings" ADD-FILE ".prefs"
ADD-FOLDER ".bin"
ADD-FOLDER ".src"
C-R
C-P
ADD-FILE ".project"
C-R
C-P "JavaProject"
C-R
C-P
CHANGE-FILE ".project"
C-R
C-P
ADD-FOLDER "bin"
C-R
C-P
C-F
ADD-FILE ".project"
C-R
C-P
ADD-FILE ".classpath"
C-R
C-P
ADD-FOLDER "src"
C-R
C-P
CHANGED-FILE ".classpath"
当我在PDE中使用Eclipse JDT(最后的代码)创建一个IJavaProject
时,我测量这些IResourceChangeEvents
:
CHANGE-ROOT (1 child)
ADD-PROJECT (5 children)
ADD-FILE ".classpath"
ADD-FILE ".project"
ADD-FOLDER ".settings" ADD-FILE ".prefs"
ADD-FOLDER ".bin"
ADD-FOLDER ".src"
C-R
C-P
ADD-FILE ".project"
C-R
C-P "JavaProject"
C-R
C-P
CHANGE-FILE ".project"
C-R
C-P
ADD-FOLDER "bin"
C-R
C-P
C-F
ADD-FILE ".project"
C-R
C-P
ADD-FILE ".classpath"
C-R
C-P
ADD-FOLDER "src"
C-R
C-P
CHANGED-FILE ".classpath"
其中C-R
为CHANGED-ROOT
,C-p
为CHANGED-PROJECT
,C-F
为CHANGED-FILE
关于创建IJavaProject
的其他方法有什么建议吗
这是我的IJavaProject
创建代码:
public static IJavaProject getJavaProject(IProject project) throws CoreException
{
return getJavaProject(project, "src", "bin");
}
public static IJavaProject getJavaProject(IProject project, String sourceFolderPath,
String binFolderPath) throws CoreException
{
if (!project.exists())
// This creates ADDED (.project)
ResourceUtility.createProject(project);
System.out.println("setting description nature id's.");
IProjectDescription description = project.getDescription();
description.setNatureIds(new String[] {JavaCore.NATURE_ID});
System.out.println("setting project description.");
// Creates CHANGED (JavaProject/.project)
project.setDescription(description, null);
System.out.println("Creating project.");
// Does not do anything.
IJavaProject javaProject = JavaCore.create(project);
IFolder binFolder = project.getFolder(binFolderPath);
// Creates ADDED (JavaProject/bin)
binFolder.create(false, true, null);
javaProject.setOutputLocation(binFolder.getFullPath(), null);
System.out.println("Installing VM.");
List<IClasspathEntry> entries = new ArrayList<>();
IVMInstall vmInstall = JavaRuntime.getDefaultVMInstall();
System.out.println("JDTUtil: vmInstall: " + vmInstall);
LibraryLocation[] locations = JavaRuntime.getLibraryLocations(vmInstall);
System.out.println("JDTUtil: lib locations: " + locations);
// Creates ADDED (JavaProject/bin/.project) - ignored by RCL
for (LibraryLocation element: locations)
{
entries.add(JavaCore.newLibraryEntry(element.getSystemLibraryPath(), null, null));
}
// add libs to project class path
// Creates ADDED (JavaProject/.classpath)
javaProject.setRawClasspath(entries.toArray(new IClasspathEntry[entries.size()]), null);
//
IFolder sourceFolder = project.getFolder(sourceFolderPath);
// Creates ADDED (JavaProject/src)
sourceFolder.create(false, true, null);
IPackageFragmentRoot root = javaProject.getPackageFragmentRoot(sourceFolder);
IClasspathEntry[] oldEntries = javaProject.getRawClasspath();
IClasspathEntry[] newEntries = new IClasspathEntry[oldEntries.length + 1];
System.arraycopy(oldEntries, 0, newEntries, 0, oldEntries.length);
newEntries[oldEntries.length] = JavaCore.newSourceEntry(root.getPath());
// Creates CHANGED (JavaProject/.classpath)
javaProject.setRawClasspath(newEntries, null);
return javaProject;
}
这是新的资源树,它与我上面需要的资源树相匹配(不包括.settings
文件夹-只是手动创建的工件)
试试这两件事:
- 使用iWorkSpaceUnnable的实现将所有资源更改批处理到单个事务中。这将使更改看起来更像创建项目资源增量
- 在运行代码之前,请确保已从磁盘中删除该项目。看起来您从工作区中删除了它,但没有从文件系统中删除
javaProject
,我想我应该等到作业完成后再使用我的javaProject
。我正在考虑将WorkspaceJob
与runInWorkspace
一起使用,并创建一个扩展Job
的内部类,然后使用IJobManager
加入作业,直到作业完成。@Lucas同步工作正常。虽然它确实比没有IWorkspaceRunnable的情况下运行得更快,但实际上并不需要那么长的时间,因为您不是每次添加资源时都运行构建器——只在最后运行一次。