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的情况下运行得更快,但实际上并不需要那么长的时间,因为您不是每次添加资源时都运行构建器——只在最后运行一次。