我有一个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并且我的结果会不准确。
答案 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