2015-06-08 209 views
1

我有一个IJavaProject,我的目标是生成一个List<File>以及项目已解析类路径条目的绝对文件系统路径。我首先调用project.getResolvedClasspath(true)来获得一组IClasspathEntry对象。但我不知道如何可靠地确定每个条目的绝对文件系统路径。我目前追求的方法在下面突出显示,但如果有更简单的方法,我一定会想知道。IClasspathEntry的绝对文件系统路径


我首先想到的是为每个条目做这样的事情:ResourcesPlugin.getWorkspace().getRoot().getLocation().append(entry.getPath())。但问题是并不是所有的对象都有工作空间相对路径;外部库有绝对的文件系统路径。我可以很容易地确定IClasspathEntry是否是一个库(getEntryKind() == IClasspathEntry.CPE_LIBRARY)...但是我看不到任何明显的API来识别库条目是否是外部的。

的Javadoc IClasspathEntry.getPath()有这样一段话:

返回此类路径条目的路径。类路径条目的路径的意义取决于它的条目类型:

[...]

•在当前项目(CPE_LIBRARY)的二进制库 - 与此项目相关的路径是绝对路径到JAR(或根文件夹),并且如果它引用了外部库,那么在工作台中就没有关联的资源。

这似乎表明,也许我可以测试“在工作台中没有关联的资源”来确定库是否是外部的。但这是一种可靠的方法吗?那如何转化为代码?


我对可靠性问题是这样的:进入路径/user/kevin/foo.jar可以参照一个外部的jar(在Linux下我的家目录jar文件),或内部罐子(jar文件在项目“用户”的“凯文”文件夹)。作为用户,我可能会尝试将两个jar文件添加到我的项目类路径中。除非Eclipse阻止我这样做(不幸的是我没有一台Linux机器可以方便地自己测试这个),那么在我看来,内部jar会影响外部jar,而我的结果会不准确。

回答

1

这就是Eclipse使用:改编自org.eclipse.jdt.apt.core.util.AptConfig

IClasspathEntry entry = .... 

IWorkbenchRoot root = ResourcesPlugin.getWorkspace().getRoot(); 

if (entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY) { 
    IPath cpPath = entry.getPath(); 

    IResource res = root.findMember(cpPath); 

    // If res is null, the path is absolute (it's an external jar) 

    String path; 
    if (res == null) { 
     path = cpPath.toOSString(); 
    } 
    else { 
     // It's relative 
     path res.getLocation().toOSString(); 
    } 
}