如何找出在 Linux 上运行 Java 类需要哪些共享库?

Posted

技术标签:

【中文标题】如何找出在 Linux 上运行 Java 类需要哪些共享库?【英文标题】:How can I find out which shared libraries I need to run a Java class on Linux? 【发布时间】:2013-11-25 17:19:18 【问题描述】:

我想知道在运行特定 Java 应用程序时需要哪些共享库可用。我知道如何获取 Java 解释器 (ldd java) 的库列表,但应用程序会继续使用标准 Java API 中的 GUI 和套接字。

所以基本上我想知道是否有某种方法可以找出 rt.jar 中的标准 Java 类(例如 java.io.Socket 或 javax.swing.JFrame)将在幕后加载哪些共享库,简而言之详尽的路径测试。

TIA!

【问题讨论】:

【参考方案1】:

如果源不可用,那么您可以通过自定义 ClassLoader 加载类并覆盖 loadClass() 以报告正在加载的类:

public class CustomClassLoader extends ClassLoader
    public CustomClassLoader(ClassLoader parent) 
        super(parent);
    

    @Override
    protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException 
        System.out.println(name);
        return super.loadClass(name, resolve);
    


然后使用 JVM 标志 -Djava.system.class.loader=CustomClassLoader 运行所需的类

【讨论】:

@ElliottFrisch 我认为您还必须覆盖findLibrary(),因为每次加载库时都会调用它。 这只会列出加载时的库,因此可能不会列出所有库,除非测试具有 100% 的代码路径覆盖率。 想想看,strace 无需编写新的类加载器就可以完成这项工作。但正如我所说,这只会根据路径覆盖向我显示加载的内容。这不是我想要达到的目标。【参考方案2】:

您可以获得source code,链接在左侧(就在“群组”上方)。显然,它会因JDK而异。假设你想要更多然后ldd java

【讨论】:

正如我所说,我知道 ldd java,但它只揭示了“java”命令本身加载的内容——而不是例如套接字或 GUI。但是,我将尝试在源代码中摸索——至少它不依赖于运行时路径覆盖。不是一个完美的解决方案,但谢谢,我会尝试并报告。

以上是关于如何找出在 Linux 上运行 Java 类需要哪些共享库?的主要内容,如果未能解决你的问题,请参考以下文章

如何找出进程在 Linux 中运行的 PHP 脚本?

如何找出 Linux 上的 GNU C++ 中剩余的可用内存量

找出我的 Java 应用程序在哪个 Java 位版本上运行(C# 和 Java 中需要的解决方案)[重复]

java如何运行,从哪运行?

如何快速找出Linux服务器上不该存在恶意或后门文件

Linux 有问必答:如何知道进程运行在哪个 CPU 内核上?