Como resolvo ClassNotFoundException?

106

Estou tentando executar um aplicativo Java, mas recebo este erro:

java.lang.ClassNotFoundException:

Depois dos dois pontos, vem a localização da classe que está faltando. No entanto, sei que esse local não existe, pois a classe está localizada em outro lugar. Como posso atualizar o caminho dessa classe? Tem algo a ver com o caminho da aula?

user2426316
fonte
1
Você deve adicionar o jar que tem a classe ausente ao classptah
Crom
se a sua classe tiver um pacote, vá para a pasta que contém a classe. por exemplo, se o pacote for o pacote test.abc, vá para a pasta antes de testar e execute java -cp. test.abc.CLASSNAME (sem .class). Se não houver pacote, vá para a pasta que contém a classe e diga java -cp. CLASSNAME
Opcional
Ou uma classe não foi implantada em seu tempo de execução (por exemplo, jar ausente), ou a classe não está visível em um determinado carregador de classes, verifique esta ferramenta que ajuda a solucionar esses problemas: jhades.org
Angular University
1
Eu também me deparo com isso às vezes. Essa exceção viola claramente a regra de declarar todo o contexto necessário em uma mensagem de exceção. Deve mencionar onde tentou procurar a coisa, o que está no seu classpath. Faça mensagens de exceção melhores. Não nos obrigue a buscar informações que possam nos ajudar a resolver o problema.
masterxilo

Respostas:

32

Seu classpath está corrompido (o que é um problema muito comum no mundo Java).

Dependendo de como você inicia seu aplicativo, você precisa revisar o argumento para -cp, sua entrada Class-Path em MANIFEST.MF ou seu layout de disco.

Thorbjørn Ravn Andersen
fonte
34
Você pode ser mais específico sobre eclipses? O que eu tenho que fazer?
user2426316
24
Sua pergunta não contém informações suficientes para fornecer uma resposta mais específica. Considere adicionar isso.
Thorbjørn Ravn Andersen
A incompatibilidade de resolução / versão de dependência é um problema muito comum em basicamente todos os ambientes de programação. Poderíamos dizer que tudo o que qualquer programa faz é resolver tais definições ... a questão é sempre qual / onde está a definição e qual versão você quis dizer?
masterxilo
2
Estou apenas enfatizando que, além do mundo Java, todos os softwares têm uma luta para garantir que as versões corretas das dependências sejam encontradas. Posso citar dll-hell, gerenciadores de pacotes, gerenciadores de versão, lista de materiais do Spring Boot e containers docker como exemplos deste problema e possíveis soluções. Quanto maior se torna a fração de código estrangeiro, maior se torna o problema.
masterxilo
@masterxilo Sim, mas esse não é necessariamente o problema aqui e você pode estar latindo na árvore errada. Tudo o que pode ser dito é que o caminho de classe está quebrado.
Thorbjørn Ravn Andersen
45

Um caminho de classe é uma lista de locais de onde carregar classes.

Esses 'locais' podem ser diretórios ou arquivos jar.

Para diretórios, a JVM seguirá um padrão esperado para carregar uma classe. Se eu tenho o diretório C: / myproject / classes em meu classpath e tento carregar uma classe com.mycompany.Foo , ele irá procurar no diretório classes por um diretório chamado com , então sob esse diretório chamado mycompany , e finalmente, ele irá procurar um arquivo chamado Foo.class nesse diretório.

Na segunda instância, para arquivos jar, ele pesquisará o arquivo jar dessa classe. Um arquivo jar é na realidade apenas uma coleção compactada de diretórios como o acima. Se você descompactar um arquivo jar, obterá vários diretórios e arquivos de classe seguindo o padrão acima.

Portanto, a JVM percorre um caminho de classe do início ao fim, procurando a definição da classe quando tenta carregar a definição da classe. Por exemplo, no classpath:

C: / myproject / classes; C: /myproject/lib/stuff.jar; C: /myproject/lib/otherstuff.jar

A JVM tentará procurar primeiro nas classes de diretório , depois em stuff.jar e finalmente em otherstuff.jar .

Quando você obtém uma ClassNotFoundException, significa que a JVM percorreu todo o caminho de classe e não encontrou a classe que você tentou fazer referência. A solução, como tantas vezes no mundo Java, é verificar seu classpath.

