Não foi possível encontrar ou carregar o erro da classe principal
1. Introdução
Ocasionalmente, quando executamos um programa Java, podemos ver "Não foi possível encontrar ou carregar a classe principal". É fácil adivinhar o motivo: o JVM não conseguiu encontrar a classe principal e apresentou este erro. Mas por que não poderia?
Neste tutorial, discutiremos os prováveis motivos do fracasso em encontrar a classe principal. Além disso, veremos como corrigi-los.
2. Programa de amostra
Vamos começar com um programaHelloWorld:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world..!!!");
}
}
Agora, vamos compilá-lo:
$ javac HelloWorld.java
Aqui, o compilador irá gerar um arquivo.class para nosso programa. Este arquivo.class será gerado no mesmo diretório. The .class file will have the same name as the class name given in the Java program. Este arquivo.class é executável.
Nas seções a seguir, executaremos este arquivo.class e tentaremos entender os prováveis motivos do erro “Não foi possível encontrar ou carregar a classe principal”.
3. Nome de classe incorreto
Para executar um arquivo.class gerado pelo compilador Java, podemos usar o comando abaixo:
java <.class filename>
Agora, vamos executar nosso programa:
$ java helloworld
Error: Could not find or load main class helloworld
Sim, falhou com o erro "Não foi possível encontrar ou carregar o helloworld da classe principal".
Conforme discutido anteriormente,the compiler will generate the .class file with the exact same name given to the Java class in the program. Portanto, em nosso caso, a classe principal terá o nomeHelloWorld, nãohelloworld.
Vamos tentar mais uma vez com a caixa correta:
$ java HelloWorld
Hello world..!!!
Desta vez, foi executado com sucesso.
3.1. Extensão de arquivo
Para compilar um programa Java, devemos fornecer o nome do arquivo com sua extensão (.java):
$ javac HelloWorld.java
Mas para executar um arquivo.class, precisamos fornecer o nome da classe, não o nome do arquivo. Portanto, não há necessidade de fornecer a extensão.class:
$ java HelloWorld.class
Error: Could not find or load main class HelloWorld.class
Então, novamente, vamos executar nosso programa usando o nome de classe correto:
$ java HelloWorld
Hello world..!!!
4. Nomes de Pacotes Java
Em Java, mantemos classes semelhantes juntas no que chamamos depackage.
Vamos mover a classeHelloWorld para o pacotecom.example:
package com.example;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world..!!!");
}
}
Agora, vamos compilar e executar o programaHelloWorld atualizado como antes:
$ java HelloWorld
Error: Could not find or load main class HelloWorld
Mas, novamente, recebemos o erro "Não foi possível encontrar ou carregar a classe principal HelloWorld"!
Vamos tentar entender o que perdemos aqui.
To run a Java class which is in a package, we must provide its fully qualified name. Portanto, em nosso caso, o nome totalmente qualificadoHelloWorld’s écom.example.HelloWorld.
Agora, quando criamos o pacotecom.example, na verdade criamos uma estrutura de pastas como:
com/example/HelloWorld.java
Primeiro, vamos tentar executar nosso programa a partir do diretóriocom/example:
$ java com.example.HelloWorld
Error: Could not find or load main class com.example.HelloWorld
Ainda assim, não podemos executar nosso programa.
Aqui, quando especificamos o nome de classe totalmente qualificadocom.example.HelloWorld, Java tentou localizar o arquivo HelloWorld.class emcom/example, no diretório de onde estávamos executando o programa.
Como já estávamos dentro decom/example, o Java falhou ao encontrar e executar o programaHelloWorld.
Agora, vamos voltar para a pasta pai e executá-la:
$ java com.example.HelloWorld
Hello world..!!!
Sim, somos novamente capazes de dizer "Olá" ao mundo.
5. Caminho de classe inválido
Antes de prosseguir, vamos primeiro entender o que é o classpath - é o conjunto de classes disponíveis para nossa JVM em execução no momento.
Usamos a variável classpath para informar à JVM onde encontrar os arquivos.class no sistema de arquivos.
Ao executar um programa, podemos fornecer o caminho de classe usando a opção-classpath. exemplo:
java -classpath /my_programs/compiled_classes HelloWorld
Aqui, o Java procurará o arquivoHelloWorld.class na pasta /my_programs/compiled_classes, uma pasta cujo nome acabamos de criar. Por padrão,the classpath variable is set to “.”, meaning the current directory.
Na seção acima, alteramos nosso diretório para executar nosso programa. Mas e se quisermos executá-lo de outra pasta? É quando a variável de caminho de classe nos ajuda.
Para executar nosso programa a partir do diretóriocom/example, podemos simplesmente afirmar que nosso caminho de classe contém dois diretórios - um para cada parte do pacote:
$ java -claspath ../../ com.example.HelloWorld
Hello world..!!!
Aqui, ".." representa o diretório pai. No nosso caso, "../../" representa o topo da nossa hierarquia de pacotes.
6. Conclusão
Neste tutorial, aprendemos os motivos prováveis do erro "Não foi possível encontrar ou carregar a classe principal".
Então, é claro, também aprendemos como resolver esse erro.