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 deste blog

Utilizando LocalDate, LocalDateTime e LocalTime na Prática

Tudo bem pessoal, hoje iremos avaliar e analisar operações de manipulação de Datas envolvendo a JavaTime API introduzida no Java 8.

Exemplos da java.time API
Já se passaram alguns anos desde o lançamento do Java 8 e mesmo após este período, há empresas que desconhecem o poder da java.time API, esta foi uma nova API de datas introduzida no Java 8 visando resolver problemas que tínhamos com as velhas classes Date e Calendar.

Vamos mostrar vários exemplos práticos do uso da API:
Criação de objetos No exemplo abaixo, estamos criando os objetos para manipulação de datas, perceba que temos 3 tipos, sendo LocalDate para manipular datas, LocalDateTime para manipular data/hora e LocalTime para horas:
LocalDate localDate = LocalDate.now(); LocalDateTime localDateTime = LocalDateTime.now(); LocalTime localTime = LocalTime.now();
Utilizando formatação Aqui realizamos a operação de formatação, perceba que não foi necessário utilizar a classe SimpleDateFormat, que usaríamos em conjunto com D…

Lendo e Manipulando arquivos CSV com Java

Olá hoje veremos como realizar a leitura e manipulação de arquivos CSV com Java, mostrando que as novas versões da plataforma Java deixaram algumas tarefas simples de serem realizadas.

Exemplo de Arquivo Hoje em dia é comum ao realizar integrações ou carga de dados o uso de arquivos CSV, isto porque, este arquivo possui uma estrutura de fácil entendimento e simples de manipular na maioria das plataformas de desenvolvimento.

Para realizar a leitura dos dados vamos manipular um arquivo com as seguintes colunas: namecpfagephone address:

name;cpf;age;phone;address caio;123456789;20;1145223643;AvenidaPaulista vinicius;147852369;18;1125253625;AvenidaManoel sandra;963258741;30;1174587858;RuaTeixeira regina;125478522;40;1145254536;RuaFernando fernando;785245563;42;1145253669;RuaPereira augusto;456123014;50;1125363633;AvenidaPaulinia maria;456123789;10;1125455525;AvenidaNossaSenhora
Para representar os dados em objetos Java iremos utilizar a seguinte classe:

importlombok.AllArgsConstruc…

Versionamento de Banco Dados com Flyway

Olá pessoal, hoje iremos analisar e aprender como realizar o versionamento e gerenciamento das bases de dados relacionais utilizando o framework Flyway.

Versionamento de Banco Dados Ao trabalhar com desenvolvimento de sistemas é comum realizarmos o versionamento, isso porque uma aplicação pode necessitar de correções, novas funcionalidades e evoluções, onde para garantir a compatibilidade e cuidar do seu ciclo de vida, geramos versões onde é especificado quais itens estão presentes em cada release.
Vamos imaginar seguinte cenário: Sistema ERP1.0.0: Entrega dos módulos Financeiro e RH;1.1.0: Entrega do módulo Contas a Receber. Perceba que a ideia é controlar o que cada versão possui de diferente, e para controlar essas mudanças no lado da aplicação existem várias técnicas e ferramentas, mas e para controlar as mudanças no lado do Banco de dados ? 
Para isso podemos utilizar ferramentas de versionamento que ajudam a realizar este controle, a ferramenta que iremos utilizar é o Flyway.
Con…