Como as Bibliotecas Java no Debian devem funcionar?

2

Acabei de passar por muita dor instalando o activemq no Debian Wheezy. apt-get install activemq instalou um lote de pacotes - openjdk-jre + uma grande quantidade de bibliotecas, as quais acabaram em / usr / share / java até onde eu sei. Com uma configuração completamente básica, o activemq inicializou bem, mas assim que eu adicionei qualquer seção de autenticação ou autorização na minha configuração, ele foi lançado com um erro NoClassDefFound para org.objectweb.asm.commons.EmptyVisitor . Esta classe é definitivamente fornecida por /usr/share/java/asm3-all.jar, que é felizmente instalada no meu sistema presumivelmente como resultado das dependências especificadas no pacote activemq.

Então, o que dá? Depois de um pouco mais de investigação, verifica-se que a maioria dos jars necessários para operar o activemq também são instalados diretamente em /usr/share/activemq/lib - incluindo asm3.jar, mas, crucialmente, não asm3-all.jar , que inclui a classe ofensiva. Como experiência, eu copiei o jar de / usr / share / java / para o diretório activemq lib ... e tudo funcionou bem.

Então, minha pergunta é: por que, em earth , o pacote activemq instalou 150 + MB de jars em / usr / share / java se realmente não usa nenhum deles ??? Nos meus dias como programador Java eu teria assumido que um aplicativo java teria apenas que empacotar todas as suas dependências e acabar com isso, mas o fato de o activemq puxar todas essas bibliotecas como pacotes dependentes parece sugerir que alguém pensa o contrário ... ou isso é apenas uma bola?

    
por hollandlef 08.10.2011 / 19:46

2 respostas

5

Isso é algo que eu acho que vou começar a chamar o "Efeito Linux" em Java. Quando você usa o instalador de pacotes para aplicativos baseados em Java e Java, os aplicativos são instalados de acordo com os padrões gerais do Linux: / etc para config, / usr para binários, / bin para executáveis, etc. Ele espalha os bits de tal forma que eu nunca dei o salto para entender como tudo está organizado. Como desenvolvedor Java trabalhando tanto com o RHEL quanto com o Ubuntu, nunca uso o instalador de pacotes para qualquer aplicativo JDK ou Java - especialmente desde então, eu teria que lembrar onde as coisas estão em duas distribuições. Como você disse, a maioria dos aplicativos Java é um simples "baixar e extrair para ..." para executá-los. Então está tudo em um só lugar, e não há dúvidas sobre onde procurar as coisas.

    
por 08.10.2011 / 21:40
3

A resposta de como isso é suposto funcionar agora é um pouco mais clara para mim depois de algumas pesquisas. O pacote activemq depende do libactivemq-java , que é o pacote que instala tudo em / usr / share / java. Todo o pacote activemq em si é configurar uma série de links simbólicos para / usr / share / java a partir de seu próprio diretório lib. Então as dependências são usadas, é apenas que no caso do mantenedor do pacote falhar em linkar em um dos jars que é realmente necessário (eu reportarei isso como um bug). Parece que a intenção (para melhor ou para pior) é que as bibliotecas Java sejam instaladas centralmente através do sistema de gerenciamento de pacotes e vinculadas pelo aplicativo, conforme necessário, usando links simbólicos.

    
por 09.10.2011 / 16:50