# CLASSPATH und Jar



## Pauli01 (13. Aug 2005)

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 (13. Aug 2005)

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


----------



## Bleiglanz (13. Aug 2005)

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 (13. Aug 2005)

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 (13. Aug 2005)

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


----------



## L-ectron-X (14. Aug 2005)

Du kannst in dein jar-Archiv auch die benutzen Bibliotheken POI und JDIC einfügen.
Allerdings muss dann in die Manifestdatei ein weiterer Eintrag

```
Manifest-Version: 1.0
Class-Path: jdic.jar poi-2.5.1-final-20040804.jar
Main-Class: Main
```
Näheres hier: http://www.galileocomputing.de/open...el_25_002.htm#Rxx365java25002040009D31F0231D9
und in den FAQs auf diesen Seiten.

Edit: Nicht getestet.


----------



## Pauli01 (14. Aug 2005)

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 (14. Aug 2005)

was du willst geht nicht

wenn das manifest so aussieht


			
				L-ectron-X hat gesagt.:
			
		

> ```
> 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 (14. Aug 2005)

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.
> 
> ...


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 (14. Aug 2005)

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.


----------



## bygones (14. Aug 2005)

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


```
-Djava.library.path=pfadZuJdic
```


----------



## Pauli01 (14. Aug 2005)

ghört das jetzt in die classpath oder manifest datei ????


----------



## Pauli01 (14. Aug 2005)

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 ????????????????????


----------



## bygones (14. Aug 2005)

Pauli01 hat gesagt.:
			
		

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


nein wieso ? was ist daran bitte pfusch ?


----------



## lin (14. Aug 2005)

> 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 (15. Aug 2005)

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


----------



## Pauli01 (15. Aug 2005)

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.


----------



## Pauli01 (15. Aug 2005)

ach ja die externen bibliotheken befinden sich im gleichen ordner wie das haupt JAR - File


----------



## L-ectron-X (15. Aug 2005)

ich glaube, dass

```
-Djava.library.path=jdic.jar
```
dem Interpreter übergeben werden muss und nicht in die Manifest-Datei gehört.


----------



## Pauli01 (15. Aug 2005)

also wo schreib i das dann rein???


----------



## L-ectron-X (15. Aug 2005)

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 (15. Aug 2005)

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 (15. Aug 2005)

Ich kanns ja mal versuchen:

```
@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 (15. Aug 2005)

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

aber wie gesagt DANKE


----------



## Pauli01 (16. Aug 2005)

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


----------



## L-ectron-X (16. Aug 2005)

Na du musst natürlich auf dem anderen PC auch die Bibliotheken im Programmverzeichnis haben.


----------



## Toasterwilli (16. Aug 2005)

L-ectron-X hat gesagt.:
			
		

> Java ist auch eine Insel hat gesagt.:
> 
> 
> 
> ...



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 (16. Aug 2005)

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

IMHO geht das eben nicht ohne Tricks mit eigenen Classloadern


----------



## Pauli01 (16. Aug 2005)

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!


----------



## Pauli01 (16. Aug 2005)

aber es geht nicht!
es kommt immer dieser genannte fehler das jdic nicht im java library path ist


----------



## L-ectron-X (16. Aug 2005)

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


----------



## Pauli01 (16. Aug 2005)

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 (17. Aug 2005)

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 (21. Aug 2005)

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 (22. Aug 2005)

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 (24. Aug 2005)

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 (24. Aug 2005)

Du schreibst eine build.xml ungefähr so:


```
<?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 (25. Aug 2005)

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:


```
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 (25. Aug 2005)

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?


----------



## Roar (25. Aug 2005)

jungs, schaut in die FAQ, da ist das ganz einfach erklärt:
http://www.java-forum.org/dev2/jfaq.php?action=show&id=71
ansonsten: http://steagleeye.dnsalias.net


----------



## Toasterwilli (25. Aug 2005)

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...


----------

