CLASSPATH und Jar

Status
Nicht offen für weitere Antworten.

Pauli01

Mitglied
Eingangsthread: http://www.java-forum.org/de/viewtopic.php?t=21358

Hey Leute

Jetzt hab ich noch ein letztes Problem.
Ich verwende in meinem Programm 2 externe Bibliotheken jdic und poi.
So weit funktioniert ja alles nur wenn ich das Programm mithilfe des JAR - Files und nicht in Eclipse starten möchte gehen die funktionen die die bibliotheken brauchen nicht da die bibliotheken nicht gefunden werden.
Das liegt sicher an der CLASSPATH Datei aber wie muss die ausschaun ??????

Ich zeig euch hier mal wie die bei mir aussieht:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path=""/>
<classpathentry sourcepath="C:/Programme/Java" kind="lib" path="C:/Programme/Java/poi-2.5.1-final-20040804.jar"/>
<classpathentry kind="lib" path="C:/Programme/Java/jdic/jdic.jar"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/Java"/>
<classpathentry kind="output" path=""/>
</classpath>


Bitte sagt mir was hier falsch ist !!!!!!


lg. Pauli

L-ectron-X hat den Eingangsthread dazugepostet.
 

L-ectron-X

Gesperrter Benutzer
Suchst du bitte auch mal die Manifestdatei aus deinem Jar-File raus und postest mal ihren Inhalt hier?
 

Bleiglanz

Gesperrter Benutzer
also start dein programm halt mit

java -cp C:/Programme/Java/poi-2.5.1-final-20040804.jar;C:/Programme/Java/jdic/jdic.jar;. Mein Programm
 

Pauli01

Mitglied
Das hier ist der gesamte inhalt meiner manifest:

Manifest-Version: 1.0
Main-Class: Main


Was sollte in der Datei stehen?!
Was ist das für Datei?
Was ghört da noch rein?

lg. Pauli
 

Pauli01

Mitglied
Was isti deir unterschied in einer CLAsSPATH datei zwischen diesen beiden einträgen:

classpathentry sourcepath=...........
<classpathentry kind=............

denn eine meiner beiden externen libs steht mid dem 1. und die zweite mit der 2. art in der CLASSPATH Datei.

?????????????????????????????????

HEEEEELLLLLPPPPPPPPP
 

Pauli01

Mitglied
Hy

Dieser Vorschlag hätte sich sehr gut angehorcht.
Jedoch funktioniert auch das nicht.
Ich habe die zwei jar Files in das Haupt - JAR - File eingebunden und die von dir genannte Zeile in die Manifest ergänzt.
Die Namen in der Manifest stimmen aber hab ich überprüft.

Das kanns doch ned sein das des so schwer is, so ein scheiss!


lg. Pauli
 

Bleiglanz

Gesperrter Benutzer
was du willst geht nicht

wenn das manifest so aussieht
L-ectron-X hat gesagt.:
Code:
Manifest-Version: 1.0
Class-Path: jdic.jar poi-2.5.1-final-20040804.jar
Main-Class: Main

dann MUSS das Verzeichnis, in dem DEINE jar liegt so aussehen

MeineAnwendung.jar
jdic.jar
poi-2.5.1-final-20040804.jar

d.h. die andren beiden müssen im gleichen Ordner liegen

(man kann nicht doppelt moppeln und jars die innerhalb von jars sind in den Classpath aufnehmen...)
 

L-ectron-X

Gesperrter Benutzer
Java ist auch eine Insel hat gesagt.:
Das innere Jar-Achiv wird vielleicht auch Klassen oder Ressourcen definieren, doch die sind erst einmal für den Klassenlader nicht zugänglich. Das wäre allerdings sinnvoll, denn es ist durchaus üblich, die gesamte Applikation mit den eigenen Klassen zusammen mit den nötigen Klassen in ein neues Archiv zu packen. Dann muss der Klassenlader allerdings auch die Klassen und Ressource in die inneren Jar-Archiven mitnutzen. Damit das funktioniert, muss in dem großen Jar-Archiv im Manifest eine Eintrag gesetzt sein: Class-Path. Dieser Kopf enthält eine Liste mit URLs, die Ressourcen angeben, die im Klassenpfad mit eingebunden werden.

Beispiel Erlaube dem Klassenlader direkt auf Ressourcen in abc.jar und im Unterverzeichnis von images zuzugreifen.


