Eclipse - java.lang.ClassNotFoundException


95

Ao tentar iniciar meu JUnit-Test fora do Eclipse, recebo uma "ClassNotFoundException". Ao executar o "teste mvn" no console - tudo funciona bem. Além disso, não há problemas relatados no Eclipse.

A estrutura do meu projeto é a seguinte:

  • projeto pai (empacotamento pom)
    • Projeto da Web (war-packaging - meu JUnit-test está aqui)
    • Projeto flex
    • Projeto de configuração

editar: Como a classe não pode ser encontrada? É um aplicativo HelloWorld simples, sem bibliotecas especiais.

Esta é a configuração de execução do meu JUnit: texto alternativo http://www.walkner.biz/_temp/runconfig.png


Testclass (mas como eu disse; também não funciona com um HelloWorld simples ...):

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import biz.prognoserechnung.domain.User;
import biz.prognoserechnung.domain.UserRepository;
import biz.prognoserechnung.domain.hibernate.UserHibernateDao;

public class UserDaoTest {
/**
 * the applicationcontext.
 */
private ApplicationContext ctx = null;

/**
 * the user itself.
 */
private User record = null;

/**
 * Interface for the user.
 */
private UserRepository dao = null;

@Before
public void setUp() throws Exception {
String[] paths = { "WEB-INF/applicationContext.xml" };
ctx = new ClassPathXmlApplicationContext(paths);
dao = (UserHibernateDao) ctx.getBean("userRepository");
}

@After
public void tearDown() throws Exception {
dao = null;
}

@Test
public final void testIsUser() throws Exception {
Assert.assertTrue(dao.isUser("John", "Doe"));
}

@Test
    public final void testIsNoUser() throws Exception {
    Assert.assertFalse(dao.isUser("not", "existing"));
        Assert.assertFalse(dao.isUser(null, null));
        Assert.assertFalse(dao.isUser("", ""));
    }
}

3
Recebo o mesmo erro ao tentar executar uma classe HelloWorld simples sem JUnit incluído ... Mais exatamente: java.lang.NoClassDefFoundError: HelloWorld Causado por: java.lang.ClassNotFoundException: HelloWorld
swalkner

ClassNotFoundException é lançada ao tentar refletir sobre uma classe. NoClassDefFoundError é lançado quando você está tentando usar a classe em uma chamada de método normal.
akf

você pode mostrar o código para sua classe de teste?
akf

você tem a compilação ativada ou desativada automaticamente?
Jon

construir automaticamente é ativado
swalkner

Respostas:


193

Já me deparei com essa situação várias vezes e, depois de muitas tentativas, encontrei a solução.

Verifique o caminho de construção do seu projeto e habilite pastas de saída específicas para cada pasta. Vá um por um através de cada pasta-fonte do seu projeto e defina a pasta de saída que o maven usaria.

Por exemplo, seu projeto da web src/main/javadeve ter target/classessob o projeto da web, as classes de teste target/test-classestambém devem ter no projeto da web e assim.

Usar esta configuração permitirá que você execute testes de unidade no eclipse.

Apenas mais um conselho, se os testes do seu projeto da web exigirem alguns arquivos de configuração que estão nos recursos, certifique-se de incluir essa pasta como uma pasta de origem e de fazer a configuração do caminho de construção adequada.

Espero que ajude.


1
Oi Carlos, muito obrigado pelo seu conselho. Mas não ajudou, infelizmente. Eu adicionei / src / main / java (target / classes) e / src / test / java (target / test-classes) às pastas de origem, bem como src / main / resources (applicationContext.xml, algumas propriedades - target / classes ) Mesmo problema - ao iniciar meu src / test / java / UserDaoTest.java como JUnit-test do Eclipse, recebo "Classe não encontrada UserDaoTest java.lang.ClassNotFoundException: UserDaoTest". Pelo menos, isso é um pouco diferente da mensagem de erro original ...
swalkner 01 de

5
Você está no caminho certo, verifique se a classe UserDaoTest está na pasta de saída correspondente dentro do seu sistema de arquivos (como você deve saber, o Eclipse compila todos os seus arquivos de origem e os coloca na pasta de saída especificada, entre outras, para serem capaz de lançar testes). Se a classe não aparecer na pasta de saída, verifique os filtros de inclusão / exclusão do caminho de construção para esta pasta específica. Boa sorte.
Carlos

Para mim, isso não resolveu o problema. Descobri que era um problema de AspectJ. Se você estiver usando o AspectJ, tente remover e ler os recursos do AspectJ - funcionou para mim
Stefan Haberl

1
Teve o mesmo problema. Eu acho que é um projeto de eclipse - maven - problema git. Isso não limita realmente, mas limpando todas as pastas de metadados (.projeto, .qualquer coisa ...), excluindo o projeto e reimportando apenas como um projeto maven funcionou para mim. Também descobri algo que o eclipse-junit não podia fazer: destacar o método de teste e selecionar RunAs-Junit executa apenas aquele método de teste específico, não o teste inteiro! Não há mais @Ignoreatalhos em todo o lugar e gui!
bgs de

Estava enfrentando o mesmo problema, eu simplesmente usei Eclipse -> Projeto -> limpar e funcionou. Mvn limpo não funcionou.
Nutan

46

A abordagem do Carlos ajudou! Eclipse - java.lang.ClassNotFoundException

Tente verificar o caminho de classe da configuração do junit run:

  1. Abra suas configurações de corrida
  2. Clique no jUnit-Test que deseja iniciar
  3. vá para a guia do caminho de classe
  4. Tente adicionar uma pasta (clique nas entradas do usuário, clique em avançado, clique em adicionar pastas, clique em ok e pesquise a pasta de saída para suas classes de teste (aquelas que você encontra em projektproperties caminho de construção java, fonte))

funciona para mim.


2
Não é muito estranho? Funcionou para mim, mas o diretório de classes de destino faz parte do classpath de construção do projeto. Não faz muito sentido você precisar adicionar uma classe específica.
Jose Muanis

Não acho que essa ação necessariamente adiciona um diretório necessário, tanto quanto aciona algo para ser recarregado. Você provavelmente pode remover imediatamente o diretório recém-adicionado após uma execução bem-sucedida e ele deve funcionar normalmente. Além disso, o comentário acima está certo. Pode querer votar a favor do elogio referenciado de Carlos também.
awied

Descobri que a resposta para outra pergunta do SO é mais útil para este problema: stackoverflow.com/a/5718520/901641
ArtOfWarfare

16

seu classpath de construção está correto, é por isso que você pode compilar. o classpath para seu JUnit precisa ser verificado. vá para o menu Executar e escolha 'abrir caixa de diálogo de execução'. lá você deverá ver uma árvore à esquerda com JUnit como opção. abra esse nó e encontre e selecione seu teste. no painel direito, você verá uma guia para classpath. verifique se a classe que o teste está tentando instanciar será encontrada.

editar:

isso parece ser um problema com o maven e seu comportamento após uma versão alterar as pastas de saída padrão do Eclipse. Eu vi soluções descritas onde

  • colocar maven no bootclasspath ACIMA do jre funciona, ou
  • correr mvn clean testfaz o truque ou
  • atualizar todos os seus projetos eclipse, causando uma reconstrução, corrige o problema
  • indo para o seu projeto e selecionando Maven-> Atualizar configuração resolve o problema

com os três primeiros, houve relatos de recorrência do problema. o último parece melhor para mim, mas se não funcionar, tente os outros.

aqui e aqui estão algumas informações


1
infelizmente, "Maven => Atualizar configuração" não resolve o problema de forma alguma ... o inverso é verdadeiro; ele deleta as configurações do caminho de construção ... Ou isso significa que alguma outra configuração está ruim?
swalkner 01 de

Exatamente como @swalkner apontou: Maven => Atualizar configuração irá arruinar a configuração do caminho de construção. Por alguma razão que me escapa, o plugin irá definir filtros de exclusão que sempre tenho que remover manualmente após executar o comando
Stefan Haberl

"vá ao menu Executar e escolha 'abrir caixa de diálogo de execução'. Huh ?? Onde fica isso?
Berit Larsen

4

O problema pode estar faltando o arquivo de classe em sua pasta de construção. Uma solução é limpar o projeto e reconstruí-lo.


4

Ativar [x] Use JAR temporário para especificar o classpath (para evitar limitações de comprimento do classpath) dentro da guia Classpath da configuração Run funcionou para mim.

