IClasspathEntry 的绝对文件系统路径

Absolute filesystem path for an IClasspathEntry

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


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

IClasspathEntry.getPath() 的 Javadoc 是这样说的:

Returns the path of this classpath entry. The meaning of the path of a classpath entry depends on its entry kind:

[...]

•A binary library in the current project (CPE_LIBRARY) - the path associated with this entry is the absolute path to the JAR (or root folder), and in case it refers to an external library, then there is no associated resource in the workbench.

这似乎表明也许我可以测试 "there is no associated resource in the workbench" 以确定库是否为外部库。但这是一种可靠的方法吗?这如何转化为代码?


我对可靠性的担忧是:入口路径 /user/kevin/foo.jar 可能引用外部 jar(jarfile 在我的主目录下 Linux),或内部 jar(jarfile 在 'kevin' 项目文件夹 'user')。作为用户,我可能会尝试将这两个 jarfile 添加到我的项目类路径中。除非 Eclipse 阻止我这样做(不幸的是我没有 Linux 机器可以自己测试),否则在我看来内部 jar 会影响外部 jar 并且我的结果会不准确。

这是 Eclipse 使用的:

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();
    }
}

改编自org.eclipse.jdt.apt.core.util.AptConfig