2012-07-12 5 views
11

Okay, ich bin sehr neu zu Linux und Kommandozeile, und ziemlich neu zu Java. Ich habe ein Praktikum gemacht, um ein Java-Programm aufzubauen. Ich habe es endlich auf meinem Rechner (Windows) geschafft und muss es nun auf einen Linux-Rechner migrieren, um es zu testen und dann als ausführbare Datei laufen zu lassen. Ich habe viel über Linux gelesen und geforscht und Klassenpfade verstanden, aber es ist immer noch sehr schwer zu verstehen. Es klickt nur noch nicht für mich. Kann jemand den Zweck des Klassenwegs anhand von Beispielen vereinfacht erklären? Einer der verwirrendsten Aspekte ist, dass ich den physischen Pfad zum Glas definiere. Fange ich den ganzen Weg von usr an oder muss ich nur vom jvm-Ordner anfangen? Wenn es darauf ankommt, befindet sich mein Java-Programm nicht im Ordner jvm. Kann jemand etwas Licht für mich abwerfen?Wie man mehrere Jar-Dateien in Klassenpfad in Linux hinzufügen

EDIT: Vielen Dank für Ihre Hilfe, ich kann nicht sagen, dass ich völlig klar bin, aber mein Verständnis meiner Situation ist viel besser.

+0

Mögliches Duplikat von [Einschließlich aller Dateien in einem Verzeichnis innerhalb des Java-Klassenpfads] (https://stackoverflow.com/questions/219585/including-all-the-jars-in-a-directory) -within-the-java-classpath) – Stewart

Antwort

10

Sie verwenden das Argument -classpath. Sie können entweder einen relativen oder absoluten Pfad verwenden. Dies bedeutet, dass Sie einen Pfad relativ zu Ihrem aktuellen Verzeichnis verwenden können, ODER Sie können einen absoluten Pfad verwenden, der am Stamm / beginnt.

Beispiel:

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

In diesem Beispiel wird die main Funktion in MyMainClass befindet und würde irgendwo in der JAR-Datei enthalten sein.

Für Kompilieren Sie javac

Beispiel verwenden müssen:

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

Sie auch die Classpath über die Umgebungsvariable angeben können, folgen :

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

Für jede Regel komplexe Java Projekt sollten Sie für die Ant-Skript mit dem Namen build.xml

suchen
+1

Wenn das Java-Programm, das ich zu kompilieren versuche, heißt SnortMonitor würde Ihr Beispiel zu ändern: bash $ java -classpath pfad/zu/jar/file SnortMonitor –

+1

Ah zum kompilieren benötigen Sie um 'javac' anstatt' java' aufzurufen, aber Sie benutzen immer noch -classpath und das Quellverzeichnis. – Petriborg

+0

vielen Dank für Ihre Hilfe, aber könnten Sie bitte etwas genauer sein? Vielleicht liegt es an meinem Mangel an Verständnis. Wenn ich "javac SnortMonitor.java" schreibe, bekomme ich eine Liste von Fehlern, und ich weiß es, weil ich 2 JAR-Dateien aus einem Verzeichnis namens jsendnsca einschließen muss.Muss ich diese Jars jedes Mal in den Klassenpfad einschließen, wenn ich das Programm kompiliere und ausführe? –

5

Der Klassenpfad ist der Ort, an dem der Java-Compiler (Befehl: javac) und der JVM (Befehl: java) suchen, um Klassen zu finden, auf die sich Ihre Anwendung bezieht. Was bedeutet es für eine Anwendung, eine andere Klasse zu referenzieren? In einfachen Worten bedeutet dies, dass Klasse irgendwo in ihrem Code zu verwenden:

Beispiel:

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

Wenn Sie versuchen, diese (javac) zu kompilieren, wird der Compiler die Klasse Andere benötigen. Dasselbe, wenn Sie versuchen, Ihre Anwendung auszuführen: Die JVM benötigt die Klasse AnotherClass. Um diese Klasse zu finden, sehen der Javac und die JVM in einer bestimmten (Menge von) Orten aus. Diese Stellen werden durch den Klassenpfad angegeben, der unter linux eine durch Doppelpunkte getrennte Liste von Verzeichnissen ist (Verzeichnisse, in denen javac/JVM suchen sollte, um die AnotherClass zu finden, wenn sie sie brauchen).

Um also Ihre Klasse zu kompilieren und dann auszuführen, sollten Sie sicherstellen, dass der Klassenpfad das Verzeichnis enthält, das die AnotherClass-Klasse enthält. Dann können Sie es wie folgt aufrufen:

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 

kommen in der Regel Klassen in Form von „Bündel“ genannt JAR-Dateien/Bibliotheken.In diesem Fall müssen Sie sicherstellen, dass das Glas die Andere Klasse enthält, auf Ihre classpaht ist:

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 

In den obigen Beispielen sehen Sie, wie eine Klasse (MyClass.java) im Arbeitsverzeichnis zu kompilieren und zu Führen Sie dann die kompilierte Klasse aus (Beachten Sie das "." am Anfang des Klassenpfads, der für das aktuelle Verzeichnis steht). Dieses Verzeichnis muss auch zum Klassenpfad hinzugefügt werden. Andernfalls kann die JVM sie nicht finden.

Wenn Sie Ihre Klasse in einer JAR-Datei haben, wie Sie in der Frage angegeben haben, müssen Sie sicherstellen, dass sich jar zusammen mit dem Rest der benötigten Verzeichnisse im Klassenpfad befindet.

Beispiel:

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

oder allgemeinere (einige Pakethierarchie vorausgesetzt):

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

Um die Classpath-Einstellung zu vermeiden, jedes Mal wenn Sie eine Anwendung ausführen möchten, können Sie eine Umgebungsvariable definieren CLASSPATH genannt.

In Linux, in Eingabeaufforderung:

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

oder ~/.bashrc bearbeiten und diese Zeile irgendwo am Ende hinzufügen; Der Klassenpfad unterliegt jedoch häufigen Änderungen. Daher empfiehlt es sich, den Klassenpfad auf einen Kernsatz von Verzeichnissen zu setzen, den Sie häufig benötigen, und dann den Klassenpfad jedes Mal zu erweitern, wenn Sie nur für diese Sitzung benötigen. Wie folgt:

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

muss ich diese Klassenpfade jedes Mal definieren, wenn ich kompilieren und ausführen möchte? –

+0

Ich habe meine Antwort bearbeitet – Razvan

16

Angenommen, Sie haben mehrere JAR-Dateien a.jar, b.jar und c.jar. Um sie zu Classpath hinzufügen beim Kompilieren Sie

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

laufen tun

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

Schritt 1.

vi ~/.bashrc 

Schritt 2. Anhängen diese Zeile am letzten tun müssen:

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

Schritt 3.

source ~/.bashrc 

Nach diesen Schritten direkt complile und führen Sie Ihre Programme (z. B. javac xyz.java)

Verwandte Themen