Risposte:
Quando programmate in Java, rendete disponibili altre classi per la classe che state scrivendo mettendo qualcosa di simile in cima al vostro file sorgente:
import org.javaguy.coolframework.MyClass;
O a volte puoi importare "in blocco" dicendo:
import org.javaguy.coolframework.*;
Quindi più avanti nel tuo programma quando dici:
MyClass mine = new MyClass();
Java Virtual Machine saprà dove trovare la tua classe compilata.
Sarebbe poco pratico che la VM guardasse tutte le cartelle della macchina, quindi è necessario fornire alla VM un elenco di posizioni da cercare. Questo viene fatto inserendo file di cartelle e jar nel tuo percorso di classe.
Prima di parlare di come è impostato il classpath, parliamo di file .class, pacchetti e file .jar.
In primo luogo, supponiamo che MyClass sia qualcosa che hai creato come parte del tuo progetto, ed è in una directory nel tuo progetto chiamata output
. Il file .class sarebbe in output/org/javaguy/coolframework/MyClass.class
(insieme a ogni altro file in quel pacchetto). Per arrivare a quel file, il tuo percorso dovrebbe semplicemente contenere la cartella "output", non l'intera struttura del pacchetto, poiché la tua dichiarazione di importazione fornisce tutte queste informazioni alla VM.
Supponiamo ora di raggruppare CoolFramework in un file .jar e di inserire CoolFramework.jar in una directory lib nel progetto. Ora dovresti inserire il lib/CoolFramework.jar
tuo percorso di classe. La VM cercherà la parte all'interno del file jar org/javaguy/coolframework
e troverà la classe.
Quindi, i percorsi di classe contengono:
Come imposti il tuo percorso di classe?
Il primo modo in cui tutti sembrano imparare è con le variabili di ambiente. Su una macchina unix, puoi dire qualcosa del tipo:
export CLASSPATH=/home/myaccount/myproject/lib/CoolFramework.jar:/home/myaccount/myproject/output/
Su un computer Windows devi andare alle impostazioni del tuo ambiente e aggiungere o modificare il valore che è già lì.
Il secondo modo è utilizzare il -cp
parametro all'avvio di Java, in questo modo:
java -cp "/home/myaccount/myproject/lib/CoolFramework.jar:/home/myaccount/myproject/output/" MyMainClass
Una variante di questo è il terzo modo che viene spesso eseguito con un file .sh
o .bat
che calcola il percorso di classe e lo passa a Java tramite il -cp
parametro.
C'è un "gotcha" con tutto quanto sopra. Sulla maggior parte dei sistemi (Linux, Mac OS, UNIX, ecc.) Il carattere due punti (':') è il separatore del percorso di classe. In windowsm il separatore è il punto e virgola (';')
Qual è il modo migliore per farlo?
Impostare le cose a livello globale tramite le variabili di ambiente è negativo, generalmente per gli stessi motivi per cui le variabili globali sono cattive. Si modifica la variabile d'ambiente CLASSPATH in modo che un programma funzioni e si finisce per interrompere un altro programma.
-Cp è la strada da percorrere. In genere mi assicuro che la mia variabile d'ambiente CLASSPATH sia una stringa vuota in cui sviluppo, quando possibile, in modo da evitare problemi di percorso di classe globali (alcuni strumenti non sono felici quando il percorso di classe globale è vuoto però - conosco due comuni, mega-mila server con licenza J2EE e Java che hanno questo tipo di problema con i loro strumenti da riga di comando).
org.javaguy.coolfw
, con la corrispondente struttura di directory /path/to/org/javaguy/coolfw/
, il percorso di classe dovrebbe contenere /path/to/
. Se aggiungo un nuovo pacchetto org.javaguy.hotfw
nello stesso progetto, la classe risultante (di solito) finisce per /path/to/org/javaguy/hotfw/
. Ciò richiede il percorso di classe da contenere /path/to/
, cosa che già fa. Quindi il nuovo pacchetto (e le classi in esso contenute) non richiedono nuove aggiunte al percorso di classe.
Il percorso di classe in questo contesto è esattamente quello che è nel contesto generale: ovunque la VM sappia che può trovare classi da caricare e anche risorse (come output.vm nel tuo caso).
Comprenderei che Velocity si aspetta di trovare un file chiamato output.vm ovunque in "nessun pacchetto". Questo può essere un JAR, una cartella normale, ... La radice di qualsiasi posizione nel percorso di classe dell'applicazione.
Impostazione della variabile di sistema CLASSPATH
Per visualizzare la variabile CLASSPATH corrente, utilizzare questi comandi in Windows e UNIX (shell Bourne): In Windows: C:\> set CLASSPATH
In UNIX: % echo $CLASSPATH
Per eliminare il contenuto corrente della variabile CLASSPATH, utilizzare questi comandi: In Windows: C:\> set CLASSPATH=
In UNIX: % unset CLASSPATH; export CLASSPATH
Per impostare la variabile CLASSPATH, utilizzare questi comandi (ad esempio): In Windows: C:\> set CLASSPATH=C:\users\george\java\classes
In UNIX: % CLASSPATH=/home/george/java/classes; export CLASSPATH
Classpath è una variabile di ambiente del sistema. L'impostazione di questa variabile viene utilizzata per fornire la radice di qualsiasi gerarchia di pacchetti al compilatore java.
CLASSPATH è una variabile di ambiente (ovvero variabili globali del sistema operativo disponibili per tutti i processi) necessarie affinché il compilatore e il runtime Java individuino i pacchetti Java utilizzati in un programma Java. (Perché non chiamare PACKAGEPATH?) Questo è simile a un'altra variabile d'ambiente PATH, che viene utilizzata dalla shell CMD per trovare i programmi eseguibili.
CLASSPATH può essere impostato in uno dei seguenti modi:
CLASSPATH can be set permanently in the environment: In Windows, choose control panel ⇒ System ⇒ Advanced ⇒ Environment Variables ⇒ choose "System Variables" (for all the users) or "User Variables" (only the currently login user) ⇒ choose "Edit" (if CLASSPATH already exists) or "New" ⇒ Enter "CLASSPATH" as the variable name ⇒ Enter the required directories and JAR files (separated by semicolons) as the value (e.g., ".;c:\javaproject\classes;d:\tomcat\lib\servlet-api.jar"). Take note that you need to include the current working directory (denoted by '.') in the CLASSPATH.
To check the current setting of the CLASSPATH, issue the following command:
> SET CLASSPATH
CLASSPATH can be set temporarily for that particular CMD shell session by issuing the following command:
> SET CLASSPATH=.;c:\javaproject\classes;d:\tomcat\lib\servlet-api.jar
Instead of using the CLASSPATH environment variable, you can also use the command-line option -classpath or -cp of the javac and java commands, for example,
> java –classpath c:\javaproject\classes com.abc.project1.subproject2.MyClass3
Un membro statico di una classe può essere chiamato direttamente senza creare un'istanza di oggetto. Poiché il metodo principale è statico, Java Virtual Machine può chiamarlo senza creare alcuna istanza di una classe che contenga il metodo principale, che è il punto iniziale del programma.
Per gli utenti Linux, e per riassumere e aggiungere ciò che altri hanno detto qui, dovresti sapere quanto segue:
$ CLASSPATH è ciò che Java usa per cercare tra più directory per trovare tutte le diverse classi di cui ha bisogno per il tuo script (a meno che tu non lo dica esplicitamente diversamente con l'override -cp). L'uso di -cp richiede di tenere traccia di tutte le directory manualmente e di copiare e incollare quella linea ogni volta che si esegue il programma (non preferibile IMO).
Il carattere due punti (":") separa le diverse directory. C'è solo un $ CLASSPATH e contiene tutte le directory. Pertanto, quando si esegue "export CLASSPATH = ...." si desidera includere il valore corrente "$ CLASSPATH" per poterlo aggiungere. Per esempio:
export CLASSPATH=.
export CLASSPATH=$CLASSPATH:/usr/share/java/mysql-connector-java-5.1.12.jar
Nella prima riga sopra, si avvia CLASSPATH con un semplice 'punto' che è il percorso della directory di lavoro corrente. Detto questo, ogni volta che esegui java cercherà le classi nella directory di lavoro corrente (quella in cui ti trovi). Nella seconda riga sopra, $ CLASSPATH prende il valore precedentemente inserito (.) E aggiunge il percorso a un dirver mysql. Ora, java cercherà il driver E le tue lezioni.
echo $CLASSPATH
è molto utile e ciò che restituisce dovrebbe essere un elenco separato da due punti di tutte le directory e dei file .jar, in cui desideri che Java cerchi le classi di cui ha bisogno.
Tomcat non utilizza CLASSPATH. Leggi cosa fare al riguardo qui: https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html