Debian 上的 Java 库应该如何工作?

hol*_*lef 2 debian java classpath

我刚刚在 Debian Wheezy 上安装 activemq 经历了很多痛苦。apt-get install activemq安装了很多软件包 - openjdk-jre + 大量库,据我所知,所有这些都最终在 /usr/share/java 中。使用完全基本的配置,activemq 可以正常启动,但是一旦我将任何身份验证或授权部分添加到我的配置中,它就会出现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 将所有这些库作为依赖包引入的事实似乎表明有人不这么认为...或者这只是一个球?

小智 5

这就是我认为我将开始在 Java 上称其为“Linux 效应”的东西。当您为 Java 和基于 Java 的应用程序使用包安装程序时,应用程序将根据一般 Linux 标准进行安装:/etc 用于配置,/usr 用于二进制文件,/bin 用于可执行文件等。它将位分散到如此程度我从来没有想过要理解这一切是如何组织的。作为一名同时使用 RHEL 和 Ubuntu 的 Java 开发人员,我从不为任何 JDK 或 Java 应用程序使用包安装程序——尤其是从那时起,我必须记住两个发行版中的内容。正如您所说,大多数 Java 应用程序只需简单的“下载并解压缩到...”即可让它们运行。然后一切都集中在一个地方,毫无疑问在哪里寻找东西。

  • 我们也不为我们的 JVM 和相关的库/工具使用系统管理器。我遇到的另一件事,看起来你也遇到了,是包维护者没有完全测试功能并且不正确地设置了类路径,而改变它并不难,几乎总是意味着拥有一个自定义的 catalina.sh或者 activemq-start.sh 这意味着我们已经偏离了系统包。 (2认同)