从eclipse-plugin运行获取项目链接资源路径

时间:2014-11-13 12:59:34

标签: java eclipse eclipse-plugin project

我正在编写一个eclipse-plugin,它可以访问eclipse中当前打开的项目。 在这些项目中,我需要访问源文件,遗憾的是,这些文件也可以位于与项目工作目录不同的位置。

考虑从现有来源创建一个新项目:

新项目位于C:/Users/username/runtime-EclipseApplication/JabRef文件夹中  而源文件位于C:/Users/username/Downloads/git/jabref/

这会在.project-File中创建以下条目:

...
<linkedResources>
    ...
    <link>
        <name>java</name>
        <type>2</type>
        <location>C:/Users/username/Downloads/git/jabref/src/main/java</location>
    </link>
</linkedResources>
...

和.classpath-File:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
  <classpathentry kind="src" output="classes" path="java"/>
  <classpathentry kind="src" output="classes" path="gen"/>
  <classpathentry kind="var" path="JRE_LIB" rootpath="JRE_SRCROOT" sourcepath="JRE_SRC"/>
 ...

现在我的当前代码为我提供了一个像这样的文件路径:net/sf/jabref/imports/MsBibImporter.java(我通过bug.getPrimarySourceLineAnnotation().getSourcePath()从FindBugs BugInstance获得。)

我的目标是使用if(new RepositoryBuilder().findGitDir(new File(filePath)).getGitDir() != null)

找到文件的相应git目录

我所有的方法都给了我项目中的路径,例如&#34; C:/ Users / username / runtime-EclipseApplication / JabRef / JabRef / java&#34;实际上并不存在。

我可以通过IProject project访问该项目。

1 个答案:

答案 0 :(得分:0)

我使用了以下三行

IPath path = project.getFile(bug.getPrimarySourceLineAnnotation().getSourcePath()).getProjectRelativePath();
IResource res = getResource(project, path.removeLastSegments(1).toString(), path.lastSegment());
File file = res.getLocation().toFile();

以及来自https://stackoverflow.com/a/7727264/455578

的方法
IResource getResource(IProject project, String folderPath, String fileName) {

    IJavaProject javaProject = JavaCore.create(project);
    try {
        for (IPackageFragmentRoot root : javaProject.getAllPackageFragmentRoots()) {
            IPackageFragment folderFragment = root.getPackageFragment(folderPath);
            IResource folder = folderFragment.getResource();
            if (folder == null || ! folder.exists() || !(folder instanceof IContainer)) {
                continue;
            }

            IResource resource = ((IContainer) folder).findMember(fileName);
            if (resource.exists()) {
                return resource;
            }
        }
    } catch (JavaModelException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    // file not found in any source path
    return null;
}