Não foi possível encontrar ou carregar o erro da classe principal

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.