Pular para o conteúdo principal

Maven 3 com Java EE - ClassFormatError: Absent Code attribute in method that is not native or abstract in class file

Olá pessoal, hoje iremos aprender a solucionar um erro estranho que acontece quando trabalhamos com projetos Maven e Java EE.

Especificação Java EE

Como já sabemos, no Java EE tudo segue uma especificação, e cada uma delas possui uma identificação que é chamada de JSR (Java Specification Requests), elas possuem implementações de diferentes fornecedores, um exemplo disso é a JPA (Java Persistence API), que é uma especificação para mapeamento e persistência de objetos relacionais, ela possui várias implementações diferentes, entre elas estão: Hibernate, TopLink, EclipseLink, etc.

Maven e Projetos Java EE

Como vimos nos outros tutoriais sobre o Maven, o desenvolvimento e as configurações do projeto ficam muito simples quando o utilizamos, com Maven podemos setar várias configurações diferentes como: versão de compilação, dependências, plugin para automatizar processos, etc.

Dependência do Java EE

Em um projeto Java EE geralmente trabalhamos com várias especificações, um bom exemplo seria um projeto web dividido em 3 camadas diferentes: Web Tier (JSP, Servlets, JSF), Business Tier (CDI, EJB) e Integration Tier (JPA), para este cenário, podemos setar uma única dependência nas configurações do Maven:


Esta dependência esta localizada no repositório do java.net, ela é apenas composta pela especificação, e não possui nenhuma implementação, nem mesmo corpo nos métodos das APIs.

Exception: ClassFormatError: Absent Code attribute in method that is not native or abstract in class file

Ao tentar executar um teste com algum framework de testes unitários ou até mesmo um método main em nosso projeto, recebemos este erro estranho, ele diz basicamente que a classe esta incompleta e não pode ser utilizada em ambiente de execução. 

Isto acontece, porque a dependência do repositório java.net, é para ser utilizada somente em tempo de compilação, por não ter implementações e nem corpo nos métodos.

Para mais detalhes sobre a exception java.lang.ClassFormatError, consulte o javadoc da classe: http://docs.oracle.com/javase/6/docs/api/java/lang/ClassFormatError.html.

Solução

A solução para este erro  é trocar a dependência para uma completa, neste caso optei pela dependência localizada no repositório da JBoss


Também podemos tratar este erro de maneira mais simples, imagine que em nosso projeto queremos testar apenas o envio de e-mails com a API JavaMail, para isso, não precisamos de toda a infraestrutura do Java EE, basta adicionar a dependência desejada no pom.xml e manter a dependência do java.net, assim a execução acontecerá normalmente:

Até a próxima.

Comentários

Postagens mais visitadas do Blog