2009-08-11 4 views
3

Ich versuche, auf die als Bibliothek gepackten Klassendateien zuzugreifen, aber unglücklicherweise sollten die Jar-Bibliotheken in einer anderen JAR-Datei gepackt sein.Kann ich Klassendateien aufrufen, die sich in einer JAR-Bibliothek in einer anderen JAR-Datei befinden?

Als Beispiel sagen, ich habe a.jar, die einige Klassenbibliotheken enthält. Ich kann die Klassen in der JAR-Datei von meiner externen Java-Anwendung aufrufen (importieren). Jetzt muss ich dieses a.jar in ein anderes Glas legen, sagen b.jar und muss auf die Klassen in a.jar von außerhalb des b.jar zugreifen (importieren).

This is not the thing I want to do :)

+0

Meinst du, dass du ein Glas hast, das andere Gläser enthält? Oder möchten Sie abhängige Gläser in Ihr Glas aufnehmen? Was genau ist das Problem? – djna

+0

Ich habe die Frage aktualisiert :) –

Antwort

6

Sie müssten einen Klassenlader schreiben, die der Lage war, zu behandeln „Gläser in Gläser.“ Das klingt nach einer ziemlich schlechten Idee für mich.

Die JAR-Dateien nicht zusammenführen - nur separat auf der Festplatte speichern. Ich weiß, dass Sie das Management vielleicht davon überzeugen müssen, dass mehr Dateien vorhanden sein müssen, aber es wird wirklich alles einfacher machen. Das Schreiben eines Classloaders ist nicht trivial ...

+0

+1 für den Aufruf "Gläser in Gläsern" eine schlechte Idee. –

1

Vielleicht verstehe ich nicht richtig, aber ich glaube, was Sie wollen, ist Ihr Programm mit der anderen JAR-Datei (auch) auf Ihrem Klassenpfad auszuführen.

Nehmen wir an, Sie haben einen Kern in A.jar und einige Bibliotheken in B.jar. (:, Auf Windows mit ersetzen):

java -cp A.jar:B.jar main.class.Name args 

Wo main.class.Name Ihr Hauptklassennamen und args ist, wo alle Ihre Befehlszeilenargumente geht Sie könnten Ihr Programm wie folgt ausführen.

Class-Path: B.jar 
Main-Class: main.class.Name 

Dann können Sie das Programm wie folgt ausführen:

Sie auch ein Main-Class und Class-Path Attribut in Ihrem manifest.mf so sagen kann

java -jar A.jar args 

Sie die Wahrheit zu sagen, habe ich zu denken, dass es glatt war, meine Anwendung als eine einzelne JAR-Datei zu verteilen, mit allen Abhängigkeiten extrahiert und in einer einzigen riesigen JAR-Datei verpackt. Das Problem ist, dass einige Anwendungen mit ziemlich vielen Abhängigkeiten enden, und jedes Mal, wenn ich eine Änderung an mein Code machte, bedeutete es auch, dass ich den gesamten abhängigen Code verteilen musste, obwohl sich nichts in den Abhängigkeiten geändert hatte. Das bedeutete, riesige JAR-Dateien zu verteilen, auch wenn es nur geringfügige Änderungen geben könnte.

Mit einem Manifest-Attribut Class-Path kann ich Anwendungen verteilen, die genau wie eine einzelne JAR-Datei ausgeführt werden können (Doppelklick auf einige Systeme oder die einfache "java -jar" Beschwörungsformel), aber eine Tonne sparen Zeit und Bandbreite, indem nicht alle doppelten Bibliotheken mit nachfolgenden Softwareversionen übertragen werden.

Es ist auch möglich, alle abhängigen JAR-Dateien in ihr eigenes Verzeichnis zu setzen (nennen wir es lib jetzt) ​​und ändern Sie die Class-Path so dass alle JAR-Pfade aussehen „lib/B.jar“. Dann enden Sie nicht mit Ihrem Hauptprogrammverzeichnis voller kleiner JAR-Dateien.

+0

Das Problem ist, dass das OP eine JAR-Datei * innerhalb * einer anderen JAR-Datei hat. –

+0

Ich nehme an, dass wird klarer durch erneutes Lesen des Titels der Frage, aber definitiv nicht aus dem Fragetext selbst –

+0

Ich aktualisiere die Frage :) –

Verwandte Themen