【问题标题】:How to figure out which JARs are actually being used?如何确定实际使用了哪些 JAR?
【发布时间】:2012-05-02 02:46:05
【问题描述】:

我试图找出总共 83 个 JAR 中的哪些 JAR 库实际上被一组 12 个 Java EE/Spring 项目使用。所有 JAR 都在一个 EAR 之下。开发在 Eclipse 中完成,构建工具是 Ant。所有项目都在 WebSphere Application Server 6.0 上运行。

本题:How to figure out used JARs?

指向这个:How to analyse which jar file is used in a Java program?

它建议使用 -verbose:class 参数调用 java 可执行文件,但如果这在这里有用,那么在项目在我的本地 WAS 6.0 上运行的情况下我该怎么做?

这个问题似乎更指向正确的方向:How to find which jars and in what order are loaded by a classloader?

但是,我不熟悉类加载器是如何工作的,如何判断我的类加载器实例是什么(回复表明 URLClassLoader 有一个 getURLs() 方法提供对 jars/目录列表的访问),如果我的类加载器实例不是 URLClassLoader,我该去哪里?

【问题讨论】:

    标签: spring jakarta-ee dependencies websphere classloader


    【解决方案1】:

    打开详细的类加载(按照 dims 的建议)

    查看管理控制台,您将看到一个类加载器查看器,其中显示了所需的信息。

    类加载器具有用于加载类的标准层次结构。

    看看这个: http://www-01.ibm.com/support/docview.wss?uid=swg27023549&aid=1

    本演示文稿很好地介绍了 WebSphere 环境中的工作原理。

    HTH

    芒露

    【讨论】:

    • 谢谢,Class Loader Viewer 似乎是一个很好的起点。 WebSphere 管理控制台 -> 故障排除 -> 类加载器查看器。唯一的问题是-verbose:dynload 似乎不适用于 WAS 6.0,但我不确定我是否真的需要它。
    • 管理控制台中有一个标志可以在 JVM 上打开详细的类加载。您可以检查一下,这应该适用于所有版本的 WAS
    【解决方案2】:

    对于 WebSphere 6.1,您可以使用“-verbose:dynload”选项(参见WebSphere Application Server V6.1: Classloader Problem Determination Redbook 的第 52 页)。您将在 native_stderr.log 中看到输出

    【讨论】:

    • 我们使用的是 WebSphere 6.0,但此选项似乎不适用于 6.0。服务器启动但初始化失败并且记录的错误是:Could not create the Java virtual machine. [ JVMCI129: Unrecognized verbose option: -verbose:dynload ]。我必须手动编辑 server.xml 文件以删除此选项才能重新启动服务器。
    【解决方案3】:

    您可以尝试使用http://www.jboss.org/tattletale 之类的内容。这可以告诉你哪些罐子没有被使用。

    【讨论】:

    • 如果我理解正确,由于 Java 动态加载类(在下面@maximdim 的回答中),我可能会遇到一个问题,即 jar 没有被引用,而是被加载到代码分支中。 Unused Jar 报告表明 jar 仍可能通过 Java 反射或元数据被引用。如果我运行我的项目并且有理由确定所有代码都已执行,那么此工具能否显示在该运行期间加载的所有 jar?
    • 正如你所说,它的能力有一些例外。我不确定它是否可以报告所有使用过的罐子,它只提到未使用的罐子。
    【解决方案4】:

    这个问题的通用答案可能很棘手。由于 Java 动态加载类,一些 jars/类可能不会被加载,除非你的程序的所有功能都被执行(想想 Class.forName("foo") 作为一个简单的例子)。因此,任何类型的静态依赖分析都可能无法呈现 100% 完整的画面,您可能必须在应用程序执行时分析正在运行的应用程序,最好是触及所有代码分支。

    作为粗略的第一个近似值,要查看是否有根本没有打开的 jar,您可以尝试查看您的操作系统(Unix 上的“lsof”)报告的 webSphere 进程的打开文件列表。应用程序正在运行。如果 jar 没有被列为已打开,这很好地表明它没有被加载/使用,但反向不是必需的,因为 Websphere 可以扫描 jar 以获取注释等。

    【讨论】:

    • 打开的罐子和加载/使用的罐子有什么区别?假设我发现一个jar没有被打开,当需要那个jar的代码分支被执行时它是否仍然有可能被打开?
    • 正确。这就是为什么我说你需要确保尽可能多地执行所有代码分支。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 2016-03-17
    相关资源
    最近更新 更多