JAR Dateien in JAR Datei einbetten

Status
Nicht offen für weitere Antworten.

nogi

Mitglied
Servus,

ich habe mir mit Eclipse zum Anlegen von Tabellen ein kleines Programm geschrieben. Dazu verwende ich je nach Datenbank unterschiedliche JDBC Treiber und JDOM.
Das ganze läuft auch wunderbar. Wenn ich allerdings eine ausführbare Datei erstelle müssen die angesprochenen JAR Dateien im gleichen Verzeichnis sein wie das exportierte Projekt. Die JAR Dateien habe ich selbstverständlich zum Export hinzugefügt und kontrolliert ob sich diese wirklich im neuen JAR Archiv befinden. Zusätzlich habe ich noch eine MANIFEST Datei angelegt:

Manifest-Version: 1.0
Main-Class: XYZ
Class-Path: db2.zip mysql.jar jdom.jar

Aber leider werden die entsprechenden Klasse bzw. der JDBC Treiber nicht gefunden.

1. Ist es überhaupt möglich JAR Dateien in eine andere JAR Datei einzubetten?
2. Liegt es am Classpath in der MANIFEST Datei?

Vielen Dank im voraus


Gruß

NoGi
 
B

bygones

Gast
es hält sich das gerücht, dass man jars in jars machen kann... ich entpacke immer die fremd jars und füge die Klassen in mein jar ein - oder ich lasse die fremd jars einfach ganz raus aus meinem jar und regel das über den Classpath
 

Bleiglanz

Gesperrter Benutzer
in der j2ee Welt ist das durchaus üblich (ear - module), bei Standalone Anwendungen, die mit

java -jar Foo.jar

gestartet werden, ist es wohl eher so, dass sich der Class-Path Eintrag im Manifest auf Pfade AUSSERHALB des Archivs bezieht, jars innerhalb von jars sind definitiv (??) nicht möglich

Der einzige Nutzen des ManifestEintrags ist daher, dass man beim Start mit java -jar Foo.jar keinen Classpath mehr setzen muss
 
B

Beni

Gast
Hm, Roar (?) hat mal geschrieben dass man auf Jars in Jars (in Jars in Jars...) zugreiffen kann, indem man Pfade so schreibt: "c:/dateien/jarEins.jar!data/jarZwei.jar!/blabla.txt"
Ich hab das noch nie ausprobiert, ist nur mein Beitrag an die Gerüchteküche :bae:

[Edit: http://www.tutorials.de/tutorials173991.html ???:L ]
 

Bleiglanz

Gesperrter Benutzer
versteh ich nicht, ich glaube das geht nicht

Frage an alle: Hat es schon mal jemand geschafft, ein jar innerhalb eines jars zu haben und dieses zu Laufzeit in den Classpath hineinzubekommen - wenn ja, welche Rolle spielt der Class-Path Eintrag im Manifest?

P.S.: ich meine jetzt nicht die Lösung mit

a) das jar extrahieren und ins dateisystem schreiben

b) dann mit einem selbstgeschriebenen Classloader zu arbeiten
 

SebiB90

Top Contributor
das DashBoard ist dochvon roar?
wenn ja, fragt ihn.
er hat in einem plugin(Calendar) die jar datei fürs tablelyout in einer andere jar gepackt.
 
B

bygones

Gast
die frage ist inwieweit es sinnvoll ist jedes mal beim programmstart die jars zu laden...

außerdem hat Roar die jars nicht in seinem jar, sondern die liegen außerhalb in einem dir.

ich halte die von mir geposteten beiden Lösungen für die sinnvollsten
 
B

bygones

Gast
wie die jars an sich aufgebaut sind ist eine andere Sache...

ich meinte das Hauptprogramm lädt sich alle jars die im Plugins Ordner sind
 

0xdeadbeef

