Webstart Java Web Start und native Bibliotheken

Grizzly

Top Contributor
Ich bin gerade dabei, die Bibliothek JMuPdf mir anzuschauen, da wir sie im Unternehmen für das Rendering von PDF Dateien in unserer Anwendung einsetzen wollen. Bisher hatten wir hier die PDF Renderer Bibliothek im Einsatz. Diese wird aber leider nicht mehr weiterentwickelt und kann auch schon einige PDF Dateien nicht mehr anzeigen, die bei uns unterwegs sind. Da werden irgendwelche Features nicht unterstützt und in der Konsole sind man auch die entsprechenden Meldungen durchrutschen.

Da wir unsere Anwendung mit Java Web Start verteilen, wollte ich erst einmal testen, ob das mit der Bibliothek auch funktioniert. Netterweise ist im JAR File auch gleich ein fertiger Viewer enthalten. Also habe ich das JAR File signiert und samt den beiden DLLs jmupdf32.dll und jmupdf64.dll auf unseren internen Webserver kopiert. Dann noch kurz ein JNLP File gebastelt:
Code:
<?xml version="1.0" encoding="windows-1252"?>
<jnlp spec="1.0+" codebase="http://<Serveradresse>/pdf" href="JMuPdf.jnlp">
     <information>
          <title>JMuPdf</title>
          <vendor>Pedro Rivera</vendor>
          <homepage href="/index.html" />
          <description>Test für die PDF Bibliothek</description>
          <description kind="short">JMuPdf Viewer</description>
          <shortcut online="false">
               <desktop />
               <menu submenu="JMuPdf" />
          </shortcut>
     </information>
     <security>
          <all-permissions />
     </security>
     <resources>
          <j2se version="1.6.0+" java-vm-args="-Xmx1024M" />
          <jar href="JMuPdf.jar" />
     </resources>     
     <resources os="Windows">
          <nativelib href="jmupdf32.dll" />
          <nativelib href="jmupdf64.dll" />
     </resources>
     <application-desc main-class="com.jmupdf.swing.Main" />
</jnlp>
Bei <Serveradresse> würde natürlich die IP Adresse unseres Servers stehen. 😉

Wenn ich jedoch die Adresse der JNLP Datei in den Browser eingebe und Java Web Start loslegt, bekomme ich jedes Mal eine Fehlermeldung:

Ausnahme:
Code:
com.sun.deploy.net.FailedDownloadException: Ressource konnte nicht geladen werden: http://10.101.100.170/apps/pdf/jmupdf32.dll
	at com.sun.deploy.net.DownloadEngine.actionDownload(Unknown Source)
	at com.sun.deploy.net.DownloadEngine.getCacheEntry(Unknown Source)
	at com.sun.deploy.net.DownloadEngine.getCacheEntry(Unknown Source)
	at com.sun.deploy.net.DownloadEngine.getResourceCacheEntry(Unknown Source)
	at com.sun.deploy.net.DownloadEngine.getResourceCacheEntry(Unknown Source)
	at com.sun.deploy.net.DownloadEngine.getResource(Unknown Source)
	at com.sun.javaws.LaunchDownload$DownloadTask.call(Unknown Source)
	at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
	at java.util.concurrent.FutureTask.run(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)

Gekapselte Ausnahme:
Code:
java.io.IOException: Invalid jar file
	at com.sun.deploy.net.HttpDownloadHelper.download(Unknown Source)
	at com.sun.deploy.cache.Cache.downloadResourceToTempFile(Unknown Source)
	at com.sun.deploy.cache.Cache.downloadResourceToCache(Unknown Source)
	at com.sun.deploy.net.DownloadEngine.actionDownload(Unknown Source)
	at com.sun.deploy.net.DownloadEngine.getCacheEntry(Unknown Source)
	at com.sun.deploy.net.DownloadEngine.getCacheEntry(Unknown Source)
	at com.sun.deploy.net.DownloadEngine.getResourceCacheEntry(Unknown Source)
	at com.sun.deploy.net.DownloadEngine.getResourceCacheEntry(Unknown Source)
	at com.sun.deploy.net.DownloadEngine.getResource(Unknown Source)
	at com.sun.javaws.LaunchDownload$DownloadTask.call(Unknown Source)
	at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
	at java.util.concurrent.FutureTask.run(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)

Das Interessante daran: Sobald ich die folgenden Zeilen entfernen, läuft Java Web Start ohne Probleme durch und installiert die Anwendung. :cry:
Code:
     <resources os="Windows">
          <nativelib href="jmupdf32.dll" />
          <nativelib href="jmupdf64.dll" />
     </resources>
Hat jemand von Euch dafür eine Erklärung? 😕 Das würde mir sehr helfen.
 
Zuletzt bearbeitet:
Hallo,

pack die dlls jeweils in eine jar.

Meines Wissens muß man alles, was man mit WebStart herunterladen will, in Jars packen. (Sonst würde die Sache mit dem Signieren ja nicht funtionieren.)

Hier habe ich einen Ausschnitt aus der JNLP-Spezifikation:
A nativelib element specifies a JAR file that contains native libraries. The JNLP Client must ensure that each file entry in the root directory of the JAR file (i.e., /) can be loaded into the running process by the System.loadLibrary method. It is up to the launched application to actually cause the loading of the library (i.e., by calling System.loadLibrary). Each entry must contain a platform-dependent shared library with the correct naming convention, e.g., *.dll on Windows, or lib*.so on Solaris.

MfG
hansmueller
 
Und genau so ist es:
Habe die zwei DLL Dateien in ein Verzeichnis kopiert, ein MANIFEST Unterverzeichnis erstellt und dort eine jungfräuliche MANIFEST.MF gebastelt:
Code:
Manifest-Version: 1.0
Das Ganze dann signiert und auf den Server hoch geladen. Danach den entsprechenden Abschnitt in der JNLP Datei angepasst:
Code:
     <resources os="Windows">
          <nativelib href="jmupdf.dll.jar" />
     </resources>
Und siehe an: Es funktioniert. Das JWS lädt die Anwendung herunter und der Viewer startet. Und er rendert diesmal sogar. 😉

Wunderbar! Danke für die Hilfe. 🙂
 

Zurück
Oben