如何找出在 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 上的 GNU C++ 中剩余的可用内存量