Pergunta

Estou desenvolvendo pacotes de OSGI usando o Eclipse. Eu testo o código, usando uma configuração de tempo de execução do Eclipse OSGI.

O código funciona bem lá, mas quando eu exporto os pacotes como potes e tento usá-los em outro ambiente (PAX-RUNNER, por exemplo), recebo exceções de classe no tempo em tempo de execução. Os pacotes estão bem instalados, sem erros. Eu executo o comando no Equinox: "Diag Bundle-Number" e diz: "Sem restrições não resolvidas" para cada pacote.

Gostaria de saber se existe uma ferramenta/método para saber, para um determinado pacote .jar se precisar de alguma biblioteca externa, que não é descrita no manifesto.mf.

Foi útil?

Solução

Seu pacote resolverá se todos os pacotes listados em Import-Package (e os pacotes listados em Require-Bundle) são encontrados em tempo de execução. Se você pegar ClassNotFoundException ou NoClassDefFoundError Depois de resolver, significa que o conteúdo de Import-Package estava errado.

Dê uma olhada no BND Tool de Peter Kriens. Isso executa a inspeção estática do bytecode compilado de suas classes para descobrir as dependências exatas e gera o Import-Package declaração para você. Em geral, se você usar o BND, você nunca deve ver ClassNotFound/NoclassDeffound, a menos que carregue as classes dinamicamente por nome, por exemplo, com Class.forName().

Outras dicas

JBoss acabou de lançar uma fantástica ferramenta de diagnóstico de código aberto sobre dependências: http://jboss.org/tattletale

Um dos recursos é analisar os arquivos JAR por introspecção, encontrar todas as dependências que não possuam.

Eu fiz algo assim há algum tempo (eu estava compilando Java para .NET via IKVM, mas precisava das dependências entre frascos) que usei Jaranalyzer Para criar um gráfico de dependências.

Tive sucesso com a ferramenta Bundlor-Shell da Springsource. Existem instruções para usá -lo aqui. Você dá uma jarra, juntamente com um nome e versão para o novo pacote que deseja criar a partir desse frasco. Em seguida, analisa os arquivos de classe dentro do frasco e produz um modelo manifesto que importa quaisquer pacotes a que encontre referências.

A parte mais difícil é então descobrir quais dependências são opcionais e qual versão de cada pacote para depender. Você precisa ler o site, notas de liberação etc. para a biblioteca descobrir isso.

Você receberá "sem restrições não resolvidas" se o pacote não importar pacotes ou exigir outros pacotes; No que diz respeito ao tempo de execução do OSGI, o pacote será utilizável. Mas assim que acessar uma classe externa, como no seu caso, você receberá o temido ClassNotFoundException.

O ambiente de desenvolvimento de plug-in Eclipse (PDE) fornecerá erros de compilação se o seu código usar classes que não estão listadas no manifesto.mf. As exceções da classe notfound em tempo de execução são frequentemente causadas por marcar incorretamente as importações de pacotes como opcionais - os pacotes resolvem, mas não funcionam. Compilar contra uma versão diferente de um pacote ou pacote do que você está sendo executado também pode causar esse tipo de erro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top