Você define um classpath na linha de comando dizendo java -cp e, em seguida, seu classpath. Em um IDE como o Eclipse, você terá uma opção de menu para especificar seu classpath.

user2000590
fonte
13

Esta é a melhor solução que encontrei até agora.

Suponha que temos um pacote chamado org.mypackagecontendo as classes:

  • HelloWorld (classe principal)
  • SupportClass
  • UtilClass

e os arquivos que definem este pacote são armazenados fisicamente no diretório D:\myprogram(no Windows) ou /home/user/myprogram(no Linux).

A estrutura do arquivo será semelhante a esta: insira a descrição da imagem aqui

Quando invocamos Java, que especifique o nome do aplicativo para executar: org.mypackage.HelloWorld. No entanto, também devemos dizer ao Java onde procurar os arquivos e diretórios que definem nosso pacote. Portanto, para iniciar o programa, temos que usar o seguinte comando: insira a descrição da imagem aqui

NOTA: Você deve executar o javacomando acima, independentemente de sua localização atual. Mas não é esse o caso javac. Para compilar, você pode até mesmo ir diretamente para o diretório onde está seus .javaarquivos e executá- los diretamente javac ClassName.java.

Ram Patra
fonte
6

Se você souber o caminho da classe ou o jar que contém a classe, adicione-o ao seu caminho de classe enquanto o executa. Você pode usar o classpath conforme mencionado aqui:

no Windows

java -classpath .;yourjar.jar YourMainClass

em UNIX / Linux

java -classpath .:yourjar.jar YourMainClass
Juned Ahsan
fonte
4

Tente estes se você usar maven. Eu uso o maven para o meu projeto e quando o faço mvn clean installe tento executar um programa, ele lança a exceção. Então, eu limpo o projeto e o executo novamente e ele funciona para mim.

Eu uso o Eclipse IDE.

Para a exceção de classe não encontrada ao executar o teste Junit, tente executar mvn clean testuma vez. Ele irá compilar todas as classes de teste.

Uma corrida
fonte
em que diretório você estava quando executou o "teste de limpeza mvn"? está no mesmo diretório do POM?
TacoB0t
1
Sim. Executei-o a partir do diretório onde o arquivo pom está presente.
Arun
3

Para adicionar a localização de uma classe ao seu caminho de classe via linha de comando, basta adicionar -cpou -classpathe a localização da classe enquanto a executa. IE

java -cp "c:/location/of/file" YourProgram

Ou se estiver executando um IDE como o eclipse, você pode clicar com o botão direito do mouse em project -> build path -> configure build path e adicionar o JAR externo que contém sua classe ao caminho de construção, então ele deve funcionar bem.

invictvs1
fonte
3

Usar ';' como separador. Se suas variáveis ​​de ambiente estiverem definidas corretamente, você deverá ver suas configurações. Se seu PATH e CLASSPATH estiverem corretos, o Windows deve reconhecer esses comandos. Você NÃO precisa reiniciar o computador ao instalar o Java.

Kiran S Kulkarni
fonte
5
Isso está no windows (ponto-e-vírgula), no unix / linux é ':' (dois pontos)
Joeblade
3

Adicione o caminho completo do arquivo jar ao CLASSPATH. Em uso linux: export CLASSPATH=".:/full/path/to/file.jar:$CLASSPATH". Outra maneira que funcionou (sem editar o CLASSPATH) foi descompactar o jar na pasta do projeto atual.

Maneiras não funcionaram para mim:

1) Usando a -cpopção com o caminho completo do arquivo jar.

2) Usar -cpapenas com o nome do jar quando localizado na pasta atual

3) Copiando o jar para a pasta do projeto atual

4) Copiar o jar para o local padrão dos jars java (/ usr / share / java)

Esta solução é relatada para a classe com.mysql.jdbc.Driver em mysql-connector-java.5 - *. Jar, trabalhando em Linux com OpenJDK versão 1.7

Pessoa Annonnymous
fonte
Apenas descompactar o JAR funcionou para mim, nenhuma das outras soluções funcionou
OverCoder
2

Vá até o topo e remova a instrução import, se houver, e importe novamente a classe. Mas se esse não for o caso, faça uma limpeza e depois construa. Você está usando Netbeans ou Eclipse?

inhame
fonte
2

Também encontrei isso e tentei todas as outras soluções. Eu não tinha o arquivo .class na minha pasta HTML, só tinha o arquivo .java. Depois de adicionar o arquivo .class, o programa funcionou bem.

Jason Robertson
fonte
2
  1. Pode acontecer se o seu caminho de classe não estiver correto

  2. Vamos postular uma classe serializável e uma classe desserializável sob o mesmo nome de projeto. Você executa a classe serializável, criando um objeto serializável em uma pasta específica. Agora você precisa dos dados dessearializados. Nesse ínterim, se você alterar o nome do projeto, ele não funcionará. Você deve executar a classe serializável primeiro e, em seguida, desserializar o arquivo.

Omar Faroque Anik
fonte
2

Se você estiver usando o maven, tente o maven atualizar todos os projetos e forçar para instantâneos. Ele vai limpar também e reconstruir todo o caminho de classe .. Isso resolveu meu problema ..

ibrahimgunes
fonte
2

eu apenas fiz

1. Invalide caches e reinicie

2. Reconstruí meu projeto que resolveu o problema

Jyoti JK
fonte
1

Eu estava tentando executar .jar do código C # usando Processclasse. O código java foi executado com sucesso no eclipse, mas não no C # visual studio e mesmo clicando diretamente no arquivo jar, ele sempre parava com ClassNotFoundException:exceção. A solução para a minha, foi exportar o programa java como "Arquivo JAR executável" ao invés de "Arquivo JAR". Espero que possa ajudar alguém.

Dani Aya
fonte
1

Isso pode acontecer no Windows após uma atualização do java em que a versão antiga do SDK do java está ausente e uma nova está presente. Gostaria de verificar se o seu IDE está usando a versão Java SDK instalada (IntelliJ: CTRL + SHIFT + ALT + S)

s5s
fonte
1

Se você adicionou várias bibliotecas ** (de terceiros) e classes de aplicativo Extends **

Então, pode ocorrer.

Para isso, você deve definir multiDexEnabled truee substituir sua Applicationclasse estendida por MultiDexApplication.

Isso será resolvido.

Parth Patel
fonte
1

Pergunta genérica básica - resposta genérica mais simples;)

Dadas as informações, assumirei que você pode estar tentando uma abordagem básica para codificação, construção / compilação e execução de um aplicativo de console simples como "Hello World", usando algum editor de texto simples e algum Command Shell.

Este erro ocorre no seguinte cenário:

..\SomePath>javac HelloWorld.java
..\SomePath>java HelloWorld.class

Em outras palavras, use:

..\SomePath>java HelloWorld

PS A adição da extensão de arquivo .class produz o mesmo erro. Certifique-se também de ter a pasta bin do Java (JDK / JRE) no PATH das Variáveis ​​de ambiente do sistema operacional. (Procure mais detalhes em outras postagens sobre isso) PPS Eu estava correto em minha (s) suposição (s)?

Vasil
fonte
1

Se você usa o maven, verifique se você tem este plug-in em pom.xml:

    <build>
        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <!-- Attach the shade goal into the package phase -->
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>

Ele colocará sua dependência (o motivo da exceção) em seu jar.

Para sua informação : isso incluirá todas as dependências infladas no jar final

Techkuz
fonte
@Archit adicionado.
techkuz
0

No meu caso, a classe lançada como exceção de classe não encontrada tem propriedades relacionadas a certificados SSL. Feche o eclipse e abra com “Executar como Administrador” e o problema foi resolvido. Como o eclipse tem permissão relacionada ao problema, ele lançará esse tipo de exceção.

Shaik Elias
fonte
-7

Coloque todo o código no bloco try e então capture a exceção em um bloco catch

try
{
    // code
}
catch(ClassNotFoundException e1)
{
    e1.getmessage();
}
sharukh
fonte
5
Isso não resolve a exceção. Isso esconde a exceção. Além disso, "e1.getmessage ()" é a) a capitalização errada de getMessage () eb) não fará muito, pois retorna uma string com uma mensagem e você não a imprime ou registra ou nada!
IBBoard