Class-Path: abc.jar images/
Diese Angabe muss in der Manifest-Datei für das Java-Archiv eingebaut werden. Es darf durchaus mehrere Class-Path Zeilen geben. Auch im inneren Archiv abc.jar kann durchaus wieder ein Class-Path Eintrag enthalten sein, so dass eine beliebige Tiefe möglich ist.
Hm, für mich klang das auf der Seite der Javainsel so...

Es sollte auch funktionieren, die Bibliotheken auszupacken und ins Projekt-Jar mit aufzunehmen, quasi mit zu komprimieren.
Und hast du das mal gelesen? http://www.java-forum.org/de/viewtopic.php?t=13075

Ansonsten muss ich passen.
 

Pauli01

Mitglied
Hy

Ja ich habs jetzt soweit das er das fenster öffnet, also das heißt er findet die bibliotheken.
Doch ich hab mich zu früh gefreut, denn wenn ich die Funktionen der Bibliotheken dann wirklich verwende kommt wieder ein Fehler und zwar folgender:

java.lang.UnsatisfiedLinkError: no jdic in java.library.path

was heißt das jetzt? ??????????????????????????

PS: Irgendwie wird ma des jetzt schon ungeheuer, so zum Programmiern is ja Java echt cool find i aber nur solange du das Programm nur innerhalb der Entwicklungsumgebung ausführst.
 
B

bygones

Gast
Pauli01 hat gesagt.:
java.lang.UnsatisfiedLinkError: no jdic in java.library.path
d.h. du musst jdic auch in den java.library.path aufnehmen, was über die Option -D geht

Code:
-Djava.library.path=pfadZuJdic
 

Pauli01

Mitglied
ich habs in die manifest und jetzt gehts anscheinend!

DANKE!

Endlich - nach 1,5 Tagen rumprobieren!

Ich muss sagen in dieser Hinsicht ist Java ein Pfusch, was sagt ihr dazu ????????????????????
 

lin

Top Contributor
PS: Irgendwie wird ma des jetzt schon ungeheuer, so zum Programmiern is ja Java echt cool find i aber nur solange du das Programm nur innerhalb der Entwicklungsumgebung ausführst.
Ich muss sagen in dieser Hinsicht ist Java ein Pfusch, was sagt ihr dazu ?

gibt sicher wunderschöne Dokumentationen wie man sowas macht, ist zwar nicht ganz ohne Aufwand verbunden die zu lesen, aber mit Pfusch hats net viel zu tun....
 

L-ectron-X

Gesperrter Benutzer
Kannst jetzt noch mal den Inhalt der Manifest-Datei posten, weil das interessiert mich jetzt auch.
Und wo sind nun die Bibliotheken?
 

Pauli01

Mitglied
also hier der inhalt der manifest:

Manifest-Version: 1.0
Class-Path: jdic.jar poi-2.5.1-final-20040804.jar
-Djava.library.path=jdic.jar
Main-Class: Main

aber ganz funktioniert es eh noch immer nicht, denn er findet zwar die biblithek aber wenn ich sie dann wirklich verwenden will gibt es wieder einen fehler.

Darauf hin hab ich die 3. zeile in die manifest auf tipp von deathbyaclown eingefügt, aber das funktioniert noch nicht.
 

L-ectron-X

Gesperrter Benutzer
ich glaube, dass
Code:
-Djava.library.path=jdic.jar
dem Interpreter übergeben werden muss und nicht in die Manifest-Datei gehört.
 

L-ectron-X

Gesperrter Benutzer
Also ich würde sagen in die Kommandozeile (Prompt bzw. Eingabeaufforderung) oder in eine Batchdatei.
Du übergibst dies als Option dem Interpreter, java.exe bzw javaw.exe beim Start deines Programms.
 

Pauli01

Mitglied
kannst du mir sagen wie so eine Batchdatei ausschaut, weil mit Batchdatei hab ich gar nichts auf den hut.

mein JAR FILE heißt Lagerverwaltung.jar

wer echt ein hammer.
 

L-ectron-X

Gesperrter Benutzer
Ich kanns ja mal versuchen:
Code:
@echo off
set path=.;C:\Programme\Java\jre1.5.0_04\bin
java -Djava.library.path=jdic.jar -jar Lagerverwaltung.jar 
pause
Es sollte sich eine Console öffnen, die auch Fehlermeldungen ausgeben kann und so lange geöffnet bleibt, wie das Programm läuft.
Den Pfad zum JRE musst du anpassen. Und du speicherst das in einer Datei mit Endung .bat im Projektverzeichnis, also da, wo auch deine jar-Datei liegt.
 

