2011-03-02 165 views
2

我正在研究一个需要构建一个类加载器的Eclipse插件,该类可以访问Eclipse中项目的类路径中的所有内容。我有一个IJavaProject,我试图建立一个网址列表传递给一个URLClassLoader的:如何在Eclipse插件中获取IJavaProject的类路径作为文件路径?

final IClasspathEntry[] resolvedClasspath = javaProject.getResolvedClasspath(true); 
for (IClasspathEntry classpathEntry : resolvedClasspath) { 
    urls.add(classpathEntry.getPath().makeAbsolute().toFile().getCanonicalFile().toURL()); 
} 

但是,任何项目依赖关系(无论是手动添加,或从Maven插件的“Maven依赖”容器)显示为只是“file:/ projectName”,而不是绝对路径。

其他实验涉及使用javaProject.getAllPackageFragmentRoots(),但这似乎并没有包含“Maven Dependencies”容器内的项目依赖关系。

回答

5

makeAbsolute()调用不是上下文感知的。它只是增加了一个领先的“/”。

您需要检查路径是否为绝对路径(IPath.isAbsolute())。如果不是绝对的,则调用IProject.getLocation()以获取项目根目录并将这两个路径连接起来。

提示:UrlClassLoader将锁定该类加载器存在期间的所有jar。这可能会导致插件用户出现问题,因为他们无法在插件处于活动状态时删除或更改JAR。我已经看到了几个解决方法。最有效的方法是先将罐子复制到临时位置,然后用副本构建类加载器。然后,您可以监视原始的罐子并更新您的副本和类加载器,而无需锁定用户控制的文件。