Ich hatte in den letzen Tagen das Vergnügen für einen Leser meines Buches eine Fehleranalyse durchführen zu können. Vergnügen deswegen, weil wir schlussendlich das Problem lösen konnten und weil es eine gute Sache ist die Leser des Buches, die die Beispiele ausprobieren auch aktiv zu unterstützen.
Zum Problem: bei der Ausführung des nachfolgenden JDAPI Beispiels aus dem Buch, das den Namen eines Forms-Moduls ausgibt
package mypackage1;
import oracle.forms.jdapi.*;
public class Test
{
public static void main(String[] args)
{
try{
JdapiModule.openModule("C:\\software.fmb");
verarbeitung();
}
finally {
Jdapi.shutdown();
}
}
private static void verarbeitung()
{
JdapiIterator moduls=Jdapi.getModules();
while (moduls.hasNext())
{
JdapiModule modul = (JdapiModule)moduls.next();
System.out.println("Module name: " + modul.getName());
}
}
}
trat folgender Fehler auf:
oracle.forms.jdapi.JdapiStatusException: _jni_initialize: Failed to create new forms context
at oracle.forms.jdapi.BaseAPI._jni_initialize(Native Method)
at oracle.forms.jdapi.Jdapi.initialize(Unknown Source)
at oracle.forms.jdapi.Jdapi.getContextPointer(Unknown Source)
at oracle.forms.jdapi.FormModule.open(Unknown Source)
at oracle.forms.jdapi.JdapiModule.openModule(Unknown Source)
at oracle.forms.jdapi.JdapiModule.openModule(Unknown Source)
at Test.main(Test.java:21)
Ich habe das Beispiel auf meinem Rechner ausprobiert und es lieferte sofort das gewünschte Resultat. Ein Fehler im Java-Programm lag also nicht vor, auch die mitgelieferte Forms-Datei war in Ordnung. Ebenso die verwendete Version von JDAPI und JDeveloper. Der Fehler konnte also nur in der Java-Umgebung liegen. Die Überprüfung der Umgebungsvariablen brachte mich darauf, daß mehrere Oracle- und Java-Installation auf dem Rechner des Lesers vorhanden waren, die sich vermutlich störten bzw. überlagerten.
Nachdem der Leser in einem Command Window die Umgebung auf die notwendigen Einträge reduziert hatte, funktionierte das Java-Programm einwandfrei. Nach weiteren Analysen stellte sich heraus, daß die PATH Variable Einträge einer weiteren Oracle Installation (Business Intelligence Suite) enthielt. Dadurch wurden die JDAPI-Klassen mit einer falschen Java Version aufgerufen, was schlussendlich zu dem gezeigten Fehler führte. Die Ausführung ist nur dann erfolgreich, wenn die Einträge der Developer Suite vor denen der Business Intelligence Suite sind.
Mehrere Oracle Installationen auf einem Rechner mit Windows XP sind immer wieder ein Problem, weil es nur eine globale PATH Variable gibt. Ohne manuelle Eingriffe würde das nicht funktionieren. Meine Tipps für solche Situationen:
-
Nach Möglichkeit CLASSPATH-Einträge vermeiden.
-
Im PATH nur Developer Suite vor Datenbank, keine Einträge für Oracle Application Server.
-
Zum Arbeiten Command-Line-Fenster verwenden und Umgebungsvariablen setzen.
Beispiel: Desktop Verknüpfung für Developer Suite
%SystemRoot%\system32\cmd.exe /K "D:\Oracle\Local\bin\envDevSuite.bat"
Der Parameter /K bewirkt, daß die angebene Datei (envDevSuite.bat) ausgeführt wird. Damit können bestimmte Umgebungsvariablen gesetzt werden:
@echo off
echo Environment Settings for Developer Suite 10.1.2.0.2 ...
set ORACLE_HOME=D:\Oracle\Product\DS10g
set ORACLE_SID=pepdev
set PATH=D:\Oracle\Product\DS10g\jdk\jre\bin\classic;D:\Oracle\Product\DS10g\jdk\jre\bin;
D:\Oracle\Product\DS10g\jdk\jre\bin\client;D:\Oracle\Product\DS10g\jlib;D:\Oracle\Product\DS10g\bin;
D:\Oracle\Product\DS10g\jre\1.4.2\bin\client;D:\Oracle\Product\DS10g\jre\1.4.2\bin;D:\Oracle\Product\DB10g\bin;...
echo Environmet set, now start work!
echo on
In diesem Sinne: Start work with JDAPI