Top Contributor
Nur mal so am Rande. Es gibt da einen gepatchten Classloader namens "One-Jar" (http://www-106.ibm.com/developerworks/java/library/j-onejar/), der auch im Eclipse-Plugin FatJar verwendet wird. Damit ist es möglich, Jars innerhalb eines Jars zu benutzen.
Allerdings ist mein erster und letzter Versuch in dieser Richtung fehgeschlagen. Das lag allerdings an der kruden Implementierung des Suchpfads in der Comm-API. Derlei Probleme sind allerdings auch bei anderen Library-Jars zu erwarten, egal ob man die Jars entpackt oder per gepatchtem Classloader ausliest.
 

nogi

Mitglied
Da sag ich doch erst einmal vielen Dank für die vielen, schnellen und ausführlichen Antworten.

Ich werde wohl die drei JAR Dateien entpacken und in die neue JAR mit einfügen.

Gruß NoGi
 
S

stev.glasow

Gast
Was spricht denn dagegen die zusätzlichen jars mit den Programordner zu legen und in der Manifest anzugeben?
 

0xdeadbeef

Top Contributor
stevg hat gesagt.:
Was spricht denn dagegen die zusätzlichen jars mit den Programordner zu legen und in der Manifest anzugeben?

Genau das geht eben nicht. Die property "java.class.path" enthält bei aus Jars gestarteten Klassen nur den Name dieses JARs, egals welcher Classpath im Manifest übergeben wurde. Das macht es dem normalen Classloader anscheinend umöglich, Klassen aus Jars nachzuladen. Dazu muß man wie gesagt den Klassenlader durch eine Version ersetzen, die das kann.
 
R

Roar

Gast
1. jo warum sollte man jars nich in jars packen können?
2. das mit jar in jar und dann automatisch in classpath funktioniert aber nicht. die tablelayout.jar is nur dummy...
3. also mit der klasse URL kann man auf jars so zugreifen bla.jar!/eintrag.class
ob bla.jar!/blupp.jar!/eintrag.class funktinoiert weiß ich auch nicht
 
S

stev.glasow

Gast
0xdeadbeef hat gesagt.:
stevg hat gesagt.:
Was spricht denn dagegen die zusätzlichen jars mit den Programordner zu legen und in der Manifest anzugeben?

Genau das geht eben nicht. Die property "java.class.path" enthält bei aus Jars gestarteten Klassen nur den Name dieses JARs, egals welcher Classpath im Manifest übergeben wurde. Das macht es dem normalen Classloader anscheinend umöglich, Klassen aus Jars nachzuladen. Dazu muß man wie gesagt den Klassenlader durch eine Version ersetzen, die das kann.
Verstehen wir uns jetzt miss?
Ich lege mir einfach eine Programmordner an in dem ich dann meine rechner.jar lege und einen unter Ordner lib anlegen, in diesen kommt dann die swt.jar und jdom.jar und hinein (Z.B.) - und in der manifest der rechner.jar brauche ich dann nur noch den classpath-eintrag für beiden jars aus dem lib ordner machen. Und das geht auch.
 

0xdeadbeef

Top Contributor
Nach meinen eigenen Experimenten und Recherchen geht das nicht. Siehe auch der One-Jar-Link, den ich oben bereits anegegeben hatte.
Zitat daraus:
The biggest hurdle I tackled in the process of developing One-JAR was how to load JAR files that are contained inside another JAR file. The Java classloader sun.misc.Launcher$AppClassLoader, which takes over at the start of java -jar, only knows how to do two things:

* Load classes/resources that appear at the root of a JAR file.

* Load classes/resources that are in codebases pointed to by the META-INF/MANIFEST.MF Class-Path attribute.

Moreover, it deliberately ignores any environment variable settings for CLASSPATH or the command-line argument -cp that you supply. And it does not know how to load classes or resources from a JAR file that is contained inside another JAR file.

Hab's noch nicht mit der 1.5er probiert, aber es würde mich sehr überraschen, wenn man da plötzlich Klassen aus Jars innerhalb Jars laden könnte.
 
S

stev.glasow

Gast
Von jars in jars rede ich ja nicht :? es liegt hier eindeutig ein mißverständnis vor. :autsch:
 
S

stev.glasow

Gast
Ja schon, aber ich wollte wissen was ihr gegen die "normale" Variante habt die ist doch gut. Find das besser als wenn alles in einer jar wäre.
 

dotlens

Top Contributor
de vorteil wenn alles in einer jar liegt, liegt doch auf der hand (Wortspiel ;-))
du willst deinem Kumpel ein Programm geben, dann kannst du ihm das Jar schicken und alles ist ok. ansonsten muss er noch einen ordner lib habern mit den bibliotheken.

nebenbei wäre es super wenn jemand einen FAQ Beitrag über Jars machen würde. ich selbst kenne mich da noch zu wenig aus.
 
S

stev.glasow

Gast
Ne, sorry das ist kein Argument. Denn ich kann dem Kumpel auch ein zipfile schicken, die er dann zu entpacken hat.
Aber das muss eh jeder selber wissen, aber besser überhaupt eine jar als keine.
 

Karl

Aktives Mitglied
Hallo,

da ich jar in jar schon mal ausprobiert habe, hier meine Erfahrungen:

1. Der Standard-ClassLoader und auch der URL-ClassLoader unterstützen das nicht
2. Die Klasse URL ist nicht darauf ausgerichtet: Eine URL kann zwar wie Benji geschrieben
hat auf eine Ressource in einem Jar innerhalb eines anderen Jars verweisen (Trennung durch Ausrufezeichen).
Eine solche URL kann aber nicht aufgelöst werden (openStream() ist nicht entsprechend implementiert).
3. Jar in Jar ist in Java nicht angebracht, man tut es einfach nicht. Der Grund ist vermutlich die Performance und aus Komprimierungssicht die Sinnlosigkeit.
4. Muss man das unbedingt doch tun, ist die Lösung recht einfach. Man implementiert einen ClassLoader, der
einen Jar-Eintrag richtig wieder als zip oder jar interpretiert, lässt sich den Stream des Eintrags geben, stülpt einen Zip-/Jar-InputStream drüber und schon läufts. Das geht auch n-fach rekursiv.
5. Hinweis: Immer wenn's ums Signieren geht, ist das ganze sehr fehlerträchtig. Die VM ist nämlich zu schlau, die merkt sofort, wenn eine Klasse "wild geladen" wurde. Aufrufe aus Methoden einer solchen Klasse unterliegen großen Einschränkungen, was zur Laufzeit zu Permission-Problemen führt. Innere Jars müsste man folglich auch signieren.

Fazit: Jar's nach der Installation nebeneinander, nicht geschachtelt, ggf. kann man die verpackten Jars auch bei Programmstart in ein temporäres Verzeichnis packen (~ Verbergen der Installation der Anwendung).

Gruß,

Karl
 

thE_29

Top Contributor
Hrhr ;)

schickst ihm halt 1000 class Files und er solls dann per Hand mit java dein.package.mainclass starten ;)


Was willsten über JARs großartig für ein FAQ machen? Ich habs noch nie mit dem java -jar erstellt (immer mit IDEs) und das ich jar Files komplett einbinde mache ich auch net (hat ja keinen sinn...)

ob ich es komplett einbinde oder so wie dbac mache, das ich es extrahiere und dann 1 jar File drauß mache ist ja egal, da brauch ich mich wenigstens um nichts mehr zu kümmern, da es ja immer entpackt in 1em jar File liegt..
 

dotlens

Top Contributor
FAQ Beitrag ist meiner Ansicht nach nötig, denn wenn du mal nach Jar suchst, findest du jenes viele Threads.

ich hatte riesen mühe mein erstes jar file hinzukriegen und ich denke da bin ich nicht der einzige.

sinvolle themen:
- wie erstellt man ein jar file
- was ist ein classpath?
- manifest datei
- jar in jar
- vor- und nachteile von jars

bestimt gibts noch einiges mehr dazu zu schreiben
 

Bleiglanz

Gesperrter Benutzer
@Karl

endlich mal ein klares Wort!

kann man also vermutlich so festhalten:

1. jars in jars funktionieren (out of the box) NICHT

2. der Class-Path Eintrag im Manifest erlaubt es nur, den Classpath beim Aufruf java -jar Meine.jar wegzulassen (und bezieht sich auf Dinge "ausserhalb" von Meine.jar)

