NoClassDefFoundError: nome errado

Eu escrevi um programa java para testar serviços web RESTful usando o Netbeans7.0.1 e funciona bem lá. Agora eu escrevi o arquivo build.xml para compilar o código e quando tento executar o arquivo .class gerado, sempre recebi essa exceção:

Exception in thread "main" java.lang.NoClassDefFoundError: ClientREST (wrong name: clientrest/ClientREST) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632) at java.lang.ClassLoader.defineClass(ClassLoader.java:616) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) at java.net.URLClassLoader.access$000(URLClassLoader.java:58) at java.net.URLClassLoader$1.run(URLClassLoader.java:197) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:248) Could not find the main class: ClientREST. Program will exit. 

O nome e o caminho estão corretos, então, por que estou recebendo essa exceção?

Exceção no thread “main” java.lang.NoClassDefFoundError: ClientREST

Então, você o executou como java ClientREST . Está esperando um ClientREST.class sem nenhum package .


(nome errado: clientrest / ClientREST)

Ei, a class está tentando te dizer que tem um package clientrest; . Você precisa executá-lo a partir do pacote raiz. Suba uma pasta para que você esteja na pasta que, por sua vez, contém a pasta clientrest representa o pacote e, em seguida, execute java clientrest.ClientREST .

Você não deve entrar na pasta do pacote clientrest e executar o java ClientREST .

Eu encontrei este erro usando a linha de comando java:

java -cp stuff/src/mypackage Test

onde Test.java reside no pacote mypackage .

Em vez disso, você precisa definir o classpath -cp para a pasta base, nesse caso, src, e depois prefixar o pacote ao nome do arquivo.

Então vai acabar ficando assim:

java -cp stuff/src mypackage.Test

Para mais detalhes sobre a resposta de Garry: O caminho da class é o diretório base onde a própria class reside. Então, se o arquivo de class está aqui –

/home/person/javastuff/classs/package1/subpackage/javaThing.class

Você precisaria referenciar o caminho da class da seguinte maneira:

/ home / pessoa / javastuff / classs

Então, para executar a partir da linha de comando, o comando completo seria –

java -cp / home / pessoa / javastuff / classs package1 / subpackage / javaThing

ou seja, o modelo para o acima é

java_executable -cp classpath the_class_itself_within_the_class_path

Foi assim que finalmente consegui que o meu funcionasse sem ter o caminho de class no ambiente

Provavelmente, o local em que você está gerando suas classs não existe no caminho da class. Durante a execução, use o jvm arg -verbose durante a execução e verifique o log se a class está sendo carregada ou não.

A saída também lhe dará a pista de onde os clasess estão sendo carregados, certifique-se de que seus arquivos de class estejam presentes naquele local.

Experimente a syntax abaixo:

Suponha que o arquivo java resida aqui: fm/src/com/gsd/FileName.java

Então você pode rodar usando a syntax abaixo:

(Torna o diretório atual para ‘fm’)

java src.com.gsd.FileName