Wat betekent “Kon hoofdklasse niet vinden of laden” bedoel?

Een veelvoorkomend probleem dat nieuwe Java-ontwikkelaars ervaren, is dat hun programma’s niet kunnen worden uitgevoerd met de foutmelding: Could not find or load main class ...

Wat betekent dit, wat veroorzaakt het en hoe moet je het oplossen?

Antwoord 1, autoriteit 100%

De java <class-name>-opdrachtsyntaxis

Allereerst moet je de juiste manier begrijpen om een ​​programma te starten met de opdracht java (of javaw).

De normale syntaxis1 is deze:

    java [ <options> ] <class-name> [<arg> ...]

waar <option> een opdrachtregeloptie is (beginnend met een "-"-teken), is <class-name> een volledig gekwalificeerde Java klassenaam, en <arg> is een willekeurig opdrachtregelargument dat aan uw toepassing wordt doorgegeven.


1 – Er zijn enkele andere syntaxis die aan het einde van dit antwoord worden beschreven.

De volledig gekwalificeerde naam (FQN) voor de klasse wordt gewoonlijk geschreven zoals u zou doen in de Java-broncode; bijv.

    packagename.packagename2.packagename3.ClassName

In sommige versies van het java commando kun je slashes gebruiken in plaats van punten; bijv.

    packagename/packagename2/packagename3/ClassName

wat (verwarrend) lijkt op een bestandspadnaam, maar dat niet is. Merk op dat de term volledig gekwalificeerde naam standaard Java-terminologie is … niet iets dat ik zojuist heb verzonnen om je in verwarring te brengen 🙂

Hier is een voorbeeld van hoe een java-opdracht eruit zou moeten zien:

    java -Xmx100m com.acme.example.ListUsers fred joe bert

Het bovenstaande zorgt ervoor dat de opdracht java het volgende doet:

  1. Zoek naar de gecompileerde versie van de klasse com.acme.example.ListUsers.
  2. Laad de klas.
  3. Controleer of de klasse een main-methode heeft met handtekening, retourtype en modifiers gegeven door public static void main(String[]). (Let op, de naam van het methodeargument maakt NIET deel uit van de handtekening.)
  4. Noem die methode en geef het de opdrachtregelargumenten (“fred”, “joe”, “bert”) door als een String[].

Redenen waarom Java de klasse niet kan vinden

Als je het bericht “Kan hoofdklasse niet vinden of laden …” krijgt, betekent dit dat de eerste stap is mislukt. De opdracht java kon de klasse niet vinden. En inderdaad, de "…" in het bericht staat de volledig gekwalificeerde klasnaam waarnaar java op zoek is.

Dus waarom kan het de klas niet vinden?

Reden #1 – je hebt een fout gemaakt met het classname-argument

De eerste waarschijnlijke oorzaak is dat je de verkeerde klassenaam hebt opgegeven. (Of … de juiste klassenaam, maar in de verkeerde vorm.) Gezien het bovenstaande voorbeeld, zijn hier een aantal verkeerde manieren om de klassenaam op te geven:

  • Voorbeeld #1 – een eenvoudige klassenaam:

    java ListUser
    

    Als de klasse is gedeclareerd in een pakket zoals com.acme.example, dan moet je de volledige klassenaam inclusief de pakketnaam gebruiken in de java commando; bijv.

    java com.acme.example.listuser
    
  • Voorbeeld #2 – een bestandsnaam of padnaam in plaats van een klassenaam:

    java ListUser.class
    java com/acme/example/ListUser.class
    
  • Voorbeeld #3 – een klassenaam met een onjuist hoofdlettergebruik:

    java com.acme.example.listuser
    
  • Voorbeeld #4 – een typfout

    java com.acme.example.mistuser
    
  • Voorbeeld #5 – een bronbestandsnaam (behalve Java 11 of hoger; zie hieronder)

    java ListUser.java
    
  • Voorbeeld #6 – je bent de klasnaam helemaal vergeten

    java lots of arguments
    

Reden #2 – het klassenpad van de toepassing is onjuist opgegeven

De tweede waarschijnlijke oorzaak is dat de klassenaam correct is, maar dat de opdracht java de klasse niet kan vinden. Om dit te begrijpen, moet u het concept van het "classpath" begrijpen. Dit wordt goed uitgelegd door de Oracle-documentatie:

