[Kommandozeile] JAR-Files in CLASS_PATH einbinden

Thomas D

Erfahrenes Mitglied
Hallo!

Ich habe ein kleines Java-Programm in Eclipse geschrieben, das ich nun über die Linux-Kommandozeile durchführen möchte. Nur irgendwie kriege ich es mit dem folgenden Shell-Script nicht hin:

Code:
java -classpath /home/domenig/Daten/FH/2008/DIM/Semesterprojekt/Implementation/libraries/* dim/SimilarPicsCatcher

Die benötigten JAR-Files befinden sich im angegebenen libraries-Folder, das Java-Class-File mit der Main-Methode unter dim/SimilarPicsCatcher (zunächst mit relativen Pfaden, später umstellen auf absolute).

Ich bekomme folgenden Fehler, dass die MySQL-JDBC-Driver-Class nicht gefunden wird, was ja IMO am CLASS_PATH liegen müsste. Nur habe ich leider keine Ahnung wieso:

Caused by: java.lang.ClassNotFoundException: .home.domenig.Daten.FH.2008.DIM.Semesterprojekt.Implementation.libraries.mysql-connector-java-5.1.6-bin.jar
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)

Den Pfad zu den libraries habe ich kopiert und wenn ich das Programm in Eclipse ausführen, dann passt auch alles. Nur möchte ich das ganze auch über die Kommandozeile ausführen können, habe dies allerdings bereits derart lange nicht mehr gemacht, dass ich an einer einfachen Sache wie dem Einbinden eines JAR-Files scheitere. Wäre super, wenn mir hier jemand behilflich sein könnte :)! ...
 
Hmm sieht mir ein wenig Komisch aus.

Also ich würde einen Ordner machen für das Projekt. In dem Ordner liegt dann folgendes:
deinJar.jar
lib
- otherJar.jar
- .....jar

Also dein eigenes Jar im Hauptverzeichnis und weitere benötigte Jars in Unterverzeichnissen.

Dann in das Hauptverzeichnis wechseln:
java -jar deinJar.jar;lib/* deinPackage.DeineMainClass

Welche Java-Version verwendest du eigentlich? Die Sun Implementierung unterstützt die Wildcards im Classpath erst ab 1.6. Ansonsten mußt du alles Jars einzeln angeben.

Weil im Moment gibt der da ja ziemlichen Unsinn aus.
 
Hallo!

Ich würde gerne das Java-Programm gerne von überall ausführen können - also dass kein eigener Wechsel ins Directory notwendig ist. Worin muss ich dieses unter Unix kopieren - wie finde ich heraus, wo der CLASS_PATH gesetzt ist?

Derzeit verwende ich als JRE Java6 von Sun. Wie kriege ich das hin, dass dies von überall klappt (inkl. den Dependency-JARs)? ...
 
Mach es doch erstmal so wie ich es beschrieben habe und schau ob es dann funktioniert.

Notfalls ein kleines Prog schreiben welches dir den Classpath direkt auf die Jars zusammenbaut wenn es mit der Wildcard nicht geht.
 
Ich habe jetzt folgende Ordnerstruktur angelegt:

Code:
-Deployment
     -lib
          -ij.jar
          -mysql-connector-java-5.1.6-bin.jar
     -picCatcher.jar

Danach bin ich in den Deployment-Folder gewechselt und habe folgendes aufgerufen:

Code:
java -jar picCatcher.jar;lib/ij.jar;lib/mysql-connector-java-5.1.6-bin.jar dim.PicCatchStart

Nachdem ich die Schreibberechtigungen für die JARs richtig gesetzt habe, öffnete sich nun plötzlich ImageJ :suspekt: (eines der beiden JARs - ij.jar), obwohl ja eigentlich meine Implementierung geladen werden sollte. Weiters wird folgendes in der Konsole angezeigt:

Failed to load Main-Class manifest attribute from
picCatcher.jar
Failed to load Main-Class manifest attribute from
/home/domenig/Daten/FH/2008/DIM/Semesterprojekt/Deployment/lib/mysql-connector-java-5.1.6-bin.jar

Oder gibt es eine Möglichkeit, den Aufruf, den Eclipse durchführt, irgendwie nachzubilden - gibt es in Eclipse eventuell eine Möglichkeit, den einfach irgendwie zu "kopieren"?
 
picCatcher.jar
Manifest-Version: 1.0
Main-Class: dim.PicCatchStart

mysql-connector-java-5.1.6-bin.jar
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.6.5
Created-By: 1.4.2-b28 (Sun Microsystems Inc.)
Built-By: mysqldev

Name: common
Specification-Title: JDBC
Specification-Version: 4.0
Specification-Vendor: Sun Microsystems Inc.
Implementation-Title: MySQL Connector/J
Implementation-Version: 5.1.6
Implementation-Vendor-Id: com.mysql
Implementation-Vendor: MySQL AB

ij.jar
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.6.5
Created-By: 1.4.2-70 ("Apple Computer, Inc.")
Main-Class: ij.ImageJ

Warum kann das MySQL-Manifest icht gelesen werden und wieso wird ij.ImageJ als Main-Class gestartet und nicht dim.picCatchStart :confused:
 
Ich habe gerade nicht so viel Zeit. Ich finde das zwar furchtbar unschön aber sonst schau mal obs dus mit FatJar hinbekommst.
 
Ja, mit FatJAR hat es geklappt - vielen Dank ;-)!

Jetzt fehlt nur noch, dass ich die JAR-Datei von überall in Kubuntu aufrufen kann. Doch das werde ich am besten selbst mit einem Shell-Script lösen :) ...
 
Zurück