Freitag, 29. Juni 2007

Herumstolpern in der Welt der UNO-Dokumentation

[Aktualisierung am 2.7.2007]

Moin moin!

Geht es nur mir so, oder ist die Online-Dokumentation rund um OpenOffice.org-Entwicklung schwer zu erfassen. Es scheint ja doch einiges vorhanden zu sein aber die Orientierung fällt schwer. Es sind verschiedene Start-Seiten, inkonsistente Namen, Redundanzen usw.

Aber ich will nicht meckern. OpenOffice und UNO allein sind ja schon so nützlich, wahre Geschenke an die Entwicklerwelt!

Deshalb versuche ich selbst hier mal den Dschungel an Dokumentation einfacher begehbar zu machen. Zumindest für Java-Programmierung mit UNO:

Manuale
Referenzen
Code-Beispiele
Foren
Auf Wiedersehen!

Donnerstag, 28. Juni 2007

Openoffice via Java-Uno anbinden II - Noch mehr ClassLoader-Probleme

Hallo Leute!

Als Fortsetzung zum Eintrag "Openoffice via Java-Uno anbinden" habe ich inzwischen neue schmerzliche Erfahrungen mit UNO sammeln müssen.

Nachdem die Anbindung zwar funktioniert hat, stellte sich heraus, dass die Anbindung in einer Tomcat-Applikation nicht stabil läuft. Häufig tritt folgender Fehler auf:

java.lang.IllegalAccessError: tried to access field com.sun.star.lib.util.WeakMap$Entry.key from class com.sun.star.lib.util.WeakMap

WeakMap.cleanUp:at com.sun.star.lib.util.WeakMap.cleanUp(WeakMap.java
WeakMap.put:at com.sun.star.lib.util.WeakMap.put(WeakMap.java
UnoRuntime.getEnvironment:at com.sun.star.uno.UnoRuntime.getEnvironment(UnoRuntime.java
UnoRuntime.getBridgeByName:at com.sun.star.uno.UnoRuntime.getBridgeByName(UnoRuntime.java
BridgeFactory.createBridge:at com.sun.star.comp.bridgefactory.BridgeFactory.createBridge(BridgeFactory.java
UrlResolver$_UrlResolver.resolve:at com.sun.star.comp.urlresolver.UrlResolver$_UrlResolver.resolve(UrlResolver.java
BootstrapUtils.bootstrap:169

Nach einiger Recherche im Internet fand ich die Lösung hier:

http://www.nabble.com/-udk-dev--IllegalAccessError-in-WeakMap-tf2672247.html#a7451826

Das Problem ist also, daß die UNO-Klassen mit verschiedenen Classloadern geladen werden. Jetzt wurde es mir auch klar: unsere Bootstrap-Utils haben einen Classloader gebaut, um das Problem mit den Native-Libraries zu lösen und ausserdem gibt es die Jarfiles nochmal im lib-Verzeichnis der Webapplikation.

Leider kann man nicht einfach Jarfiles mittels Bootstrap-Utils laden, weil dann die Normale Webapplikation die Klassen nicht kennt.

Im Moment kenne ich nur eine Lösung, man muß den CLASSPATH auf das OpenOffice-Verzeichnis setzen und Tomcat so starten (catalina.sh ändern), daß dieser CLASSPATH benutzt wird (ich arbeite im Moment mit Tomcat 4.1 - evtl. gibt es in Tomcat 5 eine bessere Lösung?).

Tja so sieht es aus. Jedwede dynamische Lösung ist damit vom Tisch. Schaun' wir mal, vielleicht ergibt sich in den nächsten Tagen noch was besseres.

Ciao
larsfrommars

Montag, 25. Juni 2007

Täglich Java

Hallo Leute!

Wer täglich mit Java arbeitet hat beinahe täglich auch mit Problemen und Fragen zu kämpfen. Die Probleme, die mir so über den Weg laufen und die vielleicht auch für Euch interessant sein könnten werde ich hier veröffentlichen, sobald ich eine Lösung habe.

Ich bin auch bereit mal Lösungen für eine Problem zu suchen, was micht nicht betrifft, sondern Ihr mir schickt. Allerdings sollte es mich schon etwas interessieren. Kleinere Frage beantworte ich auch gerne nach meinem besten Wissen.

Ich arbeite zwar täglich mit Java, kann aber sicher nicht täglich hier posten. Dazu fehlt mir die Zeit. Aber bitte: schreiben könnt Ihr mir gerne jederzeit!

Konkret beschäftige ich mit im Moment mit folgenden Themen:
  • Openoffice-Anbindung mit UNO
  • Exchange-Anbindung mit Webdav
  • Clustering (z.B. JavaParty, Terracotta)
  • Ajax-GUI (z.B. jsext)
Grüße
Larsfrommars

Openoffice via Java-Uno anbinden - Classpath-Probleme

Die Problemstellung ist, Openoffice via Bootstrap-Methode anzubinden. Openoffice wird dann durch die UNO-libraries gestartet und UNO läuft in der selben JVM. Es gibt noch weitere Methoden, um Openoffice anzusprechen, wie über IP oder SharedMemory. Diese Möglichkeiten sollen hier nicht besprochen werden.

[Hier sollten evtl. noch ein paar einleitende Informationen oder Beispiele zur Kontaktaufnahme mit UNO/openoffice stehen. Das habe ich noch nicht geschafft zusammenzuschreiben, siehe dazu
http://udk.openoffice.org/]

1. Problem: UNO meldet "office executable not found"

Grund:

UNO sucht nach Office-Programm (soffice oder soffice.exe) via Ressourcenladen im normalen Classloader.

Lösung:

UNO-jars aus dem Verzeichnis laden, wo auch das Office-Programm liegt. (Windows üblicherweise "C:/Programme/OpenOffice.org 2.0/program", Linux üblicherweise "/usr/lib/openoffice/program").

Problem ist, dass in manchen Systemen die Jar-Dateien nicht in diesem Verzeichnis liegen (Beispiel ubuntu 7.04: /usr/share/java/openoffice/).

Außerdem muß man für diese Lösung den Classpath abhängig von der Office-Installation ändern. Natürlich gibt es Möglichkeiten auch zur Laufzeit einen URL-Classloader zu bauen, der auf ein konfigurierbares Office-Verzeichnis zeigt, aber dann tritt eben noch das 2. Problem auf, s.u.

Lösung für beanshell:

Die beanshell hat ihren eigenen Classloader, so daß die o.g. Lösung (dynamischer URL-Classloader) nicht funktioniert. Allerdings kann man mit folgender Zeile:

addClassPath( "/usr/lib/openoffice/program/" )

in der aktuellen Instanz von bsh.Interpreter das gleiche erreichen.

2. Problem: UNO-native libraries können nicht geladen werden, Meldung: java.lang.UnsatisfiedLinkError:
com.sun.star.lib.connections.pipe.PipeConnection.createJNI(Ljava/lang/String;)I

Lösung Linux/Windows:

JVM-Aufrufparameter nutzen:
-Djava.library.path=/usr/lib/openoffice/program/

Alternative Lösung Linux:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/openoffice/program/

Alternative Lösung Windows:

SET PATH=%PATH%;/usr/lib/openoffice/program/

Dynamische Lösung zur Laufzeit:

keine gefunden

Referenzen