如何阅读Eclipse classpathentry中的所有JAR,其中kind =“con”

时间:2016-12-21 13:09:10

标签: java eclipse classpath

我有一个项目的.classpath文件,其中包含所有类路径条目。现在它有以下条目 -

<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
</classpathentry>

现在,从这个条目开始,我想通过编程方式找到所有通过java代码与这个库相关联的jar文件?有没有办法阅读所有的罐子?

2 个答案:

答案 0 :(得分:2)

"con" is a container like JRE它与您的应用程序中的父类加载器有关。这个conatiner定义了自己的类路径,可以在运行时读取:

public static void main(String[] args) {
    ClassLoader classLoader = ClassLoader.getSystemClassLoader();
    ClassLoader parentClassLoader = classLoader.getParent();
    System.out.println("Project jars: ");
    readJars(classLoader);
    System.out.println("Container jars: ");
    readJars(parentClassLoader);
}

private static void readJars(ClassLoader classLoader) {
    URLClassLoader urlClassLoader = (URLClassLoader) classLoader;
    URL[] urls = urlClassLoader.getURLs();
    for(URL url: urls){
        String filePath = url.getFile();
        File file = new File(filePath);
        if(file.exists() && file.isFile()) {
            //Apply additional filtering if needed
            System.out.println(file);
        }
    }
}

答案 1 :(得分:2)

以下是调查运行Eclipse JEE Kepler,同时阅读2016年夏季检查并在启动时调试Eclipse的源代码。

在工作区根文件夹中有一个文件.metadata.plugins \ org.eclipse.jdt.core \ variablesAndContainers.dat。 JavaModelManager从方法loadVariablesAndContainers读取此文件。

这是JavaModelManager的源代码 https://git.eclipse.org/c/e4/org.eclipse.jdt.core.git/tree/model/org/eclipse/jdt/internal/core/JavaModelManager.java

在variablesAndContainers.dat中,我相信每个项目都有一个条目,每个项目都有一个容器。您可以在文件中将容器名称视为String。

流程继续 JavaModelManager $ VariablesAndContainersLoadHelper.loadContainers(IJavaProject)

从此处,该文件读取类路径条目数的计数。对于每个条目,它然后使用方法VariablesAndContainersLoadHelper.loadClasspathEntry读取容器。这将创建一个表示Java容器的类路径条目数组。它作为JavaModelManager.PersistedClasspathContainer保存在内存中。

如果您正在创建独立应用程序,那么这就是您要寻找的。 如果要创建Eclipse插件,请检查JavaModelManager.getClasspathContainer的行为。

你必须研究这些代码,并且可能会调试很多Eclipse初创公司以找出文件的整个格式。