Un problema comune riscontrato dai nuovi sviluppatori Java è che i loro programmi non vengono eseguiti con il messaggio di errore: Could not find or load main class ...
Che cosa significa questo, cosa lo causa e come dovresti risolverlo?
Un problema comune riscontrato dai nuovi sviluppatori Java è che i loro programmi non vengono eseguiti con il messaggio di errore: Could not find or load main class ...
Che cosa significa questo, cosa lo causa e come dovresti risolverlo?
Risposte:
java <class-name>
sintassi del comandoPrima di tutto, devi capire il modo corretto di avviare un programma usando il comando java
(o javaw
).
La sintassi normale 1 è questa:
java [ <options> ] <class-name> [<arg> ...]
dove <option>
è un'opzione della riga di comando (che inizia con un carattere "-"), <class-name>
è un nome di classe Java pienamente qualificato ed <arg>
è un argomento di riga di comando arbitrario che viene passato all'applicazione.
1 - Ci sono alcune altre sintassi che sono descritte alla fine di questa risposta.
Il nome completo (FQN) per la classe è scritto in modo convenzionale come nel codice sorgente Java; per esempio
packagename.packagename2.packagename3.ClassName
Tuttavia, alcune versioni del java
comando consentono di utilizzare le barre anziché i punti; per esempio
packagename/packagename2/packagename3/ClassName
che (in modo confuso) assomiglia a un percorso di file, ma non lo è. Nota che il termine nome completo è terminologia Java standard ... non qualcosa che ho appena inventato per confonderti :-)
Ecco un esempio di come java
dovrebbe apparire un comando:
java -Xmx100m com.acme.example.ListUsers fred joe bert
Quanto sopra causerà il java
comando di eseguire le seguenti operazioni:
com.acme.example.ListUsers
classe.main
metodo con firma , tipo restituito e modificatori forniti da public static void main(String[])
. (Nota, il nome dell'argomento del metodo NON fa parte della firma.)String[]
.Quando viene visualizzato il messaggio "Impossibile trovare o caricare la classe principale ...", significa che il primo passaggio non è riuscito. Il java
comando non è stato in grado di trovare la classe. E in effetti, il "..." nel messaggio sarà il nome di classe completo che java
sta cercando.
Quindi perché potrebbe non essere in grado di trovare la classe?
La prima causa probabile è che potresti aver fornito il nome della classe errato. (O ... il nome della classe giusto, ma nella forma sbagliata.) Considerando l'esempio sopra, ecco una varietà di modi sbagliati per specificare il nome della classe:
Esempio n. 1: un semplice nome di classe:
java ListUser
Quando la classe viene dichiarata in un pacchetto come com.acme.example
, allora è necessario utilizzare il nome completo della classe incluso il nome del pacchetto nel java
comando; per esempio
java com.acme.example.ListUser
Esempio n. 2 - un nome file o nome percorso anziché un nome classe:
java ListUser.class
java com/acme/example/ListUser.class
Esempio n. 3 - un nome di classe con il case non corretto:
java com.acme.example.listuser
Esempio n. 4: un errore di battitura
java com.acme.example.mistuser
Esempio n. 5 - un nome file sorgente (tranne Java 11 o successivo; vedi sotto)
java ListUser.java
Esempio n. 6: hai dimenticato del tutto il nome della classe
java lots of arguments
La seconda causa probabile è che il nome della classe sia corretto, ma che il java
comando non riesca a trovare la classe. Per capirlo, devi capire il concetto di "percorso di classe". Questo è spiegato bene dalla documentazione Oracle:
java
documentazione del comandoQuindi ... se hai specificato correttamente il nome della classe, la prossima cosa da verificare è che hai specificato correttamente il percorso della classe:
java
comando. Verificare che i nomi delle directory e dei file JAR siano corretti.java
comando.;
su Windows e :
sugli altri. Se si utilizza il separatore errato per la propria piattaforma, non verrà visualizzato un messaggio di errore esplicito. Invece, sul percorso verrà visualizzato un file o una directory inesistente che verrà silenziosamente ignorato .)Quando si inserisce una directory nel percorso di classe, corrisponde teoricamente alla radice dello spazio dei nomi qualificato. Le classi si trovano nella struttura della directory sotto quella radice, associando il nome completo a un nome percorso . Ad esempio, se "/ usr / local / acme / classes" si trova sul percorso della classe, quindi quando la JVM cerca una classe chiamata com.acme.example.Foon
, cercherà un file ".class" con questo percorso:
/usr/local/acme/classes/com/acme/example/Foon.class
Se avessi inserito "/ usr / local / acme / classes / com / acme / example" sul percorso della classe, la JVM non sarebbe in grado di trovare la classe.
Se la tua classe FQN è com.acme.example.Foon
, allora la JVM cercherà "Foon.class" nella directory "com / acme / example":
Se la struttura della directory non corrisponde alla denominazione del pacchetto secondo il modello sopra, JVM non troverà la tua classe.
Se si tenta di rinominare una classe spostandola, anche questo fallirà ... ma l'eccezione stacktrace sarà diversa. È possibile dire qualcosa del genere:
Caused by: java.lang.NoClassDefFoundError: <path> (wrong name: <name>)
perché l'FQN nel file di classe non corrisponde a ciò che il caricatore di classe si aspetta di trovare.
Per fare un esempio concreto, supponendo che:
com.acme.example.Foon
lezione,/usr/local/acme/classes/com/acme/example/Foon.class
,/usr/local/acme/classes/com/acme/example/
,poi:
# 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
Appunti:
-classpath
opzione può essere abbreviata -cp
in molte versioni di Java. Controllare le rispettive voci manuali per java
, javac
e così via.Il percorso di classe deve includere tutte le altre classi (non di sistema) dalle quali l'applicazione dipende. (Le classi di sistema si trovano automaticamente e raramente devi preoccuparti di questo.) Per caricare correttamente la classe principale, la JVM deve trovare:
(Nota: le specifiche JLS e JVM consentono un certo ambito per una JVM per caricare le classi "pigramente", e ciò può influire quando viene generata un'eccezione del caricatore di classi.)
A volte capita che qualcuno inserisca un file di codice sorgente nella cartella sbagliata nella sua struttura di codice sorgente, oppure tralasci la package
dichiarazione. Se lo fai in un IDE, il compilatore dell'IDE te ne parlerà immediatamente. Allo stesso modo se si utilizza uno strumento di compilazione Java decente, lo strumento verrà eseguito javac
in modo da rilevare il problema. Tuttavia, se si crea manualmente il codice Java, è possibile farlo in modo tale che il compilatore non noti il problema e il file ".class" risultante non si trovi nel punto previsto.
Ci sono molte cose da controllare ed è facile perdere qualcosa. Prova ad aggiungere l' -Xdiag
opzione alla java
riga di comando (come prima cosa dopo java
). Produrrà varie cose sul caricamento della classe, e questo potrebbe offrire indizi su quale sia il vero problema.
Inoltre, considera i possibili problemi causati dalla copia e dall'incollaggio di caratteri invisibili o non ASCII da siti Web, documenti e così via. E considera "omogenei", dove due lettere o simboli sembrano uguali ... ma non lo sono.
Infine, apparentemente puoi riscontrare questo problema se provi ad avviarlo da un file JAR con firme errate (META-INF/*.SF)
.
java
Esistono tre sintassi alternative per l'avvio dei programmi Java mediante java command
.
1) La sintassi utilizzata per l'avvio di un file JAR "eseguibile" è la seguente:
java [ <options> ] -jar <jar-file-name> [<arg> ...]
per esempio
java -Xmx100m -jar /usr/local/acme-example/listuser.jar fred
Il nome della classe del punto di ingresso (cioè com.acme.example.ListUser
) e il percorso della classe sono specificati nel MANIFEST del file JAR.
2) La sintassi per l'avvio di un'applicazione da un modulo (Java 9 e versioni successive) è la seguente:
java [ <options> ] --module <module>[/<mainclass>] [<arg> ...]
Il nome della classe entrypoint è definito dallo <module>
stesso o è dato dall'opzionale <mainclass>
.
3) Da Java 11 in poi, è possibile compilare ed eseguire un singolo file di codice sorgente ed eseguirlo con la seguente sintassi:
java [ <options> ] <sourcefile> [<arg> ...]
dove si trova (in genere) un file con il suffisso ".java".
Per maggiori dettagli, consultare la documentazione ufficiale per il java
comando per la versione Java che si sta utilizzando.
Un IDE Java tipico ha il supporto per l'esecuzione di applicazioni Java nell'IDE JVM stesso o in una JVM figlio. Questi sono generalmente immuni da questa particolare eccezione, perché l'IDE utilizza i propri meccanismi per costruire il percorso di classe di runtime, identificare la classe principale e creare la java
riga di comando.
Tuttavia è ancora possibile che si verifichi questa eccezione, se si eseguono operazioni dietro l'IDE. Ad esempio, se in Eclipse in precedenza è stato impostato un Avvio applicazioni per l'app Java e quindi si è spostato il file JAR contenente la classe "principale" in una posizione diversa nel file system senza dirlo a Eclipse , Eclipse avvierebbe involontariamente la JVM con un percorso di classe errato.
In breve, se si riscontra questo problema in un IDE, verificare la presenza di elementi come lo stato IDE non aggiornato, i riferimenti di progetto non funzionanti o le configurazioni di avvio non funzionanti.
È anche possibile che un IDE venga semplicemente confuso. Gli IDE sono software estremamente complicati che comprendono molte parti interagenti. Molte di queste parti adottano varie strategie di memorizzazione nella cache per rendere l'IDE nel suo insieme reattivo. A volte questi possono andare storti e un possibile sintomo sono i problemi all'avvio delle applicazioni. Se sospetti che ciò accada, vale la pena provare altre cose come riavviare l'IDE, ricostruire il progetto e così via.
java -cp ../third-party-library.jar com.my.package.MyClass
:; questo non funziona, ma è necessario aggiungere anche la cartella locale al percorso della classe (separati da :
, in questo modo java -cp ../third-party-library.jar:. com.my.package.MyClass
java
non dice che non trova una classe importata, ma invece la classe principale che stai cercando di eseguire. Questo è fuorviante, anche se sono sicuro che ci sia una ragione per questo. Ho avuto il caso in cui java
sapevo esattamente dove si trova la mia classe, tuttavia non è stato possibile trovare una delle classi importate. Invece di dirlo, si lamentava di non trovare la mia classe principale. Davvero fastidioso.
Se il nome del codice sorgente è HelloWorld.java, lo sarà il codice compilato HelloWorld.class
.
Otterrai quell'errore se lo chiami usando:
java HelloWorld.class
Invece, usa questo:
java HelloWorld
javac TestCode.java
seguito dajava TestCode
java -classpath . HelloWorld
Se le classi si trovano in pacchetti, è necessario cd
accedere alla directory principale del progetto ed eseguire utilizzando il nome completo della classe (nomepacchetto.MainClassName).
Esempio:
Le mie lezioni sono qui:
D:\project\com\cse\
Il nome completo della mia classe principale è:
com.cse.Main
Quindi cd
torno alla directory del progetto di root:
D:\project
Quindi emettere il java
comando:
java com.cse.Main
Questa risposta è per salvare i programmatori Java principianti dalla frustrazione causata da un errore comune, ti consiglio di leggere la risposta accettata per una conoscenza più approfondita del percorso di classe Java.
Se si definisce la classe principale e il metodo principale in apackage
, è necessario eseguirlo sulla directory gerarchica, utilizzando il nome completo della classe ( packageName.MainClassName
).
Supponiamo che esista un file di codice sorgente (Main.java):
package com.test;
public class Main {
public static void main(String[] args) {
System.out.println("salam 2nya\n");
}
}
Per eseguire questo codice, è necessario inserirlo Main.Class
nel pacchetto come directory ./com/test/Main.Java
. E nella directory principale utilizzare java com.test.Main
.
Quando lo stesso codice funziona su un PC, ma mostra l'errore in un altro, la soluzione migliore che abbia mai trovato è la compilazione come la seguente:
javac HelloWorld.java
java -cp . HelloWorld
javac -classpath . HelloWorld.java
avrebbe funzionato! E questa è una soluzione migliore nel tuo caso.
Ciò che mi ha aiutato è stato specificare il percorso di classe sulla riga di comando, ad esempio:
Crea una nuova cartella, C:\temp
Crea il file Temp.java in C:\temp
, con la seguente classe al suo interno:
public class Temp {
public static void main(String args[]) {
System.out.println(args[0]);
}
}
Aprire una riga di comando nella cartella C:\temp
e scrivere il comando seguente per compilare la classe Temp:
javac Temp.java
Esegui la classe Java compilata, aggiungendo l' -classpath
opzione per far sapere a JRE dove trovare la classe:
java -classpath C:\temp Temp Hello!
java
non stava guardando $ CLASSPATH (perché hai usato -classpath o -jar) o 2) l'impostazione del percorso di classe non era impostata nell'ambiente che non era in vigore nel contesto che java
era correre; ad esempio perché non hai "sorgente" il file dove sono stati aggiunti i comandi setenv nella shell giusta.
In base al messaggio di errore ("Impossibile trovare o caricare la classe principale"), esistono due categorie di problemi:
Impossibile trovare la classe principale in caso di errore di battitura o sintassi errata nel nome della classe completo o se non esiste nel percorso di classe fornito .
La classe principale non può essere caricata quando la classe non può essere avviata , in genere la classe principale estende un'altra classe e quella classe non esiste nel percorso di classe fornito.
Per esempio:
public class YourMain extends org.apache.camel.spring.Main
Se la molla a cammello non è inclusa, verrà segnalato questo errore.
extends
). Ho appena imparato a mie spese che quando la classe principale non riesce a caricarsi perché ne estende un'altra che non è stata trovata , java non segnala quale classe effettiva non è stata trovata (a differenza NoClassDefFoundError
). Quindi sì, succede, ed è una situazione da capogiro quando non lo sai.
Ho avuto un errore del genere in questo caso:
java -cp lib.jar com.mypackage.Main
Funziona con ;
Windows e :
Unix:
java -cp lib.jar; com.mypackage.Main
Main
non è nel file JAR. -cp lib.jar;
indica la stessa cosa, ad -cp lib.jar;.
esempio, la directory corrente è inclusa nel percorso di classe.
Prova -Xdiag .
La risposta di Steve C copre bene i possibili casi, ma a volte determinare se la classe non può essere trovata o caricata potrebbe non essere così facile. Utilizzare java -Xdiag
(dal JDK 7). Questo stampa una bella traccia stack che fornisce un suggerimento sul Could not find or load main class
significato del messaggio.
Ad esempio, può indicare altre classi utilizzate dalla classe principale che non sono state trovate e che hanno impedito il caricamento della classe principale.
Usa questo comando:
java -cp . [PACKAGE.]CLASSNAME
Esempio: se il tuo nome di classe è Hello.class creato da Hello.java, utilizza il comando seguente:
java -cp . Hello
Se il tuo file Hello.java si trova nel pacchetto com.demo, usa il comando seguente
java -cp . com.demo.Hello
Con JDK 8 molte volte accade che il file di classe sia presente nella stessa cartella, ma il java
comando prevede il percorso di classe e per questo motivo aggiungiamo -cp .
di prendere la cartella corrente come riferimento per il percorso di classe.
-cp .
non è necessario, perché se $CLASSPATH
non è impostato, allora .
è il percorso di classe predefinito.
echo %CLASSPATH%
output?) E no, non riesco a controllare perché non ho un PC Windows.
A volte ciò che potrebbe causare il problema non ha nulla a che fare con la classe principale, e ho dovuto scoprirlo nel modo più difficile. Era una libreria di riferimento che ho spostato e mi ha dato:
Impossibile trovare o caricare la classe principale xxx Linux
Ho appena eliminato quel riferimento, l'ho aggiunto di nuovo e ha funzionato di nuovo bene.
In questo caso hai:
Impossibile trovare o caricare la classe principale ? Classpath
È perché stai usando "-classpath", ma il trattino non è lo stesso trattino usato dal java
prompt dei comandi. Ho avuto questo problema copiando e incollando da Blocco note a cmd.
Ho avuto lo stesso problema e finalmente ho trovato il mio errore :) Ho usato questo comando per la compilazione e ha funzionato correttamente:
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
Ma questo comando non ha funzionato per me (non sono riuscito a trovare o caricare la classe principale 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
Alla fine ho appena aggiunto il carattere ':' alla fine del percorso di classe e il problema è stato risolto:
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
Nel mio caso, è apparso un errore perché avevo fornito il nome del file di origine anziché il nome della classe.
Dobbiamo fornire il nome della classe contenente il metodo principale all'interprete.
Questo potrebbe aiutarti se il tuo caso è specificamente simile al mio: come principiante ho anche riscontrato questo problema quando ho provato a eseguire un programma Java.
L'ho compilato in questo modo:
javac HelloWorld.java
E ho provato a correre anche con la stessa estensione:
java Helloworld.java
Quando ho rimosso il .java
e riscritto il comando come java HelloWorld
, il programma ha funzionato perfettamente. :)
Sembra che tutte le risposte qui siano dirette agli utenti Windows. Per Mac, il separatore del percorso di classe è :
no ;
. Poiché non viene generato un errore durante l'impostazione del percorso di classe, ;
questo può essere difficile da scoprire se proviene da Windows a Mac.
Ecco il comando Mac corrispondente:
java -classpath ".:./lib/*" com.test.MyClass
Dove in questo esempio si trova il pacchetto com.test
e una lib
cartella deve essere inclusa nel percorso di classe.
/*
è necessario
Posizione del file di classe: C: \ test \ com \ company
Nome file: Main.class
Nome di classe completo : com.company.Main
Comando da riga di comando:
java -classpath "C:\test" com.company.Main
Nota qui che il percorso della classe NON include \ com \ company
Ho trascorso una discreta quantità di tempo cercando di risolvere questo problema. Ho pensato che in qualche modo stavo impostando il mio classpath in modo errato, ma il problema era che ho digitato:
java -cp C:/java/MyClasses C:/java/MyClasses/utilities/myapp/Cool
invece di:
java -cp C:/java/MyClasses utilities/myapp/Cool
Ho pensato che il significato di pienamente qualificato intendesse includere il nome completo del percorso anziché il nome completo del pacchetto.
utilities.myapp.Cool
o qualunque sia il nome del suo pacchetto, se presente.
Innanzitutto imposta il percorso usando questo comando;
set path="paste the set path address"
Quindi è necessario caricare il programma. Digitare "cd (nome cartella)" nell'unità memorizzata e compilarlo. Ad esempio, se il mio programma è stato memorizzato sull'unità D, digitare "D:" premere Invio e digitare "cd (nome cartella)".
if "cd" helps then it by luck rather than by judgement
. Questo è sbagliato (credo), poiché java utilizza la directory corrente .
come parte del percorso di classe per impostazione predefinita.
Ciò che risolveva il problema nel mio caso era:
Fare clic con il tasto destro sul progetto / classe che si desidera eseguire, quindi Run As
-> Run Configurations
. Quindi è necessario correggere la configurazione esistente o aggiungerne di nuovi nel modo seguente:
apri la Classpath
scheda, fai clic sul Advanced...
pulsante quindi aggiungi la bin
cartella del tuo progetto.
Se usi Maven per creare il file JAR, assicurati di specificare la classe principale nel file pom.xml:
<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>
Questo è un caso specifico, ma da quando sono arrivato a questa pagina alla ricerca di una soluzione e non l'ho trovata, la aggiungerò qui.
Windows (testato con 7) non accetta caratteri speciali (come á
) in nomi di classi e pacchetti. Linux lo fa, però.
L'ho scoperto quando ho creato un .jar
in NetBeans e ho provato a eseguirlo nella riga di comando. Funzionava in NetBeans ma non nella riga di comando.
Su Windows inserisci .;
il valore CLASSPATH all'inizio.
Il . (punto) significa "cerca nella directory corrente". Questa è una soluzione permanente.
Inoltre puoi impostarlo "una volta" con set CLASSPATH=%CLASSPATH%;.
. Questo durerà fino a quando la finestra cmd è aperta.
Devi davvero farlo dalla src
cartella. Lì si digita la seguente riga di comando:
[name of the package].[Class Name] [arguments]
Diciamo che la tua classe si chiama CommandLine.class
e il codice è simile al seguente:
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]);
}
}
}
Quindi dovresti accedere cd
alla cartella src e il comando che devi eseguire sarebbe simile al seguente:
java com.tutorialspoint.java.CommandLine this is a command line 200 -100
E l'output sulla riga di comando sarebbe:
args[0]: this
args[1]: is
args[2]: a
args[3]: command
args[4]: line
args[5]: 200
args[6]: -100
cd
inserire src
e quindi eseguire il comando java ../bin com.blah.blah.MyClass
che ha funzionato per me. Quindi grazie per il suggerimento!
In Java, quando a volte si esegue JVM dalla riga di comando utilizzando l'eseguibile java e si sta tentando di avviare un programma da un file di classe con vuoto statico pubblico principale (PSVM), è possibile che si verifichi l'errore riportato di seguito anche se il parametro classpath in la JVM è precisa e il file di classe è presente sul percorso di classe:
Error: main class not found or loaded
Ciò accade se non è stato possibile caricare il file di classe con PSVM. Una possibile ragione di ciò è che la classe potrebbe implementare un'interfaccia o estendere un'altra classe che non si trova sul percorso di classe. Normalmente se una classe non si trova sul percorso di classe, l'errore generato indica come tale. Tuttavia, se la classe in uso viene estesa o implementata, java non è in grado di caricare la classe stessa.
Riferimento: https://www.computingnotes.net/java/error-main-class-not-found-or-loaded/
Quando si esegue la java
con l' -cp
opzione come pubblicizzato in Windows PowerShell è possibile ottenere un errore che sembra qualcosa di simile:
The term `ClassName` is not recognized as the name of a cmdlet, function, script ...
Affinché PowerShell accetti il comando, gli argomenti -cp
dell'opzione devono essere racchiusi tra virgolette come in:
java -cp 'someDependency.jar;.' ClassName
Formare il comando in questo modo dovrebbe consentire a Java di elaborare correttamente gli argomenti del percorso di classe.
Ho anche riscontrato errori simili durante il test di una connessione JDBC Java MongoDB. Penso che sia utile riassumere la mia soluzione finale in breve, in modo che in futuro chiunque possa esaminare direttamente i due comandi e procedere bene.
Supponiamo di essere nella directory in cui esistono il file Java e le dipendenze esterne (file JAR).
Compilare:
javac -cp mongo-java-driver-3.4.1.jar JavaMongoDBConnection.java
Correre:
java -cp mongo-java-driver-3.4.1.jar: JavaMongoDBConnection
JavaMongoDBConnection
non abbia un pacchetto e 2) non cambi directory. È, per non dire altro, fragile. E non spiegando i problemi, porterà i neofiti a provare questo approccio in situazioni in cui non funzionerà . In breve, incoraggia le "tecniche di programmazione voodoo": en.wikipedia.org/wiki/Voodoo_programming
Va bene, ci sono già molte risposte, ma nessuno ha menzionato il caso in cui le autorizzazioni ai file possono essere il colpevole.
Durante l'esecuzione, un utente potrebbe non avere accesso al file JAR o a una delle directory del percorso. Ad esempio, considera:
File Jar in /dir1/dir2/dir3/myjar.jar
L'utente1 che possiede il file JAR può fare:
# Running as User1
cd /dir1/dir2/dir3/
chmod +r myjar.jar
Ma non funziona ancora:
# Running as User2
java -cp "/dir1/dir2/dir3:/dir1/dir2/javalibs" MyProgram
Error: Could not find or load main class MyProgram
Questo perché l'utente in esecuzione (Utente2) non ha accesso a dir1, dir2 o javalibs o dir3. Potrebbe far impazzire qualcuno quando User1 può vedere i file e può accedervi, ma l'errore si verifica ancora per User2.
Ho avuto questo errore dopo aver fatto mvn eclipse:eclipse
Questo ha incasinato .classpath
un po 'il mio file.
Ho dovuto cambiare le righe .classpath
da
<classpathentry kind="src" path="src/main/java" including="**/*.java"/>
<classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
per
<classpathentry kind="src" path="src/main/java" output="target/classes" />
<classpathentry kind="src" path="src/main/resources" excluding="**" output="target/classes" />
Non sono stato in grado di risolvere questo problema con le soluzioni indicate qui (sebbene la risposta dichiarata abbia senza dubbio chiarito i miei concetti). Ho affrontato questo problema due volte e ogni volta ho provato diverse soluzioni (nell'IDE Eclipse).
main
metodi in diverse classi del mio progetto. Quindi, avevo eliminato il main
metodo dalle classi successive.main
metodi non risolverà il problema. Non c'è nulla di tecnicamente sbagliato in un'applicazione con più punti di ingresso.