plJava - java.lang.ClassNotFoundException:

Hallo,

bekomme meine erste eigene Java-Function nicht ans Laufen.

Habe auf meinem PostgreSQL 8.3 Server plJava installiert und auch die mitgelieferten examples erfolgreich ausführen können, d.h.
nach der erforderlichen Installation der benötigten Komponenten und Defintion der Funktion

CREATE FUNCTION getsysprop(VARCHAR)
  RETURNS VARCHAR AS
$body$
  java.lang.System.getProperty
$body$
LANGUAGE java;

bringt der Befehl

SELECT getsysprop('user.home');

das erwartete Ergebnis:

/var/lib/postgresql

Nun zu meiner ersten eigenen Jave-Function. Folgender Java source code

package allDatabasesPk;

import java.sql.*;

public class Functions {
    public static String CURRENT_USERNAME( String vcLogin )
    throws SQLException
{
    String vcUserName = "Hill, Thomas";
    return vcUserName;
}

}

wurde mit

javac Functions.java

übersetzt und die entstandene Functions.class mittel

jar -cf common.jar *.class

in eine JAR common.jar gepackt.

Und das JAR file in die DB geladen:

SELECT sqlj.install_jar('file:///var/lib/tomcat5.5/webapps/postgreSQL/WEB-INF/lib/common.jar', 'common', false);
SELECT sqlj.set_classpath('javatest', 'common');

Mittels pgadmin wurde überprüft, dass die Funktion “CURRENT_USERNAME” im Schema javatest auch existert. Show class_path zeigt, dass javatest auch im Suchpfad ist.

Mit folgendem Befehl wurde dann die Funktion definiert:

CREATE OR REPLACE FUNCTION javatest."CURRENT_USERNAME"(VARCHAR)
  RETURNS VARCHAR AS 'allDatabasesPk.Functions.CURRENT_USERNAME'
LANGUAGE java;

Leider führt

SELECT javatest."CURRENT_USERNAME"('xxx');

aber immer zu dem Ergebnis

ERROR:  java.lang.ClassNotFoundException: allDatabasesPk.Functions

********** Fehler **********

ERROR: java.lang.ClassNotFoundException: allDatabasesPk.Functions
SQL Status:XX000

Habe schon alle möglichen Varianten im Create Function Statement ausprobiert (z.B. RETURNS varchar AS ‘allDatabasePk.Functions.CURRENT_USERNAME()’ oder auch
‘allDatabasePk.Functions.CURRENT_USERNAME(java.lang.String)’ oder auch
javatest weggelassen), was alles leider nicht zum gewünschten Erfolg geführt hat.

Danke für die Hilfe.

Hallo,

habe die Lösung gefunden.

Anstelle von

jar -cf common.jar *.class

im Verzeichnis allDatabasesPk abzusetzen

muss man ein Verzeichnis höher

jar -cf common.jar allDatabasesPk/*.class

zur Erzeugung des JAR Files verwenden.

Ich habe irgendwie noch niemanden gefunden, der plJava ernsthaft einsetzt. Selbst die Firmen, die clientseitig mit Java arbeiten und sich das angeschaut haben, fanden das Handling zu kompliziert.

Aber Danke, dass du die Problemlösung hier auch veröffentlicht hast, vielleicht hilft das jemandem anderes mal weiter.

Die Lösung hat jetzt nicht direkt was mit PL/Java zu tun.

Das sind die ganz “normalen” Regeln bzgl. Package-Struktur und Erzeugung einer jar-Datei

Das Programm hätte auch ausserhalb von PL/Java nicht funktioniert, wenn die jar Datei so gebaut wird.