Pauli01

Mitglied
DANKE probier es dann gleich, muss zuerst noch ein kleines anderees Problem bereinigen!

aber wie gesagt DANKE
 

Pauli01

Mitglied
Hy!

jetzt hab ich das mit der Batchdatei probiert und wie sollte es anders sein, es funktioniert immer noch nicht!
es funktioniert nur auf den PC auf dem ich es geschrieben habe
aber auf jedem anderen PC kommt die Fehlermeldung: java.lang.UnsatisfiedLinkError: no jdic in java.library.path

meine manifest sieht so aus:

Manifest-Version: 1.0
Class-Path: jdic.jar poi-2.5.1-final-20040804.jar
Main-Class: Main

und meine batchdatei so:

@echo off
set path=.;C:\Programme\Java\jre1.5.0_01\bin
java -Djava.library.path=jdic.jar -jar Lagerverwaltung.jar
pause

was ist daran jetzt noch faul ????????????????????????????????????

lg. Pauli
 

Toasterwilli

Aktives Mitglied
L-ectron-X hat gesagt.:
Java ist auch eine Insel hat gesagt.:
Das innere Jar-Achiv wird vielleicht auch Klassen oder Ressourcen definieren, doch die sind erst einmal für den Klassenlader nicht zugänglich. Das wäre allerdings sinnvoll, denn es ist durchaus üblich, die gesamte Applikation mit den eigenen Klassen zusammen mit den nötigen Klassen in ein neues Archiv zu packen. Dann muss der Klassenlader allerdings auch die Klassen und Ressource in die inneren Jar-Archiven mitnutzen. Damit das funktioniert, muss in dem großen Jar-Archiv im Manifest eine Eintrag gesetzt sein: Class-Path. Dieser Kopf enthält eine Liste mit URLs, die Ressourcen angeben, die im Klassenpfad mit eingebunden werden.

Beispiel Erlaube dem Klassenlader direkt auf Ressourcen in abc.jar und im Unterverzeichnis von images zuzugreifen.


Class-Path: abc.jar images/
Diese Angabe muss in der Manifest-Datei für das Java-Archiv eingebaut werden. Es darf durchaus mehrere Class-Path Zeilen geben. Auch im inneren Archiv abc.jar kann durchaus wieder ein Class-Path Eintrag enthalten sein, so dass eine beliebige Tiefe möglich ist.
Hm, für mich klang das auf der Seite der Javainsel so...

Also für mich hört sich das auch so an, dass man die Jars ineinander stecken kann. Ich habs genauso gemacht, wie es in Java-Insel steht, aber das funktioniert nicht. Weiß jemand, warum?
 

Bleiglanz

Gesperrter Benutzer
Das verunsichert mich auch immer wieder, dass man das so oft liest

IMHO geht das eben nicht ohne Tricks mit eigenen Classloadern
 

Pauli01

Mitglied
ja ich kopier eh immer den gesamten programmordner in dem sich das haupt jar file und auch die bibliotheken befinden

also von dem her müsste es gehen!
 

L-ectron-X

Gesperrter Benutzer
Irgendwas muss doch anders sein.
Ich würde es ja gerne mal selbst ausprobieren, dazu brauche ich aber deine Jar-Datei.
 

Pauli01

Mitglied
ja kannst du gerne haben, das wär echt ein hit wenn du das mal probieren könntest.
Ich schick dir die notwendigen files sobald du im ICQ bist!

lg. Pauli
 

Bleiglanz

Gesperrter Benutzer
Pauli01 hat gesagt.:
aber es geht nicht!
es kommt immer dieser genannte fehler das jdic nicht im java library path ist

das ist eine native bibliothek

und die kannst du mit SICHERHEIT NICHT in das jar legen

der java library path ist was ganz anderes als der Classpath

https://jdic.dev.java.net/documentation/index.html#packager

ist wohl ein tool, der eine JDIC Anwendung so einpacken kann, dass diese DLLs und .so automatisch extrahiert werden
 

Ralf Ueberfuhr

Bekanntes Mitglied
Ich hatte das selbe Problem und habe mittlerweile herausgefunden, dass

DAS EINBINDEN VON JARS IN JARS FUNKTIONIERT!!!

Man gibt die Jars als Class-Path an und versiegelt die JAR, indem man einfach noch den Eintrag

Sealed: true

mit angibt.
 

Ralf Ueberfuhr

Bekanntes Mitglied
Ok, es funktioniert doch nicht. Was aber funktioniert, ist das Entpacken der JARs und das Wiederverpacken der Ordner in die Haupt-JAR. Ist ne Notlösung, aber mit nem Ant-Skript ist es nicht so aufwendig.
 

Toasterwilli

Aktives Mitglied
Wie funktioniert denn das mit dem Ant-Skript? Ich hab da nämlich keine großen Erfahrungen damit. Das manuelle entpacken und einpacken hab ich mir auch schon mal überlegt, aber die große Anzahl der Dateien hat mich gleich wieder abgeschreckt...
 

Ralf Ueberfuhr

Bekanntes Mitglied
Du schreibst eine build.xml ungefähr so:

Code:
<?xml version="1.0"?>
<project name="..." default="build" basedir="."> 

    <property name="variablenName" value="Variablenwert"/>

     <target name="clear">
     	<delete dir="Temp-Verzeichnis zum Löschen vor dem Build-Vorgang"/>
     	<delete file="Datei zum Löschen"/>
     </target>
	
     <target name="init" depends="clear">
        <mkdir dir="evtl. Verzeichnis zum Erzeugen (z.B. build)"/>
     </target>

     <target name="build" depends="init">
     	
        
     	<echo>Kompiliere Javacode...</echo>
        <javac srcdir="src" destdir="build">
          <classpath>
   	        <pathelement path="${java.class.path}/"/>
   	        <pathelement path="anderer Klassenpfad"/>
          </classpath>
        </javac>

        
     	<echo>Kopiere weitere Quelldateien...</echo>
     	<unzip dest="build">
     	    <patternset>
     	        <exclude name="META-INF"/>
     	        <exclude name="META-INF/MANIFEST.MF"/>
     	    </patternset>
     	    <fileset dir="lib">
     	        <include name="**/*.jar"/>
     	    </fileset>
     	</unzip>

        
     	<echo>Erzeuge Java-Archiv...</echo>
        <jar destfile="destinationFolder/jarFile.jar" basedir="build">
             <manifest>
                <attribute name="Main-Class" value="die.main.Klasse"/>
                ... andere Attribute des neuen Manifest
             </manifest>
         </jar>
     	
     </target>
</project>

Am wichtigsten für deine Frage: unzip und jar.
Bei manchen JARs (z.B. LookAndFeels) gibt es Probleme, weil das Manifest nicht mitkopiert wird, aber meistens sollte es funktionieren.
Wenn ich was vergessen hab, dann bitte ergänzen, bin auch Neuling.
 

Toasterwilli

Aktives Mitglied
Danke erstmal, das mit dem packen funktioniert soweit. Ich hab ein kleines Programm getestet, das nur eine einfache JAR-Bibliothek verwendet. Das kann ich dann sogar per Doppelklick starten.

Bei meinem großen Projekt aber erscheint folgende Fehlermeldung:

Code:
Exception in thread "main" java.lang.SecurityException: no manifiest se
 signature file entry com/jgoodies/plaf/plastic/PlasticBorders$MenuBord
        at sun.security.util.SignatureFileVerifier.verifySection(Unknow

        at sun.security.util.SignatureFileVerifier.processImpl(Unknown
        at sun.security.util.SignatureFileVerifier.process(Unknown Sour
        at java.util.jar.JarVerifier.processEntry(Unknown Source)
        at java.util.jar.JarVerifier.update(Unknown Source)
        at java.util.jar.JarFile.initializeVerifier(Unknown Source)
        at java.util.jar.JarFile.getInputStream(Unknown Source)
        at sun.misc.URLClassPath$JarLoader$1.getInputStream(Unknown Sou
        at sun.misc.Resource.cachedInputStream(Unknown Source)
        at sun.misc.Resource.getByteBuffer(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)


Ich hab da zwar eine Seite, wo es über signed JARs geht (JAR File Specification), aber ich steig da noch nicht ganz durch, was die da eigentlich wollen.
Kann es sein, dass die ursprünglichen Bibliotheken irgendwie signiert waren, es jetzt aber nicht mehr sind, und deswegen der Interpreter motzt??
 

Toasterwilli

Aktives Mitglied
also ich hab mal im Original-JAR-Archiv nachgeschaut, und da gibts für jede Datei, die in dem Signature-File steht auch einen entsprechenden Eintrag im Manifest.
In dem neuen großen Archiv stehen im Manifest keine Einträge. Kann ich die irgendwie automatisch rüberkopieren?
 

Toasterwilli

Aktives Mitglied
Ja die FAQ kenn ich schon. Zu meinem speziellen Problem steht da aber nix. Ich hab es jetzt anderweitig gelöst, indem ich die LATERESE.SF in META-INF einfach mal gelöscht hab. Ich weiß nicht warum, aber jetzt funktioniert alles so, wie ich es mir vorstelle.

BTW, kann es eigentlich urheberrechtliche Probleme geben, wenn ich so Archive wie JGoodies Look&Feels oder JacORB wie oben beschrieben entpacke und dann in mein Archiv einbaue? Das wäre dann nämlich nochmal ein "minimaler" Haken an der Sache...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
ExceptionOfExpectation Einsatz von CLASSPATH Allgemeine Java-Themen 30
L Jar Dateien in Classpath laden ab JDK 9+ Allgemeine Java-Themen 11
thet1983 Input/Output read properties file from classpath Allgemeine Java-Themen 3
F Classpath als Argument in Funktion übergeben Allgemeine Java-Themen 3
reibi Classpath Classpath Variable beim Tomcat Allgemeine Java-Themen 2
M Ant relative Pfade im Classpath vom Jar-Task Allgemeine Java-Themen 2
H CLASSPATH im Javaprogramm ändern Allgemeine Java-Themen 5
J Beanshell Classpath Reihenfolge Allgemeine Java-Themen 2
M Classpath und Buildpath Allgemeine Java-Themen 5
S .Classpath Datei im Eclipse Projekt Allgemeine Java-Themen 7
B Framework zum durchstöbern des classpath Allgemeine Java-Themen 2
reibi Files über Classpath laden Allgemeine Java-Themen 22
J Class.forName und CLASSPATH -Problem Allgemeine Java-Themen 5
S Eclipse und Glassfish Classpath-Fehler(?) Allgemeine Java-Themen 6
U Java file aus Classpath lesen Allgemeine Java-Themen 1
A AspectJ Compiler nicht im CLASSPATH? Allgemeine Java-Themen 4
A CLASSPATH unter Debian Lenny Allgemeine Java-Themen 4
Fadi Lade Klass(jar), die lib im classpath hat mit URLClassLoader Allgemeine Java-Themen 2
Escorter .jar Datei Classpath mitgeben ohne Dos Fenster Allgemeine Java-Themen 8
D Ordner mit *.properties in classpath ? Allgemeine Java-Themen 5
S Java 5/6 Problem im Classpath Allgemeine Java-Themen 11
P CLASSPATH LINUX Allgemeine Java-Themen 9
N Classpath mit ClassLoader künstlich erweitern Allgemeine Java-Themen 2
E In welcher Datei wird classpath gesetzt? Allgemeine Java-Themen 9
D Classpath setzten bei jogl (jsr-231) Allgemeine Java-Themen 2
S Java greif automatisch auf Classpath zu Allgemeine Java-Themen 2
V komischer ClassPath Allgemeine Java-Themen 6
M [Windows] Aufruf von Java mit Sonderzeichen im Classpath Allgemeine Java-Themen 5
T class file(s) on classpath not found or not accessible Allgemeine Java-Themen 8
A [SOLVED] Classpath und statische Variablen Allgemeine Java-Themen 6
G package und classpath grundsatzfrage Allgemeine Java-Themen 7
F suche im Classpath mit Pattern *.gif Allgemeine Java-Themen 16
P Classpath, Tomcat und Eclipse Allgemeine Java-Themen 4
T Classpath per Java Programm setzen Allgemeine Java-Themen 9
D jdic classpath setzen Allgemeine Java-Themen 2
G Classpath Allgemeine Java-Themen 5
F mit getResourceAsStream () Datei im Classpath suchen Allgemeine Java-Themen 15
G Classpath, Packages und Import Allgemeine Java-Themen 3
G Classpath? Allgemeine Java-Themen 3
S Verständnis Problem - Classpath Allgemeine Java-Themen 5
G Classpath bei JAR Allgemeine Java-Themen 14
M Auf Klassen in jar-File (nicht im CLASSPATH) zugreifen Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben