Best Practice Jar-file mit zwei Klassen und externer Bibliothek über Konsole erzeugen

eclipseworker

Bekanntes Mitglied
Ich muss ein ausführbares JAR-File bestehend aus
TryMain.java
Show.java
und mysql-connector-java-8.0.11.jar
per Skript erzeugen.
Mein Versuch
Code:
jar cf j.jar lib/mysql-connector-java-8.0.11.jar ./Show.java ./TryMain.java
Endete mit einem
Code:
kein Hauptmanifestattribut, in j.jar
wie korrigiere ich das? (Der Script-befehl sollte betriebsystemunabbhängig funktionieren (zumindest Ubuntu und Windows)).
 
Da fehlt die Main-Class. Dafür solltest du eine manifest.txt Datei erzuegen, die nur diese Zeile enthält:
Main-Class: Der Name der Klasse die die main Funktion enthält.
Und danach:
Code:
jar cvmf manifest.txt j.jar lib/mysql-connector-java-8.0.11.jar ./Show.java ./TryMain.java
Das korrigiert aber nur den kein Hauptmanifestattribut Fehler, d.h. die so kompilierte JAR-Datei funktioniert möglicherweise nicht richtig.
 
Da fehlt die Main-Class. Dafür solltest du eine manifest.txt Datei erzuegen, die nur diese Zeile enthält:
Main-Class: Der Name der Klasse die die main Funktion enthält.
Und danach:
Code:
jar cvmf manifest.txt j.jar lib/mysql-connector-java-8.0.11.jar ./Show.java ./TryMain.java
Das korrigiert aber nur den kein Hauptmanifestattribut Fehler, d.h. die so kompilierte JAR-Datei funktioniert möglicherweise nicht richtig.
Vielleicht habe ich irgendwie falsch gemacht, bei mir hat es jedenfalls null korrigiert.
Das steht im manifest.txt:
Main: TryMain

Und
Main: TryMain.class hat auch nichts gebracht.
 
Zwei Sachen müssen noch korrigiert werden. 1. Du musst die *.java Dateien erst in *.class Dateien kompillieren. Dann ist noch wichtig, dass die Manifest.txt mit einer Leerzeile aufhört. Wenn das alles gegeben ist, kannst du die jar mit dem Befehl von @Anatolianer bauen. Du musst nur dort statt .java jeweils .class verwenden.
Also so:

Code:
jar cvmf manifest.txt j.jar lib/mysql-connector-java-8.0.11.jar ./Show.class ./TryMain.class

manifest.txt:
Code:
Main-Class: TryMain
 
Zwei Sachen müssen noch korrigiert werden. 1. Du musst die *.java Dateien erst in *.class Dateien kompillieren. Dann ist noch wichtig, dass die Manifest.txt mit einer Leerzeile aufhört. Wenn das alles gegeben ist, kannst du die jar mit dem Befehl von @Anatolianer bauen. Du musst nur dort statt .java jeweils .class verwenden.
Also so:

Code:
jar cvmf manifest.txt j.jar lib/mysql-connector-java-8.0.11.jar ./Show.class ./TryMain.class

manifest.txt:
Code:
Main-Class: TryMain
Es will und will einfach nicht funktionieren.
Muss ich die beiden class files irgendwie spezieller erzeugen? ich habe einfach
Code:
javac *.java
genommen.
 
Das kommt bei mir wenn die manifest.txt Datei nicht mit einer Leerzeile abschließt. Hört sich unwichtig an, ist es aber nicht.
 
Das kommt bei mir wenn die manifest.txt Datei nicht mit einer Leerzeile abschließt. Hört sich unwichtig an, ist es aber nicht.
Ich habe die Leerzeile hinzugefügt hat das Problem NICHT gelöst.
Ich habe auch das jar-File mit 7zip untersucht, unter j.jar\META-INF\MANIFEST.MF steht folgendes:
Code:
Manifest-Version: 1.0
Main: TryMain
Created-By: 1.8.0_92 (Oracle Corporation)
Trotzdem
Code:
java -jar j.jar
java -jar j.jar TryMain
javaw -jar j.jar
und
Code:
javaw -jar j.jar TryMain
scheitern alle.
 
EDIT: @mrBrown Das wird es wohl sein 🙂

Das ist schon sehr seltsam. Denn wenn ich die MANIFEST.MF untersuche sieht sie so aus:

Code:
Manifest-Version: 1.0
Created-By: 1.8.0_144 (Oracle Corporation)
Main-Class: TryMain

Zum Kompillieren der Klasse:
Code:
javac TryMain.java

Dann zum erzeugen der Jar:
Code:
jar cvmf manifest.txt j.jar ./TryMain.class

Und der Befehl zum Ausführen dann z.B.:
Code:
java -jar j.jar

Nebenbei, um auszuschließen dass der Java Code an sich zu den Fehlern führt, habe ich einfach nur ein simples System.out in die main Methode geschrieben.
TryMain.java
Code:
public class TryMain
{
  public static void main(String[] args)
  {
    System.out.println("Runner");
  }
}
 

Zurück
Oben