IClasspathEntry

时间:2015-06-08 16:02:45

标签: java eclipse classpath eclipse-jdt

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

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

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

  

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

     

[...]

     

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

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

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

1 个答案:

答案 0 :(得分:1)

这是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