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

Popular Posts

Criando arquivos de log com Log4J

Monitorando o Tomcat com Java VisualVM

Gerenciamento de Transações com EJB - Parte 2

Injeção de dependências em Java EE usando @Inject, @EJB e @Resource ?

AngularJS - Formatando Datas com o Filter Date

JBoss AS 7 - Instalação e Configuração

Configurando o arquivo application.properties do SpringBoot

Métodos Utilitários da Classe String

Criando Módulos e DataSources no Wildfly

Criando um Projeto com Spring Boot