sexta-feira, 11 de setembro de 2015

Gradle + Weld problemas para fazer o build ou testes unitários

  Depois de muito tempo quebrando a cabeça com esse erro:
org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type ResourceAccessor with qualifiers

e depois esse:

org.jboss.weld.exceptions.UnsatisfiedResolutionException: WELD-001308: Unable to resolve any beans for Types:

consegui uma solução para os mesmo.

   Primeiro vou explicar o problema:
   Isso ocorre porque a task :build do gradle cria dois diretórios separados para compilação e os resources (build/classes and build/resources). Apenas quando cria o arquivo JAR esses dois diretórios são mesclados. A tarefa :run entretando inicia a aplicação diretamente do diretorio de compilação com os dois classpath para classes e resources.

  O mecanismo do Weld aparentimente tenta descobrir os beans apenas do mesmo classpath que se encontra o arquivo META-INF/beans.xml. Que nesse caso é o diretório build/resources/main. Sendo assim nenhum bean será descoberto e nunca estaram elegível para injeção.

  Para isso temos que fazer uma alteração no build.gradle para que o weld consiga trabalhar como deveria.

sourceSets.main.resources { exclude 'META-INF/beans.xml' }
classes {
inputs.dir 'src/main/resources/META-INF/beans.xml'
outputs.dir "$buildDir/classes/main/META-INF/beans.xml"
} << {
copy {
from('src/main/resources') { include 'META-INF/beans.xml' }
into "$buildDir/classes/main/"
}
}


com isso o beans.xml será copiado para o local onde o Weld consiga encontrar todos o beans. O mesmo deve ser feito para os testes caso contrario os testes continuaram quebrando.

sourceSets.test.resources { exclude 'META-INF/beans.xml' }
classes {
inputs.dir 'src/test/resources/META-INF/beans.xml'
outputs.dir "$buildDir/classes/test/META-INF/beans.xml"
} << {
copy {
from('src/test/resources') { include 'META-INF/beans.xml' }
into "$buildDir/classes/test/"
}
}


pronto com isso consegui resolver essas duas exceptions que me deram muita dor de cabeça. Espero ter ajudado alguém.

fontes: https://discuss.gradle.org/t/application-plugin-run-task-should-first-consolidate-classes-and-resources-folder-or-depend-on-installapp-or-stuff-like-weld-se-wont-work/1248
http://stackoverflow.com/questions/30255760/bean-discovery-problems-when-using-weld-se-with-gradle-application-plugin

Nenhum comentário:

Postar um comentário