我刚刚在Debian Wheezy上安装了activemq。 apt-get install activemq安装了很多软件包 – openjdk-jre + 一大堆库,所有这些都以/ usr / share / java结尾。 使用完全基本的configuration,activemq启动正常,但只要我添加任何身份validation或授权部分到我的configuration,它与org.objectweb.asm.commons.EmptyVisitor的NoClassDefFound错误org.objectweb.asm.commons.EmptyVisitor 。 这个类肯定是由/usr/share/java/asm3-all.jar提供的,它很可能是由于activemq包中指定的依赖关系而安装在我的系统上的。
那么给了什么? 经过一番更深入的挖掘后发现,运行activemq所需的大部分jar 也直接安装在/usr/share/activemq/lib – 包括asm3.jar,但最重要的不是asm3-all.jar包括违规类。 作为一个实验,我从/ usr / share / java /将jar复制到了activemq lib目录中,并且一切正常。
所以我的问题是:为什么地球上的activemq软件包安装了150 + MB的jar子在/ usr / share / java中,如果它实际上不使用任何一个? 在我作为一个Java程序员的日子里,我会假设一个Java应用程序只需要捆绑它的所有依赖关系并完成它,但是activemq将所有这些库作为依赖包引入的事实似乎表明,有人认为…或者这只是一个球?
这是我认为我会开始在Java上调用“Linux效果”的东西。 当您使用Java和基于Java的应用程序的软件包安装程序时,应用程序根据一般Linux标准进行安装:/ etc用于configuration,/ usr用于二进制文件,/ bin用于可执行文件等。它将这些位分散到这样的程度我从来没有飞跃过,理解它是如何组织的。 作为一名使用RHEL和Ubuntu的Java开发人员,我从不使用包安装程序来执行任何JDK或Java应用程序 – 尤其是从那时起,我必须记住事情在两个发行版中的位置。 正如你所说,大多数Java应用程序是一个简单的“下载并提取到…”,让他们运行。 那么这一切都在一个地方,而且在哪里寻找东西是没有问题的。
现在这个应该如何工作的答案现在对我来说有点清楚了。 activemq软件包依赖于libactivemq-java ,它是将所有内容安装在/ usr / share / java中的软件包。 所有的activemq软件包本身所做的就是从它自己的lib目录中build立一系列符号链接到/ usr / share / java中。 所以使用依赖关系,只是在包维护者未能链接到其中一个实际需要的jar文件(我将这个报告为一个bug)的情况下。 看起来好像或者更坏的意图是,Java库通过包pipe理系统集中安装,并且通过应用程序使用符号链接链接到应用程序。