【问题标题】:How to read all JARs from Eclipse classpathentry where kind="con"如何从 Eclipse classpathentry where kind="con" 中读取所有 JAR
【发布时间】:2016-12-21 13:09:09
【问题描述】:

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

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

现在,从这个条目中,我想以编程方式通过 java 代码找到与这个库相关联的所有 jars 吗?有没有办法读取所有的罐子?

【问题讨论】:

  • 是否要求该程序可以在 Eclipse 中运行的插件之外独立运行?我对 Eclipse 插件有一点经验,并且一直在 Eclipse 的类路径阅读器的源代码中。
  • 是的..它也可以独立运行
  • 刚刚签到。对我的回答没有任何反馈,我不知道您是否需要我深入挖掘或更明确。

标签: java eclipse classpath


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    在阅读 2016 年夏季签出的源代码并在启动时调试 Eclipse 时,对运行 Eclipse JEE Kepler 进行了调查。

    在您的工作区根文件夹中有一个文件 .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中,我相信每个项目都有一个入口,每个项目都有一个容器。您可以在文件中看到容器名称为字符串。

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

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

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

    您将不得不研究代码,并且可能调试很多 Eclipse 初创公司来弄清楚文件的整个格式。

    【讨论】:

    • 我正在考虑您的建议,但无法实现解决方案.. 这肯定很有帮助。但我还没有接受它,因为我没有得到输出。
    猜你喜欢
    • 1970-01-01
    • 2012-12-07
    • 2010-11-07
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 2020-04-08
    • 1970-01-01
    相关资源
    最近更新 更多