Skip to content

Resolvendo dependências de bundle OSGi

Nos meus primeiros dias construindo bundles para AEM, eu me habituei à seguinte mensagem no error.log:

*INFO* [OsgiInstallerImpl] org.apache.sling.installer.core.impl.tasks.BundleStartTask Could not start bundle com.acme.samples.aem.bundledependency.samples-bundle-dependency-bundle [457]. Reason: {}. Will retry. org.osgi.framework.BundleException: Unresolved constraint in bundle com.acme.samples.aem.bundledependency.samples-bundle-dependency-bundle [457]: Unable to resolve 457.14: missing requirement [457.14] osgi.wiring.package; (&(osgi.wiring.package=org.apache.commons.beanutils)(version>=1.9.0)(!(version>=2.0.0))) at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:4095)

Clique para ver o log detalhado...

17.12.2016 07:02:04.956 *INFO* [OsgiInstallerImpl] org.apache.sling.audit.osgi.installer Done refreshing 1 bundles 17.12.2016 07:02:04.960 *INFO* [OsgiInstallerImpl] org.apache.sling.installer.core.impl.tasks.BundleStartTask Could not start bundle com.acme.samples.aem.bundledependency.samples-bundle-dependency-bundle [457]. Reason: {}. Will retry. org.osgi.framework.BundleException: Unresolved constraint in bundle com.acme.samples.aem.bundledependency.samples-bundle-dependency-bundle [457]: Unable to resolve 457.14: missing requirement [457.14] osgi.wiring.package; (&(osgi.wiring.package=org.apache.commons.beanutils)(version>=1.9.0)(!(version>=2.0.0))) at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:4095) at org.apache.felix.framework.Felix.startBundle(Felix.java:2114) at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:977) at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:964) at org.apache.sling.installer.core.impl.tasks.BundleStartTask.execute(BundleStartTask.java:93) at org.apache.sling.installer.core.impl.OsgiInstallerImpl.doExecuteTasks(OsgiInstallerImpl.java:847) at org.apache.sling.installer.core.impl.OsgiInstallerImpl.executeTasks(OsgiInstallerImpl.java:689) at org.apache.sling.installer.core.impl.OsgiInstallerImpl.run(OsgiInstallerImpl.java:265) at java.lang.Thread.run(Thread.java:745) 17.12.2016 07:02:04.961 *INFO* [OsgiInstallerImpl] org.apache.sling.installer.core.impl.tasks.RestartActiveBundlesTask Unable to start bundle com.acme.samples.aem.bundledependency.samples-bundle-dependency-bundle [457] : Unresolved constraint in bundle com.acme.samples.aem.bundledependency.samples-bundle-dependency-bundle [457]: Unable to resolve 457.14: missing requirement [457.14] osgi.wiring.package; (&(osgi.wiring.package=org.apache.commons.beanutils)(version>=1.9.0)(!(version>=2.0.0)))

E ao resultado abaixo, ao verificar o estado do meu bundle em http://<host-aem>:<porta-aem>/system/console/bundles/<bundle-id>

AEM Web Console - Bundle - Dependência não pôde ser resolvida

Ambos significando que o AEM não conseguia resolver as dependências do meu bundle, em tempo de implantação.

Se você se encontrar na mesma situação, você pode

Usar classes exportadas por outro bundle

Por padrão, o AEM tem vários bundles implantados e um deles pode estar exportando as classes que você procura. Você só precisa descobrir quais versões estão sendo exportadas e adicionar a versão correta ao seu projeto, como dependência.

Digamos que você tenha um projeto baseado em Maven e queira usar a Apache Commons Lang. Então:

Nota: A instalação de novas bibliotecas como bundles será explorada em postagem futura.

Ou incorporar classes ao seu próprio bundle

Apache Felix Maven Bundle Plugin pode ajudá-lo nisso!
Suponha que você tenha um projeto beasedo em Maven e queira usar a Apache Commons BeanUtils. Então:

1. Adicione a dependência ao seu POM

  • Acesse https://mvnrepository.com/;
  • Digite commons beanutils;
  • Clique em Search;
  • Selecione qualquer versão que dependa de commons-collections 3.2.1;
  • Copie o conteúdo da tab Maven;
  • Cole-o no seu POM pai, adicionando <scope>compile</scope>;
  • Cole-o em seu POM filho, removendo as tags <version> e <scope>;

2. Instrua o plugin de Bundle a incorporar a dependência

  • Abra seu POM filho;
  • Localize a tag <instructions> do maven-bundle-plugin;
  • Adicione o seguinte a ela:
<!-- embed all compile and runtime scope dependencies -->
<Embed-Dependency>*;scope=compile|runtime</Embed-Dependency>

Este projeto de exemplo mostra o problema em ação e também os detalhes sórdidos sobre como resolvê-lo.

Para maiores informações sobre a resolução de bundle OSGi, por favor, acesse o artigo Understanding how OSGI bundles get resolved part I do Christian Posta.

E não perca minha postagem sobre dependências transitivas, possíveis erros e como resolvê-los!

Seja o Primeiro a Comentar

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *