2012-07-12 22 views
11

Ok, sono molto nuovo a linux e riga di comando, e abbastanza nuovo a java. Ho ottenuto uno stage per costruire un programma java. Finalmente l'ho fatto sul mio computer (Windows) e ora devo migrarlo su una macchina Linux per testarlo e poi farlo funzionare come un eseguibile. Ho fatto molte letture e ricerche su Linux e sulla comprensione dei percorsi di classe, ma è ancora tutto molto difficile da comprendere appieno. Non sta ancora facendo clic per me. Qualcuno può spiegare lo scopo del classpath in modo semplificato usando degli esempi? Uno degli aspetti più confusi per me è in realtà la definizione del percorso fisico per il vaso. Comincio da usr o devo solo iniziare dalla cartella jvm? Se è importante, il mio programma java non si trova nella cartella jvm. Qualcuno può far luce per me?Come aggiungere più file jar in classpath in linux

EDIT: grazie mille per il vostro aiuto, non posso dire di essere completamente chiaro ma la mia comprensione della mia situazione è molto migliore.

+0

Possibile duplicato di [Inclusi tutti i vasi in una directory all'interno del percorso di classe Java] (https://stackoverflow.com/questions/219585/including-all-the-jars-in-a-directory -within-the-java-classpath) – Stewart

risposta

10

Si utilizza l'argomento -classpath. Puoi usare un percorso relativo o assoluto. Ciò significa che puoi utilizzare un percorso relativo alla tua directory corrente, oppure puoi utilizzare un percorso assoluto che inizia alla radice /.

Esempio:

bash$ java -classpath path/to/jar/file MyMainClass 

In questo esempio la funzione main si trova in MyMainClass e sarebbe incluso da qualche parte nel file jar.

Per la compilazione è necessario utilizzare javac

Esempio:

bash$ javac -classpath path/to/jar/file MyMainClass.java 

È inoltre possibile specificare il percorso di classe tramite la variabile d'ambiente, seguire :

bash$ export CLASSPATH="path/to/jar/file:path/tojar/file2" 
bash$ javac MyMainClass.java 

Per qualsiasi java normalmente complessa progetto dovresti cercare lo script ant build.xml

+1

Quindi se il programma java che sto cercando di compilare si chiama SnortMonitor l'esempio cambierà in: bash $ java -classpath percorso/a/jar/file SnortMonitor –

+1

Ah per la compilazione di cui hai bisogno per chiamare 'javac' invece di' java', ma si usa ancora -classpath e la directory dei sorgenti. – Petriborg

+0

grazie per il tuo aiuto, ma potresti essere un po 'più specifico? Forse è a causa della mia mancanza di comprensione. Quando scrivo "javac SnortMonitor.java, ottengo un elenco di errori e so che è perché ho bisogno di includere 2 file jar da una directory chiamata jsendnsca.Devo includere quei jar nel classpath ogni volta che compilo ed eseguo il programma? –

5

Il classpath è il luogo (i) in cui vengono visualizzati il ​​compilatore java (comando: javac) e la JVM (comando: java) per trovare le classi di riferimento dell'applicazione. Che cosa significa per un'applicazione fare riferimento a un'altra classe? In parole semplici significa utilizzare questa classe da qualche parte nel suo codice:

Esempio:

public class MyClass{ 
    private AnotherClass referenceToAnotherClass; 
    ..... 
} 

Quando si tenta di compilare questo (javac) il compilatore avrà bisogno la classe AnotherClass. Lo stesso quando provi ad eseguire la tua applicazione: la JVM avrà bisogno della classe AnotherClass. Per trovare questa classe, javac e JVM guardano in un particolare (insieme di) posto (i). Questi posti sono specificati dal classpath che su linux è una lista di directory separate da due punti (directory in cui javac/JVM dovrebbe apparire per localizzare AnotherClass quando ne hanno bisogno).

Quindi, per compilare la classe e quindi eseguirla, è necessario assicurarsi che il classpath contenga la directory contenente la classe AnotherClass. Poi si richiama in questo modo:

javac -classpath "dir1;dir2;path/to/AnotherClass;...;dirN" MyClass.java //to compile it 
java -classpath "dir1;dir2;path/to/AnotherClass;...;dirN" MyClass //to run it 

Di solito le classi si presentano sotto forma di "fasci" chiamati file jar/librerie.In questo caso è necessario fare in modo che il vaso che contiene la classe AnotherClass è sulla vostra classpaht:

javac -classpath "dir1;dir2;path/to/jar/containing/AnotherClass;...;dirN" MyClass.java //to compile it 
java -classpath ".;dir1;dir2;path/to/jar/containing/AnotherClass;...;dirN" MyClass //to run it 

Negli esempi sopra potete vedere come compilare una classe (MyClass.java) che si trova nella directory di lavoro e quindi eseguire la classe compilata (notare il punto "." all'inizio del classpath che rappresenta la directory corrente). Questa directory deve essere aggiunta anche al classpath. In caso contrario, la JVM non sarà in grado di trovarla.

Se si dispone della classe in un file jar, come specificato nella domanda, è necessario assicurarsi che anche jar sia nel classpath, insieme al resto delle directory necessarie.

Esempio:

java -classpath ".;dir1;dir2;path/to/jar/containing/AnotherClass;path/to/MyClass/jar...;dirN" MyClass //to run it 

o più generale (supponendo qualche gerarchia pacchetto):

java -classpath ".;dir1;dir2;path/to/jar/containing/AnotherClass;path/to/MyClass/jar...;dirN" package.subpackage.MyClass //to run it 

Al fine di evitare di impostare il percorso di classe ogni volta che si desidera eseguire un'applicazione è possibile definire una variabile d'ambiente chiamato CLASSPATH.

in Linux, in prompt dei comandi:

export CLASSPATH="dir1;dir2;path/to/jar/containing/AnotherClass;...;dirN" 

o modificare il file ~/.bashrc e aggiungete questa linea da qualche parte alla fine;

Tuttavia, il percorso di classe è soggetto a frequenti modifiche, pertanto è possibile che il percorso di classe sia impostato su un insieme principale di dir, che è necessario frequentemente e quindi estende il percorso di classe ogni volta che è necessario solo per quella sessione. In questo modo:

export CLASSPATH=$CLASSPATH:"new directories according to your current needs" 
+0

dovrò definire questi percorsi di classe ogni volta che voglio compilare ed eseguire? –

+0

Ho modificato la mia risposta – Razvan

16

Supponiamo di avere più file jar a.jar, b.jar e c.jar. Per aggiungerli al classpath durante la compilazione è necessario fare

$javac -cp .:a.jar:b.jar:c.jar HelloWorld.java 

Per eseguire fare

$java -cp .:a.jar:b.jar:c.jar HelloWorld 
0

Fase 1.

vi ~/.bashrc 

Fase 2. Append questa linea l'ultimo:

export CLASSPATH=$CLASSPATH:/home/abc/lib/*; (Assuming the jars are stored in /home/abc/lib) 

Passaggio 3.

source ~/.bashrc 

Dopo aver eseguito questi passaggi, completare ed eseguire i programmi (ad es. javac xyz.java)

Problemi correlati