java.lang.NoClassDefFoundError: org / hamcrest / SelfDescribing

110

Durante a execução do junitteste, eclipserecebo o seguinte Exception:

java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing

eu já adicionei junit.jar arquivo de biblioteca.

Eu tentei diferentes versões do junit.jar: 4.4,4.8 , etc.

Como faço para corrigir essa exceção?

user2013948
fonte
De acordo com a sua descrição, junit.jarnão está relacionado ao problema
Andremoniy
1
No harcrestjarro, a hierarquia é a mesma? como em org > hamcrest > SelfDescribing, ou está na pasta raiz do jar?
Danyel
1
este erro pode não ser para junit jar, talvez algo em seu projeto precise de outro jar, aqui estão alguns org.hamcrest.SelfDescribing - versões conhecidas
jdurango
1
Obrigado, mas não tenho mais nada no projeto, criei este novo projeto.
user2013948

Respostas:

92

Adicione hamcrest-all-X.X.jarao seu classpath .

A versão mais recente em fevereiro de 2015 é 1.3: http://code.google.com/p/hamcrest/downloads/detail?name=hamcrest-all-1.3.jar&can=2&q=

Jiacai Liu
fonte
2
Como posso adicioná-lo ao classpath ou verificar se ele foi adicionado ou não?
Tomáš Zato - Reintegração de Monica
Concordo, como fazer isso teria sido útil. Felizmente, o comentário abaixo tinha.
MarkII
@ TomášZato primeiro: verifique o arquivo. é hamcrest-all (é importante pegar tudo ). No Idea-IDEs, uma dependência é adicionada 1. copie / cole o arquivo na pasta libs (ou em qualquer outro lugar) 2. clique com o botão direito do mouse no arquivo "adicionar como biblioteca" 3. verifique suas declarações de importação em seus arquivos .java.
Martin Pfeffer,
hamcrest-all-X.X.jaré suficiente enquanto muito menor.
Elist
1
Arquivo --- Estrutura do projeto --- Bibliotecas --- '+' --- Java --- .... jar (você baixou) --- OK, ele aparecerá na 'biblioteca externa'.
Simon Z.
56

