Não foi possível encontrar ou carregar o Java da classe principal? Veja como consertar!

Se você continua recebendo o erro de classe principal não encontrada em seu projeto Java sem motivo aparente, não se preocupe, você não está sozinho.

Como um dos erros mais imprevisíveis e espontâneos, graças à tendência da JVM (Java Virtual Machine) de se ater a um classpath padrão, o problema da 'classe principal não encontrada' é algo que assombra amadores e profissionais.

Mas essa questão é na verdade menos intimidante do que parece. Continue lendo para descobrir como você pode se livrar desse erro de uma vez por todas.

Por que a classe principal não foi encontrada?

Antes de tentarmos entender como e por que a JVM não conseguiu encontrar a classe principal, precisamos entender o conceito de Classpath em Java.

O que é Classpath?

O classpath é o caminho do arquivo que o Java Runtime Environment procura por classes e outros arquivos de recursos. Ele pode ser definido usando a opção -classpath ao executar um programa ou definindo a variável de ambiente CLASSPATH do sistema.

Como o nome sugere, é simplesmente um caminho de arquivo onde os arquivos .class podem ser encontrados em um pacote ou diretório JDK.

Quando a JVM não consegue localizar a classe principal, geralmente é porque está procurando os arquivos .class correspondentes no caminho de classe errado. Obviamente, a maneira de corrigir esse problema é especificar manualmente o caminho de classe usando pacotes ou especificando o caminho de classe.

Neste ponto, se você quiser atualizar sua memória das classes Java, verifique nosso guia para criar classes em Java .

Usando Pacotes

Vamos criar uma classe chamada Teste . Coloque-o em um pacote chamado testPackage . Os pacotes são usados ​​em Java para agrupar classes semelhantes ou fornecer um namespace exclusivo para as classes.

Neste exemplo simples, o uso de um pacote o ajudará a visualizar como funciona o classpath do Java. Em seu aplicativo gerenciador de arquivos, um pacote é representado como uma pasta independente.

 package testPackage;
public class Test {
public static void main(String args[]) {
System.out.println("File successfully found!");
}
}

Agora, abra um novo terminal e certifique-se de que seu diretório de trabalho seja o mesmo que contém a pasta do pacote. Você pode alterar o diretório de trabalho usando o comando cd em qualquer sistema operacional.

Compile Test.java executando o seguinte comando:

 package testPackage;
javac testPackage/Test.java

Isso salvará o arquivo binário compilado (o arquivo .class) no testPackage.

Para executar a classe compilada, você precisa digitar o nome da classe totalmente qualificado na linha de comando. O nome totalmente qualificado de uma classe Java refere-se a seu nome prefixado com seu nome de pacote. Neste caso, deve ser parecido com isto:

 java testPackage.Test

Essa maneira de chamar arquivos de classe também garante que você possa chamar executáveis ​​de diferentes pacotes do mesmo diretório de trabalho. Tudo que você precisa fazer é modificar o nome da classe totalmente qualificado.

Em implementações mais avançadas, recomendamos que você crie subpastas separadas para suas classes e arquivos de origem para gerenciar melhor os arquivos dentro do pacote.

Especificando manualmente o Classpath

A maneira recomendada de gerenciar seus arquivos java é criar diretórios separados para arquivos de origem e classes. Se você está trabalhando em um projeto, é provável que já esteja fazendo isso.

Convencionalmente, o diretório com arquivos de origem é rotulado como src e aquele com arquivos .class é rotulado como classes. Essa também é uma maneira de garantir que a probabilidade da JVM não encontrar a classe principal seja reduzida significativamente, devido ao diretório estruturado corretamente.

Se usarmos esse método, a estrutura do diretório ficará assim antes da compilação:

 |---myFolder
| |---src
| |---testPackage
| |---Test.java
|
| |---classes

Cada recuo na ilustração acima corresponde a um nível da hierarquia de arquivos que seu projeto deve seguir.

Para compilá-lo, certifique-se de que seu diretório de trabalho seja myFolder. Agora, digite o seguinte comando:

 javac -d classes src/testPackage/Test.java

O executável .class deve ser salvo em myFolder / classes / testPackage . Conseqüentemente, a estrutura do diretório de arquivos é semelhante a esta:

 |---myFolder
| |---src
| |---testPackage
| |---Test.java
|
| |---classes
| |---testPackage
| |---Test.class

Para executar o arquivo .class , execute o comando Java com o nome de classe totalmente qualificado e especifique o caminho de classe local. Cada caminho é declarado em relação ao diretório de trabalho, que neste caso é myFolder.

 java -classpath classes testPackage

A execução desse comando deve fornecer a saída desejada. Mas, por que tanta reorganização é necessária para resolver um erro simples?

A importância da organização de arquivos em Java

A própria razão pela qual 'Não foi possível localizar ou carregar a classe principal' é lançada é porque a JVM não foi capaz de encontrar onde seus arquivos .class estavam sendo armazenados.

A maneira mais fácil de resolver esse erro é controlar onde os arquivos .class são armazenados e dizer explicitamente à JVM para procurar lá. Isso é possível organizando seus arquivos de origem e executáveis ​​separadamente e controlando tudo a partir de um diretório de trabalho.

À medida que você começa a adicionar construções, como herança, ao seu projeto, a complexidade do sistema de arquivos tende a aumentar. Em tais projetos ou mesmo naqueles em que o uso de arquivos JAR ou bibliotecas customizadas é necessário, a prática simples de segregar e gerenciar arquivos pode economizar incontáveis ​​horas de resolução de problemas e depuração.

Para ler mais sobre como o classpath funciona em Java e as várias coisas que você pode controlar quando se trata de executar seu código, você também pode dar uma olhada na referência detalhada e amigável do Oracle.