Det gick inte att hitta eller ladda huvudklassfel

1. Introduktion

Ibland när vi kör ett Java-program kan vi se ”Kunde inte hitta eller ladda huvudklassen”. Det är lätt att gissa orsaken: JVM misslyckades med att hitta huvudklassen och gav detta fel. Men varför kunde det inte?

I denna handledning diskuterar vi de troliga orsakerna till att huvudklassen inte hittades. Vi får också se hur vi fixar dem.

2. Provprogram

Vi börjar med ett HelloWorld- program:

public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world..!!!"); } }

Låt oss nu sammanställa det:

$ javac HelloWorld.java

Här genererar kompilatorn en .class- fil för vårt program. Denna .class- fil kommer att genereras i samma katalog. Den .class filen kommer att ha samma namn som klassnamnet ges i Java-program. Denna .class- fil är körbar.

I följande avsnitt kör vi den här .class- filen och försöker förstå de troliga orsakerna till felet ”Kunde inte hitta eller ladda huvudklassen”.

3. Fel klassnamn

För att köra en .class- fil som genereras av Java-kompilatorn kan vi använda kommandot nedan:

java 

Låt oss nu köra vårt program:

$ java helloworld Error: Could not find or load main class helloworld

Ja, det misslyckades med felet "Kunde inte hitta eller ladda huvudklassen helloworld".

Som tidigare diskuterats kommer kompilatorn att generera .class- filen med exakt samma namn som Java-klassen ges i programmet . Så i vårt fall kommer huvudklassen att ha namnet HelloWorld , inte helloworld .

Låt oss prova ett till med rätt hölje:

$ java HelloWorld Hello world..!!!

Den här gången gick det framgångsrikt.

3.1. Filändelsen

För att kompilera ett Java-program måste vi ange filnamnet med dess tillägg (. Java ):

$ javac HelloWorld.java

Men att köra en. klass fil måste vi ge klassnamnet, inte filnamnet. Så det finns inget behov av att tillhandahålla .class- tillägget:

$ java HelloWorld.class Error: Could not find or load main class HelloWorld.class

Så, igen, låt oss köra vårt program med rätt klassnamn:

$ java HelloWorld Hello world..!!!

4. Java-paketnamn

I Java håller vi liknande klasser i det vi kallar ett paket .

Låt oss flytta HelloWorld- klass till paketet com.baeldung :

package com.baeldung; public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world..!!!"); } }

Låt oss nu sammanställa och köra det uppdaterade HelloWorld- programmet som tidigare:

$ java HelloWorld Error: Could not find or load main class HelloWorld

Men återigen får vi felet "Kunde inte hitta eller ladda huvudklassen HelloWorld"!

Låt oss försöka förstå vad vi missade här.

För att köra en Java-klass som finns i ett paket måste vi ange dess fullständigt kvalificerade namn . Så i vårt fall är HelloWorlds fullständigt kvalificerade namn com.baeldung.HelloWorld .

Nu när vi skapade com.baeldung- paketet skapade vi faktiskt en mappstruktur som:

com/baeldung/HelloWorld.java

Låt oss först köra vårt program från katalogen com / baeldung :

$ java com.baeldung.HelloWorld Error: Could not find or load main class com.baeldung.HelloWorld

Ändå kan vi inte köra vårt program.

Här, när vi angav det fullständigt kvalificerade klassnamnet com.baeldung.HelloWorld , försökte Java hitta HelloWorld.class-filen i com / baeldung , under katalogen från vilken vi körde programmet.

Eftersom vi redan var inne i com / baeldung kunde Java inte hitta och köra HelloWorld- programmet.

Låt oss nu gå tillbaka till den överordnade mappen och köra den:

$ java com.baeldung.HelloWorld Hello world..!!!

Ja, vi kan återigen säga ”Hej” till världen.

5. Ogiltig klassväg

Innan vi går vidare, låt oss först förstå vad som är klassstigen - det är den uppsättning klasser som är tillgängliga för vår nuvarande JVM.

Vi använder classpath-variabeln för att berätta för JVM var du hittar .class- filerna i filsystemet.

När vi kör ett program kan vi tillhandahålla klassvägen med -classpath- alternativet. exempel:

java -classpath /my_programs/compiled_classes HelloWorld

Här kommer Java att leta efter HelloWorld.class- filen i / my_programs / compiled_classes- mappen, en mapp vars namn vi just gjorde upp. Som standard är klassstigsvariabeln inställd på “.”, Vilket betyder den aktuella katalogen.

I avsnittet ovan ändrade vi vår katalog för att köra vårt program. Men tänk om vi vill köra den från någon annan mapp? Det är då classpath-variabeln hjälper oss.

För att köra vårt program från katalogen är com / baeldung kan vi helt enkelt säga att vår klassväg är två kataloger upp - en för varje paketdel:

$ java -claspath ../../ com.baeldung.HelloWorld Hello world..!!!

Här representerar “..” den överordnade katalogen. I vårt fall representerar “../../” toppen av vår pakethierarki.

6. Sammanfattning

I denna handledning lärde vi oss de troliga orsakerna till felet ”Kunde inte hitta eller ladda huvudklassen”.

Sedan lärde vi oss naturligtvis också hur man löser detta fel.