Dus … als je de klassenaam correct hebt opgegeven, is het volgende dat je moet controleren of je het klassenpad correct hebt opgegeven:

  1. Lees de drie documenten die hierboven zijn gelinkt. (Ja … LEES ze! Het is belangrijk dat een Java-programmeur begrijpt ten minste de basisprincipes van hoe de Java classpath-mechanismen werken.)
  2. Kijk naar de opdrachtregel en/of de omgevingsvariabele CLASSPATH die van kracht is wanneer je de opdracht java uitvoert. Controleer of de directorynamen en JAR-bestandsnamen correct zijn.
  3. Als er relatieve padnamen in het klassenpad staan, controleer dan of ze correct worden opgelost … vanuit de huidige map die van kracht is wanneer u de opdracht java uitvoert.
  4. Controleer of de klasse (vermeld in de foutmelding) zich op het effectieve klassenpad kan bevinden.
  5. Merk op dat de syntaxis van het klassenpad anders is voor Windows versus Linux en Mac OS. (Het classpath-scheidingsteken is ; op Windows en : op de andere. Als u het verkeerde scheidingsteken voor uw platform gebruikt, krijgt u geen expliciete foutmelding. In plaats daarvan, je krijgt een niet-bestaand bestand of map op het pad dat stilzwijgend wordt genegeerd.)

Reden #2a – de verkeerde map staat op het klassenpad

Als u een map op het klassenpad plaatst, komt deze fictief overeen met de hoofdmap van de gekwalificeerde naamruimte. Klassen bevinden zich in de directorystructuur onder die root, door de volledig gekwalificeerde naam toe te wijzen aan een padnaam. Dus bijvoorbeeld als "/usr/local/acme/classes" op het klassenpad staat, zoekt de JVM naar een klasse met de naam com.acme.example.Foon, dan zoekt hij naar een ".class" bestand met deze padnaam:

  /usr/local/acme/classes/com/acme/example/Foon.class

Als u "/usr/local/acme/classes/com/acme/example" op het klassenpad, dan zou de JVM de klasse niet kunnen vinden.

Reden #2b – het pad van de submap komt niet overeen met de FQN

Als de FQN van uw klassen com.acme.example.Foon is, zoekt de JVM naar "Foon.class" in de directory "com/acme/example":

  • Als uw directorystructuur niet overeenkomt met de pakketnaamgeving volgens het patroon hierboven, zal de JVM uw klasse niet vinden.

  • Als u probeert een klasse te hernoemen door deze te verplaatsen, zal dat ook mislukken … maar de uitzonderingsstacktrace zal anders zijn. Het kan zoiets als dit zeggen:

    Caused by: java.lang.NoClassDefFoundError: <path> (wrong name: <name>)
    

    omdat de FQN in het klassenbestand niet overeenkomt met wat de klassenlader verwacht te vinden.

Om een ​​concreet voorbeeld te geven, stel dat:

  • je wilt de klasse com.acme.example.Foon uitvoeren,
  • het volledige bestandspad is /usr/local/acme/classes/com/acme/example/Foon.class,
  • uw huidige werkmap is /usr/local/acme/classes/com/acme/example/,

dan:

# wrong, FQN is needed
java Foon
# wrong, there is no `com/acme/example` folder in the current working directory
java com.acme.example.Foon
# wrong, similar to above
java -classpath . com.acme.example.Foon
# fine; relative classpath set
java -classpath ../../.. com.acme.example.Foon
# fine; absolute classpath set
java -classpath /usr/local/acme/classes com.acme.example.Foon

Opmerkingen:

  • De optie -classpath kan in de meeste Java-releases worden ingekort tot -cp. Controleer de respectievelijke handmatige invoer voor java, javac enzovoort.
  • Denk goed na bij het kiezen tussen absolute en relatieve padnamen in klassenpaden. Onthoud dat een relatieve padnaam kan “breken” als de huidige map verandert.

Reden #2c – afhankelijkheden ontbreken in het klassenpad

Het klassenpad moet alle andere (niet-systeem) klassen bevatten waarvan uw toepassing afhankelijk is. (De systeemklassen worden automatisch gelokaliseerd en u hoeft zich hier zelden zorgen over te maken.) Om de hoofdklasse correct te laden, moet de JVM het volgende vinden:

(Opmerking: de JLS- en JVM-specificaties bieden enige ruimte voor een JVM om klassen “lui” te laden, en dit kan van invloed zijn wanneer een classloader-uitzondering wordt gegenereerd.)

