Как должны работать библиотеки Java на Debian?
Я только что пережил много горя, устанавливая 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.
Так что же дает? После более продолжительного копания выясняется, что большинство фляг, необходимых для работы activemq, также устанавливаются непосредственно в /usr/share/activemq/lib
- включая asm3.jar, но, что особенно важно, не asm3-all.jar, который включает класс-нарушитель. В качестве эксперимента я скопировал jar из / usr / share / java / в каталог lib activemq... и все заработало нормально.
Итак, мой вопрос: почему пакет activemq установил 150+ МБ jar-файлов в / usr / share / java, если он фактически не использует ни одного из них??? Будучи программистом на Java, я предполагал, что java-приложение просто должно связать все свои зависимости и покончить с этим, но тот факт, что activemq использует все эти библиотеки как зависимые пакеты, кажется, предполагает, что кто-то думает иначе... или это просто шары?
2 ответа
Это то, что я думаю, я начну называть "Linux Effect" на 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-библиотеки устанавливались централизованно через систему управления пакетами и связывались с приложением по мере необходимости с помощью символических ссылок.