Che cos'è un percorso di classe e come lo imposto?


324

Stavo solo leggendo questa riga:

La prima cosa che fa il metodo format () è caricare un modello Velocity dal classpath chiamato output.vm

Spiegare cosa si intendeva per classpath in questo contesto e come dovrei impostare il classpath.

Risposte:


530

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.jartuo percorso di classe. La VM cercherà la parte all'interno del file jar org/javaguy/coolframeworke troverà la classe.

Quindi, i percorsi di classe contengono:

  • File JAR e
  • Percorsi per la parte superiore delle gerarchie di pacchetti.

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 -cpparametro 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 .sho .batche calcola il percorso di classe e lo passa a Java tramite il -cpparametro.

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).



In python c'è una cartella chiamata Lib dove puoi archiviare qualsiasi modulo da usare in qualsiasi momento con una semplice dichiarazione di importazione. È diverso dall'impostazione della variabile d'ambiente CLASSPATH su una directory per i pacchetti Java di terze parti? Anche se sarebbe globale, non sarebbe necessario modificare la variabile, oltre all'aggiunta di più pacchetti.
Josie Thompson,

Bella risposta, ma per i manichini qui: perché non è necessario utilizzare il comando -cp per ogni nuova classe che crei? Questo sicuramente è risolto automaticamente dal tuo sistema, giusto? Ma come? A volte incontro un problema in cui "qualcosa" non può essere trovato nel mio percorso di classe - immagino che sia così perché non l'ho aggiunto al CP, ma perché un tale errore si verifica solo a volte anziché sempre? Lo chiedo perché, a dire il vero, non ho mai incluso nulla manualmente con il comando -cp e non saprei cosa fare con un errore del genere
Vic Torious,

2
@Vic Il percorso di classe deve contenere la directory sopra la gerarchia di directory corrispondente al nome del pacchetto. Quindi, se ho 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.hotfwnello 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.
telefonando il

@Vic Per un esempio e una spiegazione più concreti, vedi Padroneggiare il CLASSPATH Java (per l'eccellente commento di
KNU

67

Pensalo come la risposta di Java alla variabile d'ambiente PATH: i sistemi operativi cercano EXE sul PATH, Java cerca classi e pacchetti sul percorso di classe.


13

Il percorso di classe è il percorso in cui la Java Virtual Machine cerca classi, pacchetti e risorse definiti dall'utente nei programmi Java.

In questo contesto, il format()metodo carica un file modello da questo percorso.


5

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.


2

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


1
Mentre questi comandi possono essere utili per lavorare con le variabili di ambiente, questo non risponde alla domanda
Hulk

1

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.


1

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

0

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.


0

Per gli utenti Linux, e per riassumere e aggiungere ciò che altri hanno detto qui, dovresti sapere quanto segue:

  1. $ 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).

  2. 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.

  3. 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.

  4. Tomcat non utilizza CLASSPATH. Leggi cosa fare al riguardo qui: https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.