Se o seu projeto for enorme e você tiver muitas dependências de outros projetos irmãos e dependências do maven, você pode atingir as limitações de comprimento do classpath e esta parece ser a única solução (além de tornar o diretório para seu repositório local do maven mais curto (o nosso já começa em c: / m2)

insira a descrição da imagem aqui


3

Existem muitas sugestões complicadas aqui.

Eu encontrei esse problema várias vezes com projetos Maven depois de mover recursos arrastando e soltando ou executando a refatoração de nomes de classes.

Se isso ocorrer, simplesmente copie (não mova) o Caso de Teste com problema ( .java) via terminal / navegador de arquivos para outro local,right-click -> Delete no Eclipse e escolha excluir no disco quando tiver a opção de mover / copiar o arquivo copiado para o local do arquivo original, em seguida, selecione seu projeto no Eclipse e pressione F5 para atualizar os recursos.

Isso é rápido e fácil de fazer e sempre corrigiu o problema para mim.


Estou tentado a perguntar se isso resolveu seu problema permanentemente ou sempre ... mas entendi o que você quis dizer e, surpreendentemente, isso funcionou para mim.
Amos M. Carpenter

3

Eu tive exatamente o mesmo problema, mas descobri! Vá para o arquivo do seu projeto e clique com o botão direito sobre ele, a seguir clique Refreshou pressione F5. Em seguida, tente executá-lo. Se ainda não funcionar, esqueça, pois tive o mesmo problema EXATA e isso significa apenas que sua versão do Eclipse é um lixo.



2

Sachin está certo: Mesmo com o caminho de classe correto, a guia de problemas mostrará que alguma dependência ou o Recurso / projeto tem um erro que precisa ser corrigido para que o maven construa e crie classes automaticamente quando você cria ou faz uma mudança em sua classe de teste .

"Oi,

É julho muito antigo (que ano), mas eu tive o mesmo problema.

O problema real descobriu que o eclipse não foi capaz de gerar o arquivo de classe para o arquivo java, o classpath era adequado.

Veja a aba de problemas e verifique se está faltando algo / arquivo em seu projeto. você pode criar um novo proj e adicionar arquivos um por um e construí-los até que ele pare de compilar e criar classes (verifique o workspace / proj / bin / package / folder para classes)

é estranho, mas é verdade, o ecplise estava falhando na conclusão porque 4 dos 20 arquivos java estavam usando uma única imagem que estava faltando. e, como resultado, nenhum arquivo java foi compilado.

CLASSPATH não é um problema aqui. "


2

Tivemos a exceção exata (usando SpringSource Tools, tomcat, no Win7) e a causa foi que refatoramos um nome de arquivo (renomeado um arquivo) de SubDomain.java para Subdomain.java (D vs d) e de alguma forma colidiu embora SpringSource fosse mostrando o novo nome Subdomain.java. A solução foi deletar o arquivo (via SpringSource) e criá-lo novamente com o nome Subdomain.java e copiar e colar seu conteúdo anterior. Simples assim.


Sempre executei casos de teste Junit, até executar o programa que verifica a compatibilidade do PC antes de atualizar o Windows. Isso parece precisar de alguma coisa, não consigo executar os casos de teste JUnit novamente. (e todas as respostas existentes não funcionam)
CoffeDeveloper

2

Eu resolvo esse caminho Bulit ---> bibliotecas ---> adicionar biblioteca ---> Junit check junit4


1

clique em project->properties->Java build path->Sourcee verifique se cada srcpasta ainda é válida, existe ou foi removida recentemente. Corrija qualquer caminho ausente ou incorreto, reconstrua e execute o teste. Isso vai resolver o problema.


1

Tudo que fiz foi Propriedades -> Caminho de construção Java -> Pedido e exportação -> Habilitei todas as caixas desmarcadas -> movi o Junit totalmente para cima


1

Tentou

Link : [here][1]

Open your run configurations
Click on the jUnit-Test you want to start
go to the classpath tab
Try to add a folder (click on user entries, click on advanced, click on add folders,click on ok and search the outputfolder for your test classes(those you find under projektproperties java build path, source))

trabalhou depois

Maven 2 LifeCycle >> teste


1

Eu tentei todas as soluções nesta página: atualizar o projeto, reconstruir, todos os projetos limpos, reiniciar o Eclipse, reimportar (até) os projetos, reconstruir o maven e atualizar. Nada funcionou. O que funcionou foi copiar a classe para um novo nome que funcione bem - bizarro, mas verdadeiro.

Depois de aguentar isso por algum tempo, resolvi:

  1. Através do Runmenu
  2. Selecione Run Configurations
  3. Escolha a configuração de execução associada ao seu teste de unidade.
  4. Remover a entrada Run Configurationpressionando delete ou clicando no X vermelho.

Algo deve ter errado com a configuração de execução em cache.


1
Depois de muito tempo perdido, acabei fazendo os passos acima. Então, tomei uma decisão heróica de excluir todas as configurações de teste de execução e agora nenhum dos meus testes pode ser encontrado no caminho de classe, embora a nova configuração de execução mostre claramente o projeto nele (com dependências de maven embaixo). Eu sempre me esqueço de como o eclipse é frágil. Depois disso, nenhum teste poderia ser executado com o eclipse (antes que eu pudesse selecionar um teste específico - ok). Finalmente, experimentei a sugestão KomodoDave abaixo. Isso consertou as coisas ... surpreendentes os loops que você tem que pular com este ide (o mais recente de uma série ..)
justin

1

Excluir o projeto do eclipse (não do disco rígido), que de certa forma está limpando o espaço de trabalho e reimportando o projeto para o eclipse, funcionou para mim.


1

Normalmente, esse problema ocorre ao executar a javaferramenta de aplicativo java, incapaz de encontrar o arquivo de classe.

Principalmente no projeto maven, vemos esse problema devido ao problema de sincronização Eclipse-Maven . Para resolver este problema: Maven-> Atualizar configuração


0

Você já tentou clicar com o botão direito do mouse na raiz do seu projeto, selecionando "propriedades" e verificando se o CLASSPATH está correto? Se bem me lembro, é assim que você faz.

Alguma coisa sobre a maneira como o Eclipse executa testes de unidade que exige que você adicione o JAR junit ao CLASSPATH de tempo de execução de uma maneira especial?

Eu uso o IntelliJ, então não tenho esses problemas.

Eu mesmo verificaria o Eclipse, mas prefiro não tê-lo na minha área de trabalho.


ok, sem levar a uma discussão sobre Eclipse vs. IntelliJ; Gostaria de tê-lo em execução no Eclipse ... e verifiquei o Java Build Path - o Java JDK está lá, e não preciso de mais nada para o meu exemplo HelloWorld ... Acho que tem algo a ver com 'pastas de origem no caminho de construção' ... Eu as defini para a pasta onde meu pacote começa ... presumo que esteja correto.
swalkner de

Você precisa de algo além do JDK - esse é o caminho para HelloWorld.class, certo? "pastas de origem no caminho de construção" - soa melhor. Não há necessidade de assumir, seja um experimentalista e experimente. O Eclipse dirá se você está correto.
duffymo

0

Hmm, parece um pouco bizarro, tente executá-lo com a seguinte anotação no início da aula:

@RunWith(SpringJUnit4ClassRunner.class)
public class UserDaoTest {
}

e me diga como você está lidando com isso.

Verifique se você também ativou a compilação automaticamente. Se você quiser ter certeza de que suas classes de teste estão sendo compiladas corretamente, limpe a pasta de destino Maven (e qualquer pasta bin que o Eclipse possa estar usando). Você também está usando m2eclipse, pois acho um pouco problemático.


muito obrigado pela sua resposta, mas mesmo assim: também não funciona; primeiro, tenho que incluir spring-test.jar, então outra dependência não é preenchida. não entendo por que não funciona com uma classe helloworld simples no mesmo pacote. e aí, não preciso de um "hack" como o sugerido por você ... algo deve estar errado com "classpath" ou algo semelhante, mas não entendo onde / o que devo verificar ...
swalkner

0

A solução para o meu problema era semelhante: as libs eram inválidas. Se você olhar no arquivo .classpath do projeto, verá as tags classpathentry com a chave / valor kind = "lib". Algumas das minhas estavam incorretas.

Eu não descobri isso até desligar as configurações de validação. Ou seja, havia tantos erros nos arquivos JSP, etc, que os erros do classpath não eram evidentes (ou possivelmente apareciam). Como resultado, nada estava sendo compilado nas pastas de saída de destino, mas nenhum erro útil sobre o motivo.


0

Aponte para corrigir o JDK em Windows> Preferências> Java> JRE instalado.

Não aponte para jre, aponte para um JDK adequado. Apontei para o JDK 1.6U29 e atualizei o projeto.

A partir de agora, o problema desapareceu e os testes jUnit estão funcionando bem.

Obrigado,
-Tapas


0

Eu encontrei o mesmo erro no Eclipse recentemente, ou seja, o IDE do Eclipse não conseguiu encontrar a classe de teste de unidade, não importa como eu alterei as configurações. Aprendendo com as postagens anteriores aqui e em outros sites, verifiquei duas vezes e três vezes o classpath e as informações de origem, e movi para cima e para baixo a pasta de origem e as bibliotecas, tanto em "Run Configuration" quanto em "Java Build Path "config windows e também limpei o projeto e o reconstruí, mas nenhum dos truques funciona para mim. O projeto Java específico é um projeto antigo compilado ANT e tem muitos jars incluídos na biblioteca Eclipse.

Em seguida, alterei a classe de teste de unidade para adicionar um método main () e clique com o botão direito para "Executar como" um aplicativo Java em vez do teste JUnit e, de repente, o Eclipse parece despertar e identificar a classe corretamente. Depois disso, mudei de volta para um aplicativo de teste de unidade e ainda está funcionando.

Este parece ser um bug no Eclipse, estou supondo que o grande número de bibliotecas (> 260) pode confundir a capacidade da JVM de localizar minha classe JUnit.


0

Eu também fui atingido com esse problema e consegui encontrar uma solução suficiente para o meu caso. Se o seu projeto Eclipse tiver um arquivo .classpath na raiz do projeto (veja-o na visualização Navigator em vez da visualização Package Explorer), certifique-se de que o seu caminho de classe Maven apareça antes do seu caminho de classe JRE Container.

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
</classpath>

Se o seu projeto não tiver um arquivo .classpath, você pode editar o caminho de construção Java do projeto para alternar o pedido e a exportação. Se o seu projeto tiver o arquivo .classpath e você alterar sua ordem apenas no Java Build Path, verá que a ordem não foi afetada e o problema continuará a ocorrer.

E um projeto-> limpo nunca prejudica as coisas depois que você faz a mudança.


0

Certifique-se de que sua configuração de inicialização de teste NÃO contenha as seguintes linhas OU tente habilitar o gerenciamento de dependência Maven automatizado.

<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.maven.ide.eclipse.launchconfig.classpathProvider"/>
<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.maven.ide.eclipse.launchconfig.sourcepathProvider"/>

0

Tentei tudo o que li neste longo post e, incrivelmente, o que funcionou para mim foi, ao invés de clicar na classe de teste e selecionar Run as JUnit test, clicar no método de teste e executar como JUnit test. Eu não tenho ideia do porquê?


0

O teste JUnit de dentro do eclipse também me deu NoClassDefFoundError. Executar 'mvn clean test' na linha de comando deu-me o seguinte erro em vários jars: cabeçalho LOC inválido (assinatura incorreta) Excluir esses jars do repositório local m2 e executar 'mvn clean test' novamente resolveu meu problema.


0

Eu tive o mesmo problema. Tudo o que eu fiz foi,

Eu). Artefatos de Eclipse gerados

