# [JOGL] bibliothek aus jar laden



## darkeye2 (14. Mrz 2014)

Hallo,

in Eclipse funktionieren meine JOGL project ohne Probleme. Doch nun möchte ich diese auch exportieren können. Da die meisten User es bevorzugen, eine datei zu laden, und auch nur diese doppelklicken zu müssen, damit das prog startet, habe ich folgenden Aufbau:

```
main.jar
 |_ package1
 | |_ a (folder)
 | |_ b (folder)
 ...
 |_ resources
    |_ images
    |_ textures
    |_ ....
    |_ libs
       |_ jogl_joal_jocl
          |_ {jede menge jars, die eben nötig sind, dabei auch die jars mit den natives}
```

Die gangen JOGL und JOAL ... files habe ich hier her:
http://jogamp.org/deployment/jogamp-current/archive/jogamp-all-platforms.7z

In eclipse funktioniert das ganze auch (wenn die natives so in den jars stecken).

Beim starten meines programs wird zunächst ein temporärer Ordner erstellt, der zum classpath und zum libpath hinzugefügt wird. Danach kopiere ich in diesen ordner alle jars aus dem ordner jogl_joal_jocl.

Soweit sogut, nun funktioniert es aber leider nicht, und ich stehe offenbar auf dem Schlauch, weil ich den grund dafür nicht sehe.

Kriege folgende Fehlermeldung (die jogl sachen können nicht gefunden werden):

```
Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: javax/med
ia/opengl/GLEventListener
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(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.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.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(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.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 ls.snake.core.Starter$1.run(Starter.java:28)
        at java.awt.event.InvocationEvent.dispatch(Unknown Source)
        at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
        at java.awt.EventQueue.access$200(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Sour
ce)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: javax.media.opengl.GLEventListener
        at java.net.URLClassLoader$1.run(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)
        ... 39 more
```


Würde mich über Tipps und Hilfe sehr freuen.


----------



## Highchiller (17. Mrz 2014)

Ich kann nicht so ganz nachvollziehen was du da gemacht hast. Aber in der Regel mach ich es wie folgt.

In Eclipse Rechts-Klick auf dein Projekt -> Export... -> Runnable JAR file.
Dann auf next klicken.

Dann wählst du aus wohin die jar-exportiert werden soll und vor allem wählst du unter "Library Handling:" einfach "Package required libraries into generated JAR". Das packt alle eingebundenen Libs (also auch deine jogl, joal, jocl dinger in ein und die selbe jar.

Fertig. Jetzt musst du noch garantieren dass diese JAR-Datei auch deine Bilder, Texturen, halt deinen resources-Ordner findet.
Also packst du den einfach neben deine Jar. Am besten zu machst ein Ordner:
MeinProjekt

Da liegt dann deine Jar drin und der Resources ordner. Dieser sollte der selbe sein wie in deinem eclipse projekt, nur das du dir die libs sparen kannst. Die sind ja schon in der JAR enthalten.

Hoffe das wolltest du auch


----------



## darkeye2 (17. Mrz 2014)

hmm, vllt fürs bessere Verständniss:

Mein Ziel:
1 Jar file, mit allem drin (alle resourcen, alle libs, alle anderen sachen)


Mein Problem:
einige libs sowie eben jogl, bringen native files für jedes os mit. Native dateien können nicht aus dem jar heraus aufgerufen werden.

Mein Lösungsansatz:
Beim starten des jars wird erstmal alles, was an resourcen da ist, was nicht aus dem jar heraus ausgeführt werden kann, in einen temporären ordner gepackt.
Der ordner wird dabei zum classpath und zum libpath hinzugefügt


Was passiert:
Mit anderen libs funktioniert das gut (z.b. javahidapi) doch jogl macht da probleme, die natives sind in jars verpackt, in eclipse funktioniert das sehr gut, aber nach meiner methode will das nicht gehen. Und ich finde das Problem einfach nicht.


----------



## darkeye2 (19. Mrz 2014)

Hat keiner eine Idee, was da nicht stimmt? Oder einen anderen lösungsvorschlag?


----------