De acordo com o site da equipe JUnit GitHub ( https://github.com/junit-team/junit/wiki/Download-and-Install ), junit.jare hamcrest-core.jarsão necessários no classpath ao usar o JUnit 4.11.

Aqui está o bloco de dependência Maven para incluir junit e hamcrest.

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.1.2</version>
    <scope>test</scope>
</dependency>
<!-- Needed by junit -->
<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-all</artifactId>
    <version>1.3</version>
    <scope>test</scope>
</dependency>
jkwuc89
fonte
Estou enfrentando isso em 5 de junho, embora deva funcionar sem ele
Nikhil Sahu
22

Algumas etapas que você deve seguir:

  1. Clique com o botão direito no projeto.
  2. Escolha Build Path A seguir, em seu menu, escolha Add Libraries.
  3. Escolha JUnit e clique em Avançar.
  4. Escolha JUnit4 e depois Concluir.
Muhammed Refaat
fonte
1
Isso consertou para mim. Para quem não está acostumado a usar java / Eclipse, isso foi extremamente útil. Também gostaria de mencionar que os laboratórios fornecidos pelo meu instrutor para a aula tinham uma versão do Junit (3 talvez) que não estava funcionando com o meu laboratório / versão do Eclipse. Tive que removê-lo e adicionar 4 e tudo está bem agora. Muito obrigado.
Tony
Isso não funciona quando você está executando a compilação usando o prompt de comando. Esta é uma solução apenas "IDE".
Partha
16

Funciona para mim: IntelliJ IDEA 13.1.1, JUnit4, Java 6

Mudei o arquivo no caminho do projeto: [PROJECT_NAME] .iml

Substituído:

  <library>
    <CLASSES>
      <root url="jar://$APPLICATION_HOME_DIR$/lib/junit-4.11.jar!/" />
    </CLASSES>
    <JAVADOC />
    <SOURCES />
  </library>

De:

  <library name="JUnit4">
    <CLASSES>
      <root url="jar://$APPLICATION_HOME_DIR$/lib/junit-4.11.jar!/" />
      <root url="jar://$APPLICATION_HOME_DIR$/lib/hamcrest-core-1.3.jar!/" />
      <root url="jar://$APPLICATION_HOME_DIR$/lib/hamcrest-library-1.3.jar!/" />
    </CLASSES>
    <JAVADOC />
    <SOURCES />
  </library>

Portanto, o arquivo .iml final é:

<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
  <component name="NewModuleRootManager" inherit-compiler-output="true">
    <exclude-output />
    <content url="file://$MODULE_DIR$">
      <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/tests" isTestSource="true" />
    </content>
    <orderEntry type="inheritedJdk" />
    <orderEntry type="sourceFolder" forTests="false" />
    <orderEntry type="module-library">
      <library name="JUnit4">
        <CLASSES>
          <root url="jar://$APPLICATION_HOME_DIR$/lib/junit-4.11.jar!/" />
          <root url="jar://$APPLICATION_HOME_DIR$/lib/hamcrest-core-1.3.jar!/" />
          <root url="jar://$APPLICATION_HOME_DIR$/lib/hamcrest-library-1.3.jar!/" />
        </CLASSES>
        <JAVADOC />
        <SOURCES />
      </library>
    </orderEntry>
  </component>
</module>

PS: salve o arquivo e não deixe o IntelliJ Idea recarregá-lo. Só uma vez.

CONVIDADO
fonte
Super incrível !! Me ajuda com meu projeto atual.
MarkII
4

Você precisa do junit-dep.jar porque o junit.jar tem uma cópia das classes antigas do Hamcrest.

Stefan Birkner
fonte
3

Esse problema é devido ao seu classpath miss hamcrest-core-1.3.jar. Para resolver isso, adicione hamcrest-core-1.3.jar ao adicionar junit-4.XX.jar ao seu classpath.

No início, também encontro esse problema, mas depois de consultar o site oficial e adicionar hamcrest-core-1.3.jar ao classpath com linha de comando, ele funciona corretamente finalmente.

javac -d ../../../../bin/ -cp ~/libs/junit-4.12.jar:/home/limxtop/projects/algorithms/bin  MaxHeapTest.java 

java -cp ../../../../bin/:/home/limxtop/libs/junit-4.12.jar:/home/limxtop/libs/hamcrest-core-1.3.jar org.junit.runner.JUnitCore com.limxtop.heap.MaxHeapTest
Santo
fonte
2

Como regra geral, sempre certifique-se de que o hamcrest esteja antes de qualquer outra biblioteca de teste no caminho de classe, pois muitas dessas bibliotecas incluem classes do hamcrest e podem, portanto, entrar em conflito com a versão do hamcrest que você está usando. Isso resolverá a maioria dos problemas do tipo que você está descrevendo.

Ryan Stewart
fonte
2

Caso haja alguém aqui usando netbeans e tenha o mesmo problema, tudo o que você precisa fazer é

  • Clique com o botão direito em TestLibraries
  • Clique em Adicionar Biblioteca
  • Selecione JUnit e clique em adicionar biblioteca
  • Repita o processo, mas desta vez clique em Hamcrest e clique em adicionar biblioteca

Isso deve resolver o problema

Michael Ogala
fonte
Obrigado, isso funciona para mim. Eu já tinha a biblioteca JUnit, mas estava sentindo falta do Hamcrest.
S. Mayol
1

Parece um problema de caminho de classe, portanto, existem algumas maneiras diferentes de fazer isso. De onde vem org / hamcret / SelfDescribing? Essa é sua classe ou em um jarro diferente?

Tente acessar o Caminho de construção do projeto e, na guia Bibliotecas, adicione uma biblioteca. Você deve ser capaz de escolher JUnit para seu projeto. Isso é um pouco diferente do que apenas ter o arquivo jar JUnit em seu projeto.

Em sua configuração de execução para o teste JUnit, verifique o Classpath. Você provavelmente poderia corrigir isso adicionando a garantia de que seu Classpath pode ver essa classe SelfDescribing lá. A opção Executar no Eclipse possui um conjunto diferente de opções para as opções JUnit.

Logan
fonte
não é um problema de classpath, pois eu já adicionei o arquivo de biblioteca junit no caminho de construção, mesmo na biblioteca junit há uma referência a hamcrest, ou seja, C: /devTools/eclipse-SDK-4.2.1-win32-x86_64/eclipse /plugins/org.hamcrest.core.source_1.1.0.v20090501071000.jar
user2013948
obrigado pela sua resposta, testNG está funcionando bem, parece que vou ter que sair em junit
user2013948
Eu estava pensando que o JUnit realmente inicia uma nova JVM quando você executa algo como um teste de unidade. Isso significa que às vezes usa um caminho de classe diferente do seu projeto. Às vezes, para depurar esse tipo de coisa, imprimo o caminho de classe java a partir do meu código, para poder comparar as diferenças quando ele é executado. java-tips.org/java-se-tips/java.lang/…
Logan
1

Se esse problema surgir em um projeto RCP, pode ser porque o JUnit foi importado explicitamente.

Verifique o editor da sua aba plugin.xmlinferior Dependencies, remova dos org.junitPacotes Importados e adicione org.junitaos Plug-ins Requeridos.

Robert F
fonte
1

O problema é quando você configura o eclipse para apontar para JRE em vez de JDK . JRE está junit4.jarna lib/extpasta, mas não hamcrest.jar:) Portanto, a solução é verificar os JREs instalados no Eclipse, remover o existente e criar um novo apontando para o seu JDK .

ACV
fonte
1

a maneira mais simples de resolver o problema para começar é copiar a versão mais recente de hamcrest-code.jar em seu CLASSPATH, que é o arquivo onde você armazena outros arquivos .jar necessários para compilação e execução de seu aplicativo.

que poderia ser, por exemplo: C: / ant / lib

estudiante
fonte
1

Isso acontece quando você executa o Ant via linha de comando. As dependências implícitas do usuário são adicionadas ao classpath no final e têm precedência sobre o classpath adicionado ao projeto. Execute Ant com -nouserlibbandeira. As dependências implícitas seriam excluídas do caminho de classe.

Devendra Sharma
fonte
1

Existe uma resposta melhor para resolver este problema. adicionar dependência

<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-all</artifactId>
    <version>1.3</version>
    <scope>test</scope>
</dependency>
小 messi
fonte
0

Tive o mesmo problema, a solução é adicionar no build path / plugin o jar org.hamcrest.core_1xx, você encontra em eclipse / plugins.

Mohamed Iyeb Abed Rabou
fonte
0

Algumas etapas que você deve seguir:

  • Clique com o botão direito no projeto.
  • Escolha Build Path e, em seguida, no menu, escolha Add Libraries.
  • Escolha JUnit e clique em Avançar.
  • Escolha JUnit4 e depois Concluir.

Isso funciona para mim ...

Karthikraja Loganathan
fonte