3. in J2EE konformen .ear Archiven kann der Class-Path Eintrag trotzdem funktionieren (d.h. jars innerhalb des ears werden gefunden) , je nach Applicationserver
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Thomasneuling Java Jar datei erstellen, von Projekt, dass auch Javafx Dateien, FXML Dateien und CSS Dateien, sowie Bilder enthält? Allgemeine Java-Themen 14
JavaWolf165 Externe .jar-Dateien in .jar-Datei intigrieren Allgemeine Java-Themen 0
A Input/Output Liste der Dateien in einem Ordner in einer Jar Datei erhalten Allgemeine Java-Themen 11
A Index Datei aus HTML-Dateien Allgemeine Java-Themen 7
N zusätzliche Dateien (.txt) in JAR Datei Allgemeine Java-Themen 2
G Zugriff auf Dateien in jar-Datei Allgemeine Java-Themen 13
V Dateien (*.jpg) aus einer Jar Datei lesen Allgemeine Java-Themen 10
M dateien in einer zip datei hinzufügen - Archiv updaten Allgemeine Java-Themen 11
G HSQLDB Datenbank-Dateien aus Jar-Datei lesen Allgemeine Java-Themen 5
G Dateien lesen Allgemeine Java-Themen 3
OnDemand Unterschiedliche jar Dateien zusammen führen Allgemeine Java-Themen 8
A Sicheres Löschen von Dateien Allgemeine Java-Themen 7
O git ignore für Intellji braucht es die .idea Dateien? Allgemeine Java-Themen 8
Master3000 Dateien zwischen verschiedenen Netzwerken senden Allgemeine Java-Themen 17
L Jar Dateien in Classpath laden ab JDK 9+ Allgemeine Java-Themen 11
d.lumpi JDA eclipse dateien versenden Allgemeine Java-Themen 4
O Produziert das Tool "jpackage" (ab JDK 14) .exe Dateien, die auf einer Zielumgebung ohne JRE lauffähig sind ?` Allgemeine Java-Themen 7
O Wie kann ich in Apache POI (Excel Dateien schreiben) Datumszellen in Excel erzeugen Allgemeine Java-Themen 6
T Meine Frage lautet wie ich 2 CSV Dateien miteinander in Java verbinde und Spalten die zueinander gehören durch den gleichen Key zusammen ausgebe? Allgemeine Java-Themen 5
L Dateien richtig auslesen Allgemeine Java-Themen 6
L Eclipse Runnable Jar mit Dateien Allgemeine Java-Themen 8
W Server-Thread schreibt nicht alle Dateien Allgemeine Java-Themen 6
MiMa Logging mit log4j2 in verschiedene Dateien? Allgemeine Java-Themen 22
I Klassen aus Jar-Dateien aus anderem Ordner laden Allgemeine Java-Themen 3
O jar und EXE Dateien, Pfade zur Laufzeit Allgemeine Java-Themen 1
W Dateien werden nicht gelöscht - warum? Allgemeine Java-Themen 12
B Dateien / Bilder von "webapp" Ordner bekommen? Allgemeine Java-Themen 1
P Erste Schritte Dateien löschen Allgemeine Java-Themen 4
H Erste Schritte Ausführbare Dateien lassen sich nicht starten Allgemeine Java-Themen 5
I Java als exe veröffentlichen inkl. kompletter Dateien Allgemeine Java-Themen 4
M Drucken von Dateien Allgemeine Java-Themen 10
J jar Dateien unter Windows 7 mit spezifischer jdk öffnen Allgemeine Java-Themen 2
I Laden von Informationen aus Dateien: Austauschbarkeit: 2 Dateien sinnvoll? Allgemeine Java-Themen 2
N Temporäre Dateien Allgemeine Java-Themen 3
Bluedaishi Druck Probleme mit PDF dateien Allgemeine Java-Themen 4
M Dateien schneller kopieren Allgemeine Java-Themen 1
M Dateien nach kopieren vergleichen Allgemeine Java-Themen 9
Arif Input/Output Dateien im Jar-Programm speichern Allgemeine Java-Themen 12
D Collections.sort funktioniert nicht in exportierten .class Dateien Allgemeine Java-Themen 10
K Große JSON-Dateien schnell und effizient verarbeiten Allgemeine Java-Themen 16
J Programm zum Download von CSV-Dateien Allgemeine Java-Themen 4
V Eclipse .class Dateien Allgemeine Java-Themen 9
B Download von dateien Allgemeine Java-Themen 2
K Nicht alle class-Dateien im JRE? Allgemeine Java-Themen 2
MiMa Log4j in Dateien mit eigenem Namen schreiben Allgemeine Java-Themen 3
D Kopieren von Dateien aus einem Ordner in einen anderen Allgemeine Java-Themen 6
C Dateien in Jar aufrufen Allgemeine Java-Themen 14
X NetBeans Bilder und andere Dateien ins .jar schreiben und wieder aus .jar lesen Allgemeine Java-Themen 6
X Dateien für Benutzer Sperren Allgemeine Java-Themen 4
D Dateien aus den Internet herunterladen Allgemeine Java-Themen 6
L Methoden Dateien älter als 30 Tage? Allgemeine Java-Themen 11
J .exe Dateien werden nicht gestartet obwohl Pfad richtig Allgemeine Java-Themen 6
RalleYTN Classpath Native Dateien(DLL, SO, JNILIB) Allgemeine Java-Themen 2
J Java .jar Dateien zusammenführen Allgemeine Java-Themen 1
L Best Practice Log Dateien analysieren und eventuell passende Daten am Chart darstellen Allgemeine Java-Themen 1
F Platzsparende Alternative zu .txt-Dateien Allgemeine Java-Themen 12
X Dateien von der Jar zum Ordner kopieren. Allgemeine Java-Themen 4
Ananaskirsche Input/Output Dateien im Ordner Allgemeine Java-Themen 8
X Herunterladen von Dateien aus dem Internet Allgemeine Java-Themen 2
V Input/Output Sound Dateien aus Jar laden Allgemeine Java-Themen 18
M Dateien aus einem Verzeichnis auf einem Server auflisten Allgemeine Java-Themen 5
H PDFBox akzeptiert Dateien nicht Allgemeine Java-Themen 1
B Java - einlesen von Dateien und herausschneiden von XML Dokumenten Allgemeine Java-Themen 5
A Input/Output Spätes Schreiben von Dateien der JVM Allgemeine Java-Themen 3
M Zwei unterschiedliche JAR Dateien mit ANT erstellen Allgemeine Java-Themen 8
Thallius Dateien Zippen und wieder heraus lesen? Allgemeine Java-Themen 4
T Dateien zur Laufzeit in Java-Programm packen? Allgemeine Java-Themen 3
Maxim6394 Jar Dateien starten nicht Allgemeine Java-Themen 7
U Eclipse Java Programm beschädigt .tar.gz dateien beim Entpacken Allgemeine Java-Themen 7
GUI-Programmer Mp3 Dateien bearbeiten und speichern Allgemeine Java-Themen 3
S Exklusive Sperre auf Dateien: FileChannel, FileLock Allgemeine Java-Themen 0
Bluedaishi Dateien löschen die älter als das aktuelle Datum sind Allgemeine Java-Themen 9
OnDemand Dateien einlesen und vergleichen Allgemeine Java-Themen 1
T Ordner samt Dateien kopieren Allgemeine Java-Themen 11
R Importieren von Txt-Dateien in AbstractTableModel Allgemeine Java-Themen 0
C Dateien komprimieren und verschlüsseln Allgemeine Java-Themen 3
F Eclipse Eclipse kompiliert nicht mehr die aktuellen Dateien Allgemeine Java-Themen 2
R Java Dateien "verschlüsseln" Allgemeine Java-Themen 2
L Passwortgeschützte Dateien Allgemeine Java-Themen 6
A Datentypen Dateien umbenennen mit Dateiendungen - Dateiendungen ausgeben Allgemeine Java-Themen 2
L Reparieren beschädigter PDF Dateien Allgemeine Java-Themen 3
F Dateien ins Array lagern und Optionen zur Auswahl, Allgemeine Java-Themen 5
J XML Dateien vergleichen Allgemeine Java-Themen 9
B Umbenennen von Dateien Allgemeine Java-Themen 2
B Erste Schritte Plugin erkennen und Class Dateien anzeigen lassen Allgemeine Java-Themen 3
W Best Practice Dateien parsen Allgemeine Java-Themen 3
B Dateien verschwinden aus bin Ordner?! Allgemeine Java-Themen 5
B Dateien prüfen auf Gleichheit Allgemeine Java-Themen 5
M Java Dateien verschieben Allgemeine Java-Themen 2
R Wav-Dateien wiederholt abspielen Allgemeine Java-Themen 2
L Methoden Verarbeitung von Größen Dateien Allgemeine Java-Themen 9
B Alt-Griechisch Zeichen in Dateien Allgemeine Java-Themen 2
M JAR Dateien nur mit Compiler Level 1.6 ausführbar Allgemeine Java-Themen 8
E Zugriff auf Dateien im Filesystem überwachen Allgemeine Java-Themen 5
G .jar Dateien lassen sich nicht mehr öffnen Allgemeine Java-Themen 2
M Datentypen Jar-Dateien öffnen nicht mit Java Allgemeine Java-Themen 4
C Mit Java PDF Dateien bearbeiten. Allgemeine Java-Themen 2
B Input/Output .java-Dateien auslesen Allgemeine Java-Themen 17
B Methoden Alle Methoden und Variablen aus Java-Dateien auslesen. Allgemeine Java-Themen 7
E Vorschläge, effizientes Hashing von Dateien für vergleich Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben