![Debian 上的 Java 库应该如何工作?](https://linux22.com/image/563902/Debian%20%E4%B8%8A%E7%9A%84%20Java%20%E5%BA%93%E5%BA%94%E8%AF%A5%E5%A6%82%E4%BD%95%E5%B7%A5%E4%BD%9C%EF%BC%9F.png)
我在 Debian Wheezy 上安装 activemq 时遇到了很多麻烦。apt-get install activemq
安装了一个很多软件包 - openjdk-jre + 大量库,据我所知,所有这些库都位于 /usr/share/java 中。使用完全基本的配置,activemq 启动正常,但只要我在配置中添加任何身份验证或授权部分,它就会出现 NoClassDefFound 错误org.objectweb.asm.commons.EmptyVisitor
。这个类肯定是由 /usr/share/java/asm3-all.jar 提供的,它成功地安装在我的系统上,大概是由于 activemq 软件包中指定的依赖项。
那么到底是怎么回事呢?经过一番挖掘,我们发现,运行 activemq 所需的大部分 jar 都是还直接安装在/usr/share/activemq/lib
- 包括 asm3.jar,但关键的是,不包括 asm3-all.jar,因为它包含有问题的类。作为实验,我将 jar 从 /usr/share/java/ 复制到 activemq lib 目录... 一切正常。
所以我的问题是:为什么地球如果 activemq 包实际上没有使用其中任何一个,它是否在 /usr/share/java 中安装了 150+MB 的 jar???在我作为 Java 程序员的日子里,我会假设一个 Java 应用程序只需要捆绑它的所有依赖项并完成它,但 activemq 将所有这些库作为依赖包引入这一事实似乎表明有人不这么认为...或者这只是一个错误?
答案1
我认为我会开始将这种现象称为“Linux 对 Java 的影响”。当您使用 Java 和基于 Java 的应用程序的软件包安装程序时,应用程序将根据一般的 Linux 标准进行安装:/etc 用于配置,/usr 用于二进制文件,/bin 用于可执行文件等。它将代码分散到如此程度,以至于我从未真正理解过它们是如何组织的。作为一名同时使用 RHEL 和 Ubuntu 的 Java 开发人员,我从未使用任何 JDK 或 Java 应用程序的软件包安装程序——尤其是从那时起,我必须记住东西在哪里二发行版。正如您所说,大多数 Java 应用程序只需“下载并解压到...”即可运行。然后所有内容都集中在一个地方,您无需担心在哪里查找内容。
答案2
答案是应该经过一番挖掘,我现在对它的工作原理有了更清晰的认识。activemq 包依赖于libactivemq-java
,它是将所有内容安装在 /usr/share/java 中的包。该activemq
包本身所做的就是从其自己的 lib 目录设置一系列指向 /usr/share/java 的符号链接。因此依赖项是使用的,只是在软件包维护者未能链接实际需要的某个 jar 的情况下(我会将此报告为错误)。似乎意图(无论好坏)是通过软件包管理系统集中安装 Java 库,并由应用程序根据需要使用符号链接进行链接。