Я только что пережил много горя, устанавливая activemq на Debian Wheezy. apt-get install activemq
установил много пакетов - openjdk-jre + множество библиотек, все из которых оказались в / usr / share / java, насколько я могу понять. С полностью базовой конфигурацией activemq запускается нормально, но как только я добавляю какие-либо разделы аутентификации или авторизации в свою конфигурацию, он выдает ошибку NoClassDefFound для org.objectweb.asm.commons.EmptyVisitor
. Этот класс определенно предоставляется /usr/share/java/asm3-all.jar, который успешно установлен в моей системе, предположительно в результате зависимостей, указанных в пакете activemq.
Так что же дает? После некоторого дополнительного изучения выясняется, что большинство jar-файлов, необходимых для работы activemq, являются также установлен непосредственно в /usr/share/activemq/lib
- включая asm3.jar, но, что особенно важно, не asm3-all.jar, который включает класс-нарушитель. В качестве эксперимента я скопировал банку из / usr / share / java / в каталог lib activemq ... и все работало нормально.
Итак, мой вопрос: почему земной шар пакет activemq установил 150+ МБ банок в / usr / share / java, если он на самом деле не использует ни один из них ??? В свое время, будучи программистом на Java, я мог предположить, что приложение java просто должно связать все свои зависимости и покончить с этим, но тот факт, что activemq втягивает все эти библиотеки в качестве зависимых пакетов, кажется, предполагает, что кто-то думает иначе ... или это просто вздор?
Это то, что, я думаю, я начну называть «эффектом Linux» на Java. Когда вы используете установщик пакетов для Java и приложений на основе Java, приложения устанавливаются в соответствии с общими стандартами Linux: / etc для конфигурации, / usr для двоичных файлов, / bin для исполняемых файлов и т. Д. Он разбрасывает биты до такой степени что я никогда не делал шага к пониманию того, как все это организовано. Как Java-разработчик, работающий как с RHEL, так и с Ubuntu, я никогда не использую установщик пакетов для каких-либо приложений JDK или Java - тем более, что тогда мне пришлось бы помнить, где что находится. два дистрибутивы. Как вы сказали, большинство приложений Java можно просто загрузить и распаковать в…, чтобы запустить их. Тогда все в одном месте, и нет никаких сомнений в том, где что искать.
Ответ на вопрос, как это предполагаемый после некоторого покопания мне стало немного яснее работать. Пакет activemq зависит от libactivemq-java
, который устанавливает все в / usr / share / java. Все activemq
Пакет сам по себе устанавливает серию символических ссылок в / usr / share / java из своего собственного каталога lib. Итак, зависимости являются используется, просто в случае, если сопровождающий пакета не смог связать один из действительно необходимых jar-файлов (я сообщу об этом как об ошибке). Казалось бы, намерение (к лучшему или худшему) состоит в том, чтобы библиотеки java устанавливались централизованно через систему управления пакетами и связывались с приложением по мере необходимости с помощью символических ссылок.