Erro Caused by: java.lang.ClassNotFoundException: org.springframework.context.ApplicationContext

13 respostas
java
I

Olá, gente.

Estou com um pequeno problema em relação a conseguir acessar o classPath dentro do meu arquivo .jar.

Eu criei uma pequena API utilizando o spring onde através dela faço acesso ao banco de dados e tenho alguns controles básicos. A API está rodando perfeitamente, fiz até testes com ela inclusive o de acesso ao banco de dados.

Eu gero um jar dessa API que será utilizada dentro de um outro projeto.

O problema se dá nesta situação pois ao tentar acessar o metodo de dentro da minha API dentro do projeto mencionado, aparece o seguinte erro: Caused by: “java.lang.ClassNotFoundException: org.springframework.context.ApplicationContext”

O erro é na seguinte classe. Creio eu que o Spring esteja perdendo o contexto e assim nao encontro o arquivo correto. Algúem já passou por isso?

public class Passaporte implements Serializable {
    
    private static final long serialVersionUID = 8923641112394418196L;

    private ApplicationContext ctx = new ClassPathXmlApplicationContext( getClass().getResource("/arquivo/database-context.xml").toString() );
    
    private ServiceProvider service = null ;
    
    private static Passaporte singleton = new Passaporte();
     
    
    public static Passaporte getInstance( ) {
        return singleton;
    }
    
    
    public static void main(String[] args) {
        
        try {
            
            Passaporte.getInstance().acessar().logar("[email removido]", "teste123", 6);
            
        } catch (NegocioException | MaisDeUmaContaException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }
    
    private Passaporte() {
        setService((ServiceProvider) ctx.getBean("facade"));
    }

    public ServiceProvider acessar() {
        return getService();
    }
    
    private ServiceProvider getService() {
        return service;
    }

    private void setService(ServiceProvider service) {
        this.service = service;
    }
    
}

13 Respostas

R

Ao que parece a sua API usa classes do Spring Framework a biblioteca do Spring não está sendo distribuída junto com seu arquivo .jar gerado.

I

Como eu faço isso?

R

Qual o processo que está usando para gerar o arquivo .jar?

I

Estou usando o eclipse para gerar o .jar

R

Então tente essa sequencia:
-> Export -> Java -> Runnable JAR File -> Package required libraries ... -> Finish

I

Vou fazer um teste aqui. Grato pela ajuda.

I

Agora já está com outro problema e bem estranho por sinal.

Eu importei a API para o meu projeto web em JSF e fiz dois testes:

  1. Teste: invoco a API dentro de um metodo main apenas pra saber se ela vai ser acessada e me retornar os dados. Funcionou perfeitamente.

`public static void main(String[] args) {

try {
            
            Conta c = new Conta();
              c.setDesEmail("[email removido]);
              c.setNumCpf("[telefone removido]");
              
            Passaporte.getInstance().acessar().gerarNovaSenha(c);
            
        } catch (ContaInexistenteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
}`
  1. Teste: eu starto o servidor Tomcat pra rodar minha aplicação WEB em JSF que tem dentro dela o .jar e ao invocar o método que faz acesso a minha API exibe o seguinte erro:

`public void gerarSenhaContaExterna() {

log.info("[INICIO] [GERAR SENHA]");
    
    try {
    
        conta.setDesEmail( conta.getDesEmail() );
        
        log.info("DES EMAIL ---> " + conta.getDesEmail() );
        
        Passaporte.getInstance().acessar().gerarNovaSenha(conta);
    
    } catch (ContaInexistenteException e) {
        e.printStackTrace();
        FacesContext.getCurrentInstance().addMessage( null , new FacesMessage( FacesMessage.SEVERITY_ERROR , e.getMessage() , "") );
        FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add("formProcesso:messages");
        
        return;
        
    }

}

GRAVE: java.lang.NoClassDefFoundError: org/springframework/context/support/ClassPathXmlApplicationContext
`

Quando rodo minha aplicação no tomcat parece que ao buscar acessar a minha API, ela já não encontra mais o contexto.

R

Estranho mesmo. Deve ter algum conflito de bibliotecas no seu tomcat. Confira na pasta lib do tomcat se já não existe lá alguma biblioteca do Spring, ou mesmo na sua aplicação. Por exemplo, você gerou o seu .jar com as bibliotecas do Spring lá dentro. Mas se adicionar as mesmas bibliotecas na lib do projeto que está rodando, podem conflitar, assim como na execução do tomcat.

I

Verifiquei mas o tomcat não tem nada ligado ao spring. Nem mesmo minha aplicação em JSF. Tem apenas as libs do JSF mesmo.

R

Gere o artefato .war e depois descompacte ele e veja se sua biblioteca e as bibliotecas do Spring estão lá dentro. Parece gerar o .war basta ir em:
-> export -> web -> war

I

Sim, acabei de verificar. Ele importa as bibliotecas do projeto em JSF e dentro do (jar) criado por mim também está presente todas as libs que ele utiliza pra funcionar.

Fiz novamente um teste executando dentro de um main e funcionou. Porém, quando inicio o servidor tomcat e uso minha aplicação WEB pra acessar a mesma API exibe o erro que informei acima

R

Talvez seja melhor você remover as libs do Spring de dentro do seu .jar e colocar como libs do projeto, junto com as do JSF. Faça esse teste.

I

Só que nesse caso eu teria que fazer a configuração tanto do JPA quando do Spring na aplicação.

Criado 28 de janeiro de 2016
Ultima resposta 29 de jan. de 2016
Respostas 13
Participantes 2