我正在编写一个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)
我所有的方法都给了我项目中的路径,例如&#34; C:/ Users / username / runtime-EclipseApplication / JabRef / JabRef / java&#34;实际上并不存在。
我可以通过IProject project
访问该项目。
答案 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;
}