mvn clean eclipse:eclipse

ii). Atualize o projeto e execute novamente o teste junit. Deve funcionar bem.


0

Além disso, DOUBLE-CHECK a caixa de diálogo eclipse "Web Deployment Assembly".

Isso pode ser encontrado: Propriedades do projeto-> Montagem de implantação.

Recentemente, um plug-in do eclipse modificou um dos meus projetos da web e adicionou ~ misteriosamente ~ adicionou os diretórios de teste maven / src / test / java, / src / test / resources ao Deployment Assembly. UGGGG !!!

É por isso que meu projeto funcionou bem quando eu construí e implantei apenas o maven direto no tomcat, sem ClassNotFoundExceptions ... No entanto, quando fiz a implantação através do Eclipse, Whammo !! Começo a obter ClassNotFoundExceptions porque o TestCode está sendo implantado.

Eric


0

Isso significa que seu pom.xml tem problemas não resolvidos. Abra a visualização de problemas e resolva de acordo. Então, você poderá executar os casos de teste com êxito, sem encontrar a exceção classnotfound.


0

Alterar a ordem dos artefatos de classpath no Java Build Path resolveu para mim.

  1. Clique com o botão direito no projeto e vá para o caminho de construção do projeto.
  2. Vá para a guia Order and Export e mova a biblioteca do sistema JRE para depois das fontes.

Isso deve consertar.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.