Reden #3 – de klasse is gedeclareerd in het verkeerde pakket

Het komt af en toe voor dat iemand een broncodebestand in de
de verkeerde map in hun broncodeboom, of ze laten de package-declaratie weg. Als je dit in een IDE doet, zal de compiler van de IDE je daar direct over vertellen. Evenzo, als u een fatsoenlijke Java-buildtool gebruikt, zal de tool javac uitvoeren op een manier die het probleem detecteert. Als u uw Java-code echter met de hand bouwt, kunt u dit op zo’n manier doen dat de compiler het probleem niet opmerkt, en de resulterende “.class”; bestand is niet op de plaats waar u het verwacht.

Kunt u het probleem nog steeds niet vinden?

Er zijn veel dingen om te controleren en het is gemakkelijk om iets te missen. Probeer de optie -Xdiag toe te voegen aan de opdrachtregel java (als eerste na java). Het zal verschillende dingen weergeven over het laden van klassen, en dit kan je aanwijzingen geven over wat het echte probleem is.

Houd ook rekening met mogelijke problemen die worden veroorzaakt door het kopiëren en plakken van onzichtbare of niet-ASCII-tekens van websites, documenten enzovoort. En denk eens aan “homoglifen”, waarbij twee letters of symbolen er hetzelfde uitzien … maar dat niet zijn.

Ten slotte kunt u dit probleem blijkbaar tegenkomen als u probeert te starten vanuit een JAR-bestand met onjuiste handtekeningen in (META-INF/*.SF) of als er een syntaxisfout is in de MANIFEST.MF-bestand (zie https://stackoverflow.com/a/67145190/139985 ).


Alternatieve syntaxis voor java

Er zijn drie alternatieve syntaxis voor het starten van Java-programma’s met het java command.

  1. De syntaxis die wordt gebruikt voor het starten van een "uitvoerbaar" JAR-bestand is als volgt:

    java [ <options> ] -jar <jar-file-name> [<arg> ...]
    

    bijv.

    java -Xmx100m -jar /usr/local/acme-example/listuser.jar fred
    

    De naam van de ingangsklasse (d.w.z. com.acme.example.ListUser) en het klassenpad worden gespecificeerd in het MANIFEST van het JAR-bestand.

  2. De syntaxis voor het starten van een toepassing vanuit een module (Java 9 en hoger) is als volgt:

    java [ <options> ] --module <module>[/<mainclass>] [<arg> ...]
    

    De naam van de ingangsklasse wordt ofwel gedefinieerd door de <module> zelf, of wordt gegeven door de optionele <mainclass>.

  3. Vanaf Java 11 kunt u een enkel broncodebestand compileren en uitvoeren en dit uitvoeren met de volgende syntaxis:

    java [ <options> ] <sourcefile> [<arg> ...]
    

    waarbij <sourcefile> (meestal) een bestand is met het achtervoegsel “.java”.

Raadpleeg voor meer details de officiële documentatie voor de opdracht java voor de Java-release die u gebruikt.


IDE’s

Een typische Java IDE heeft ondersteuning voor het uitvoeren van Java-applicaties in de IDE JVM zelf of in een onderliggende JVM. Deze zijn in het algemeen immuun voor deze specifieke uitzondering, omdat de IDE zijn eigen mechanismen gebruikt om het runtime-klassenpad te construeren, de hoofdklasse te identificeren en de opdrachtregel java te maken.

Het is echter nog steeds mogelijk dat deze uitzondering optreedt, als u dingen achter de rug van de IDE doet. Als u bijvoorbeeld eerder een Application Launcher voor uw Java-app in Eclipse hebt ingesteld en u vervolgens het JAR-bestand met de "main" class naar een andere plaats in het bestandssysteem zonder Eclipse te vertellen, zou Eclipse onbewust de JVM starten met een onjuist klassenpad.

Kortom, als u dit probleem in een IDE krijgt, controleer dan op zaken als een verouderde IDE-status, kapotte projectreferenties of kapotte opstartconfiguraties.

Het is ook mogelijk dat een IDE gewoon in de war raakt. IDE’s zijn enorm gecompliceerde stukjes software die uit veel op elkaar inwerkende onderdelen bestaan. Veel van deze onderdelen gebruiken verschillende cachingstrategieën om de IDE als geheel responsief te maken. Deze kunnen soms fout gaan, en een mogelijk symptoom is problemen bij het starten van applicaties. Als je vermoedt dat dit zou kunnen gebeuren, is het de moeite waard om andere dingen te proberen, zoals het herstarten van je IDE, het opnieuw opbouwen van het project enzovoort.


Andere referenties

Antwoord 2, autoriteit 19%

Als de naam van uw broncode HelloWorld.java is, is uw gecompileerde code HelloWorld.class.

Je krijgt die foutmelding als je hem aanroept met:

java HelloWorld.class

Gebruik in plaats daarvan dit:

java HelloWorld

Antwoord 3, autoriteit 11%

Als je klassen in pakketten zitten dan moet je cd naar de hoofdmap van je project en uitvoeren met de volledig gekwalificeerde naam van de klasse (packageName.MainClassName) .

Voorbeeld:

Mijn lessen zijn hier:

D:\project\com\cse\

De volledig gekwalificeerde naam van mijn hoofdklas is:

com.cse.Main

Dus ik cd terug naar de hoofdmap van het project:

D:\project

Geef vervolgens de opdracht java op:

java com.cse.Main

Dit antwoord is bedoeld om beginnende Java-programmeurs te redden van de frustratie die wordt veroorzaakt door een veelgemaakte fout. Ik raad je aan het geaccepteerde antwoord te lezen voor meer diepgaande kennis over het Java-klassenpad.

Antwoord 4, autoriteit 5%

Met pakket

Als u een trefwoord package in uw broncode heeft (de hoofdklasse is gedefinieerd in een pakket), moet u dit over de hiërarchische map uitvoeren, met de volledige naam van de klasse (packageName.MainClassName).

Stel dat er een broncodebestand is (Main.java):

package com.test;
public class Main {
    public static void main(String[] args) {
        System.out.println("salam 2nya\n");
    }
}

Om deze code uit te voeren, moet u Main.class in de directory package like plaatsen:

C:\Users\workspace\testapp\com\test\Main.Java

Verander dan de huidige directory van de terminal in de hoofddirectory van het project:

cd C:\Users\workspace\testapp  

En tot slot, voer de code uit:

java com.test.Main

Zonder pakket

Als je geen pakket op je broncodenaam hebt staan, heb je misschien de verkeerde opdracht. Neem aan dat uw Java-bestandsnaam Main.java is, na het compileren:

javac Main.java

je gecompileerde code wordt Main.class

Je krijgt die foutmelding als je hem aanroept met:

java Main.class

Gebruik in plaats daarvan dit:

java Main

Antwoord 5, autoriteit 4%

Als dezelfde code op de ene pc werkt, maar de fout op een andere toont, is compileren als volgt de beste oplossing die ik ooit heb gevonden:

javac HelloWorld.java
java -cp . HelloWorld

Antwoord 6, autoriteit 3%

Wat me hielp was het specificeren van het klassenpad op de opdrachtregel, bijvoorbeeld:

  1. Maak een nieuwe map, C:\temp

  2. Maak bestand Temp.java in C:\temp, met de volgende klasse erin:

    public class Temp {
        public static void main(String args[]) {
            System.out.println(args[0]);
        }
    }
    
  3. Open een opdrachtregel in de map C:\temp en schrijf de volgende opdracht om de Temp-klasse te compileren:

    javac Temp.java
    
  4. Voer de gecompileerde Java-klasse uit en voeg de optie -classpath toe om JRE te laten weten waar de klasse te vinden is:

    java -classpath C:\temp Temp Hello!
    

Antwoord 7, autoriteit 2%

Volgens de foutmelding (“Kan hoofdklasse niet vinden of laden”), zijn er twee categorieën problemen:

  1. Hoofdklasse kon niet gevonden
  2. Hoofdklas kan niet geladen worden (dit geval wordt niet volledig besproken in het geaccepteerde antwoord)

Hoofdklasse kon niet gevonden worden wanneer er typfout of verkeerde syntaxis in de volledig gekwalificeerde klassenaam staat of deze niet bestaat in het opgegeven klassenpad.

Hoofdklasse kan niet worden geladen wanneer de klasse niet kan worden gestart, meestal breidt de hoofdklasse een andere klasse uit en die klasse bestaat niet in het opgegeven klassenpad.

p>

Bijvoorbeeld:

public class YourMain extends org.apache.camel.spring.Main

Als camel-spring niet is inbegrepen, wordt deze fout gerapporteerd.

Antwoord 8

Gebruik deze opdracht:

java -cp . [PACKAGE.]CLASSNAME

Voorbeeld: als je klasnaam Hello.class is gemaakt op basis van Hello.java, gebruik dan de onderstaande opdracht:

java -cp . Hello

Als je bestand Hello.java zich in pakket com.demo bevindt, gebruik dan het onderstaande commando

java -cp . com.demo.Hello

Bij JDK 8 komt het vaak voor dat het class-bestand in dezelfde map aanwezig is, maar het java commando verwacht classpath en om deze reden voegen we -cp . om de huidige map als referentie voor classpath te nemen.

Antwoord 9

In dit geval had ik zo’n fout:

java -cp lib.jar com.mypackage.Main

Het werkt met ; voor Windows en : voor Unix:

java -cp lib.jar; com.mypackage.Main

Antwoord 10

Probeer -Xdiag.

Steve C’s antwoord dekt de mogelijke gevallen goed, maar soms om te bepalen of de klasse niet gevonden kon worden of geladen is misschien niet zo eenvoudig. Gebruik java -Xdiag (sinds JDK 7). Dit drukt een mooie stacktrace af die een hint geeft over wat het bericht Could not find or load main class betekent.

Het kan u bijvoorbeeld verwijzen naar andere klassen die door de hoofdklasse worden gebruikt en die niet konden worden gevonden en waardoor de hoofdklasse niet kon worden geladen.

Antwoord 11

Soms heeft de oorzaak van het probleem niets te maken met de hoofdklasse, en ik moest hier op de harde manier achter komen. Het was een bibliotheek waarnaar ik heb verwezen, en het gaf me het volgende:

Kon hoofdklasse xxx Linux niet vinden of laden

Ik heb zojuist die referentie verwijderd, opnieuw toegevoegd en het werkte weer prima.

Antwoord 12

Ik had hetzelfde probleem en heb eindelijk mijn fout gevonden 🙂
Ik gebruikte dit commando voor het compileren en het werkte correct:

javac -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar" qrcode.java

Maar dit commando werkte niet voor mij (ik kon de hoofdklasse niet vinden of laden, qrcode):

java -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar" qrcode

Eindelijk heb ik zojuist het ‘:’-teken aan het einde van het klassenpad toegevoegd en het probleem was opgelost:

java -cp "/home/omidmohebbi/AAAATest/jars/core-1.7.jar:/home/omidmohebbi/AAAATest/jars/javase-1.7.jar:/home/omidmohebbi/AAAATest/jars/qrgen-1.2.jar:" qrcode

Antwoord 13

In dit geval heb je:

Kon hoofdklasse ?classpath

niet vinden of laden

Het is omdat je “-classpath” gebruikt, maar het streepje is niet hetzelfde streepje dat wordt gebruikt door java op de opdrachtprompt. Ik had dit probleem bij het kopiëren en plakken van Kladblok naar cmd.

Antwoord 14

In mijn geval verscheen er een fout omdat ik de naam van het bronbestand had opgegeven in plaats van de klassenaam.

We moeten de klassenaam met de hoofdmethode aan de interpreter verstrekken.

Antwoord 15

Als je Maven gebruikt om het JAR-bestand te bouwen, zorg er dan voor dat je de hoofdklasse specificeert in het pom.xml-bestand:

<build>
    <plugins>
        <plugin>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>class name us.com.test.abc.MyMainClass</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

Antwoord 16

Dit zou je kunnen helpen als jouw geval specifiek op het mijne lijkt: als beginner kwam ik dit probleem ook tegen toen ik probeerde een Java-programma uit te voeren.

Ik heb het als volgt samengesteld:

javac HelloWorld.java

En ik probeerde ook te draaien met dezelfde extensie:

java Helloworld.java

Toen ik de .java verwijderde en het commando herschreef zoals java HelloWorld, werkte het programma perfect. 🙂

Antwoord 17

Alle antwoorden hier zijn gericht op Windows-gebruikers, zo lijkt het. Voor Mac is het classpath-scheidingsteken :, niet ;. Als een fout bij het instellen van het klassenpad met behulp van ; niet wordt gegenereerd, kan dit moeilijk te ontdekken zijn als het van Windows naar Mac komt.

Hier is het bijbehorende Mac-commando:

java -classpath ".:./lib/*" com.test.MyClass

In dit voorbeeld is het pakket com.test en moet er ook een map lib worden opgenomen in classpath.

Antwoord 18

voer hier de afbeeldingsbeschrijving in

Locatie klasbestand: C:\test\com\company

Bestandsnaam: Main.class

Volledig gekwalificeerde klasnaam: com.company.Main

Opdrachtregelopdracht:

java  -classpath "C:\test" com.company.Main

Houd er rekening mee dat het klaspad NIET \com\company

bevat

Antwoord 19

Ik heb behoorlijk wat tijd besteed aan het oplossen van dit probleem. Ik dacht dat ik op de een of andere manier mijn klassenpad verkeerd instelde, maar het probleem was dat ik typte:

java -cp C:/java/MyClasses C:/java/MyClasses/utilities/myapp/Cool  

in plaats van:

java -cp C:/java/MyClasses utilities/myapp/Cool   

Ik dacht dat de betekenis van volledig gekwalificeerd bedoeld was om de volledige padnaam op te nemen in plaats van de volledige pakketnaam.

Antwoord 20

Dit is een specifiek geval, maar aangezien ik naar deze pagina kwam op zoek naar een oplossing en deze niet kon vinden, zal ik deze hier toevoegen.

Windows (getest met 7) accepteert geen speciale tekens (zoals a) in klasse- en pakketnamen. Linux wel.

Ik ontdekte dit toen ik een .jar bouwde in NetBeans en probeerde het in de opdrachtregel uit te voeren. Het draaide in NetBeans maar niet in de opdrachtregel.

Antwoord 21

Wat het probleem in mijn geval oploste was:

Klik met de rechtermuisknop op het project/de klasse die u wilt uitvoeren en vervolgens Run As->Run Configurations. Dan moet u ofwel uw bestaande configuratie herstellen of nieuwe toevoegen op de volgende manier:

open het tabblad Classpath, klik op de knop Advanced... en voeg vervolgens de map bin van uw project.

Antwoord 22

Zet in Windows .; in het begin bij de CLASSPATH-waarde.

De . (punt) betekent “kijk in de huidige directory”. Dit is een permanente oplossing.

Je kunt het ook “eenmalig” instellen met CLASSPATH=%CLASSPATH%;.. Dit duurt zolang je cmd-venster open is.

Antwoord 23

Stel eerst het pad in met dit commando;

set path="paste the set path address"

Vervolgens moet u het programma laden. Typ “cd (mapnaam)” in het opgeslagen station en compileer het. Als mijn programma bijvoorbeeld op de D-schijf is opgeslagen, typt u “D:” en drukt u op enter en typt u ” cd (mapnaam)”.

Antwoord 24

Als u in Java soms de JVM uitvoert vanaf de opdrachtregel met behulp van het uitvoerbare java-bestand en u probeert een programma te starten vanuit een klassenbestand met openbare statische void main (PSVM), kunt u de onderstaande fout tegenkomen, ook al is de classpath-parameter naar de JVM is nauwkeurig en het klassenbestand is aanwezig op het klassenpad:

Error: main class not found or loaded

Dit gebeurt als het klassenbestand met PSVM niet kan worden geladen. Een mogelijke reden daarvoor is dat de klasse een interface implementeert of een andere klasse uitbreidt die niet op het klassenpad staat. Normaal gesproken, als een klasse niet op het klassenpad staat, wordt de gegenereerde fout als zodanig aangegeven. Maar als de gebruikte klasse is uitgebreid of geïmplementeerd, kan java de klasse zelf niet laden.

Referentie: https://www.computingnotes .net/java/error-main-class-not-found-or-loaded/

Antwoord 25

Je moet dit echt doen vanuit de map src. Daar typ je de volgende opdrachtregel:

[name of the package].[Class Name] [arguments]

Stel dat uw klas CommandLine.class heet, en dat de code er als volgt uitziet:

package com.tutorialspoint.java;
    /**
     * Created by mda21185 on 15-6-2016.
     */
    public class CommandLine {
        public static void main(String args[]){
            for(int i=0; i<args.length; i++){
                System.out.println("args[" + i + "]: " + args[i]);
            }
        }
    }

Vervolgens moet je cd naar de src-map plaatsen en het commando dat je moet uitvoeren ziet er als volgt uit:

java com.tutorialspoint.java.CommandLine this is a command line 200 -100

En de uitvoer op de opdrachtregel zou zijn:

args[0]: this
args[1]: is
args[2]: a
args[3]: command
args[4]: line
args[5]: 200
args[6]: -100

Antwoord 26

Als u java uitvoert met de optie -cp zoals geadverteerd in Windows PowerShell, kunt u een foutmelding krijgen die er ongeveer zo uitziet:

The term `ClassName` is not recognized as the name of a cmdlet, function, script ...

Om ervoor te zorgen dat PowerShell de opdracht accepteert, moeten de argumenten van de optie -cp tussen aanhalingstekens staan, zoals in:

java -cp 'someDependency.jar;.' ClassName

Als u de opdracht op deze manier vormt, moet Java de classpath-argumenten correct kunnen verwerken.

Antwoord 27

Ik kwam ook soortgelijke fouten tegen tijdens het testen van een Java MongoDB JDBC-verbinding. Ik denk dat het goed is om mijn uiteindelijke oplossing kort samen te vatten, zodat in de toekomst iedereen direct naar de twee commando’s kan kijken en goed is om verder te gaan.

Stel dat u zich in de map bevindt waar uw Java-bestand en externe afhankelijkheden (JAR-bestanden) zich bevinden.

Compileren:

javac -cp mongo-java-driver-3.4.1.jar JavaMongoDBConnection.java
  • -cp – classpath-argument; geef alle afhankelijke JAR-bestanden één voor één door
  • *.java – Dit is het Java-klassebestand met de hoofdmethode.
    sdsd

Uitvoeren:

java -cp mongo-java-driver-3.4.1.jar: JavaMongoDBConnection
  • Let op de dubbele punt (Unix) / komma (Windows) nadat alle afhankelijkheids-JAR-bestanden zijn beëindigd
  • Bekijk aan het einde de naam van de hoofdklasse zonder enige extensie (geen .class of .java)

Antwoord 28

Oké, er zijn al veel antwoorden, maar niemand noemde het geval waarin bestandspermissies de boosdoener kunnen zijn.

Bij het uitvoeren heeft een gebruiker mogelijk geen toegang tot het JAR-bestand of een van de mappen van het pad. Denk bijvoorbeeld aan:

Jar-bestand in /dir1/dir2/dir3/myjar.jar

Gebruiker1 die eigenaar is van het JAR-bestand kan het volgende doen:

# Running as User1
cd /dir1/dir2/dir3/
chmod +r myjar.jar

Maar het werkt nog steeds niet:

# Running as User2
java -cp "/dir1/dir2/dir3:/dir1/dir2/javalibs" MyProgram
Error: Could not find or load main class MyProgram

Dit komt omdat de huidige gebruiker (Gebruiker2) geen toegang heeft tot dir1, dir2 of javalibs of dir3. Het kan iemand gek maken als Gebruiker1 de bestanden kan zien en er toegang toe heeft, maar de fout treedt nog steeds op voor Gebruiker2.

Antwoord 29

Ik kreeg deze fout na het uitvoeren van mvn eclipse:eclipse
Dit heeft mijn .classpath-bestand een beetje in de war gebracht.

Moest de regels in .classpath wijzigen van

<classpathentry kind="src" path="src/main/java" including="**/*.java"/>
<classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>

naar

<classpathentry kind="src" path="src/main/java" output="target/classes" />
<classpathentry kind="src" path="src/main/resources" excluding="**"  output="target/classes" />

Antwoord 30

Ik was niet in staat om dit probleem op te lossen met de hier vermelde oplossingen (hoewel het gegeven antwoord ongetwijfeld mijn concepten heeft gewist). Ik heb dit probleem twee keer gehad en elke keer heb ik verschillende oplossingen geprobeerd (in de Eclipse IDE).

  • Ten eerste ben ik meerdere main methoden tegengekomen in verschillende klassen van mijn project. Dus ik had de main methode verwijderd uit de volgende lessen.
  • Ten tweede probeerde ik de volgende oplossing:
    1. Klik met de rechtermuisknop op mijn hoofdprojectdirectory.
    2. Ga naar de bron, ruim op en blijf bij de standaardinstellingen en op Voltooien. Na wat achtergrondtaken wordt u naar uw hoofdprojectdirectory geleid.
    3. Daarna sluit ik mijn project, heropen ik het en boem, ik heb eindelijk mijn probleem opgelost.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes