Hallo ich bin neu bei Java und in diesem Forum und mache meine ersten Schritte. Ich bin auch schon vorwärts gekommen, habe nun aber ein Problem, wo ich einfach nicht weiterkomme.
Ich habe ein Projekt in Eclipse gestartet und versuche auf eine MySQL Datenbank zuzugreifen. Aus Eclipse heraus funktioniert das auch einwandfrei und ich kann auch Datensätze auslesen. Wenn ich meine Main Klasse auf der Kommandozeile von Windows starte, funktioniert diese auch, (Also die Java Installation und Konfiguration scheint zu stimmen) allerdings bekomme ich eine Fehlermeldung, die mir sagt “No suitable Driver found for MySQL.“
Ich habe mir den entsprechenden mysql-connector-java-8.0.23.jar runtergeladen, habe diesen als Library in Eclipse eingebunden. Deswegen funktioniert es ja auch, in Eclipse.
Aber woher weiß Java, wenn ich das Programm auf der Kommandozeile in Windows ausführe, woher der Connector kommt?
Es gibt ja den bei Windows eingestellten Classpath. Wenn ich den Connector da rein kopiere, funktioniert es aber auch nicht.
Und auch auf einer Linux Maschine, wo das Programm später mal laufen soll, existiert dasselbe Problem.
Moin.
ich hab mir dafür eine BATCH-Datei geschrieben.
Die muss du halt entsprechend deiner Pfade und Dateinamen anpassen.
Ich hoffe ich habe dein Problem richtig interpretiert.
Es gibt verschiedene Ansätze. Es reicht nicht, ein .jar-File einfach in ein Verzeichnis zu kopieren, das vom Classpath erfasst wird. Das .jar-File selbst muss Teil des Classpaths sein. Das erreichst Du z. B. mit dem Schalter -cp <jarfile1>;<jarfile2>;....
Nehmen wir mal an, Du hast eine Hauptklasse app.Main, die sich in einem JAR /pfad/zu/app.jar befindet, dann kannst Du
Der Speicherort (in meinem Fall) die mysql-connector-java-8.0.23.jar soll im Classpath stehen. Also kann ich doch diese Datei einfach in den /lib Ordner von meiner Jawa Installation kopieren. Funktioniert aber nicht. Oder ich setze einen weiteren Classpath in Windows. Da steht jetzt bei mir:
.;%JAVA_HOME%\lib;%JAVA_HOME%\jre\lib;S:\Software\Raspberry\MyHome\bin
Nein. Der lib-Ordner ist im Classpath, nicht aber die jar. Das jar-File ist keine Klasse, sondern ein Archiv und verhält sich damit eher wie ein Ordner.
Grad mal gegoogelt (https://stackoverflow.com/a/4434385): wenn Du Deine Anwendung unter Eclipse zum Laufen bekommst, dann ruf mal in Eclipse unter File -> Export -> Java -> Runnable JAR File -> "Copy required libraries into subfolder next to the generated JAR" auf.
Dabei sollte Eclipse Dir ein jar-File mit Deiner Anwendung und daneben einen Ordner mit dem JDBC-Treiber erstellen. Danach solltest Du die Datei per Doppelklick ausführen können. Wenn Du die Anwendung woanders hinkopieren willst, musst Du den Ordner mitkopieren.
Also muss im Classpath S:\Software\Raspberry\MyHome\bin\mysql-connector-java-8.0.23.jar stehen?
Ich verstehe die Batch von Missy und den jawa -cp Befehle von mihe7 nicht, denn ich habe eine Klasse (MyHome.class) in einem Package, die ich mit "java myhome.MyHome" aus dem Verzeichnis /bin starte.
Ich habe keine verschiedenen jar wie main.jar
Oder habe ich das grundsätzlich nicht verstanden?
Wenn ich eine Applikation mit mehreren Klassen haben, dann stehen doch diese Klassen alle als Dateinen in einem Verzeichnis und ich starte die entsprechende Klasse mit der Main Methode? Und der Classpath verweist auf die Java Installation bzw. dessen Lib Verzeichnis selbst.
Oder, habe ich da einen grundsätzlichen Denkfehler?
Ich verstehe die Batch von Missy und den jawa -cp Befehle von mihe7 nicht, denn ich habe eine Klasse (MyHome.class) in einem Package, die ich mit "java myhome.MyHome" aus dem Verzeichnis /bin starte.
Ja. Der Classpath gibt die Orte an, an denen die Java Virtual Maschine nach Klassen suchen soll. Zum Beispiel habe ich oben als zweiten Bestandteil des Classpath mit dem Punkt das aktuelle Verzeichnis angegeben. Damit sucht Java die Klasse myhome.MyHome auch unter .\myhome\MyHome.class.
Ein Jar ist übrigens nur ein ZIP mit speziellem Aufbau. Darin solltest Du eine Datei MANIFEST.MF finden. Das ist eine Textdatei, in der dürftest Du dann einen Main-Class-Eintrag und einen Class-Path-Eintrag finden. Das entspricht dann dem, was wir vorhin über die Kommandozeile aufgerufen haben