ロードした JAR ファイルを呼び出す関数を実行すると、Postgres 内で java.lang.ClassNotFoundException: エラーが発生します。PL/JAVA (配布されたサンプルを含む) をデータベースにインストールして構成し、サンプルを正常に実行できます。最初の JAR をロード/インストールしようとはしていませんが、何か問題があります。
私のホストは OS バージョンを制御します: CentOS 6.8. Postgres はバージョン 8.4 です。
提供されたサンプル Parameters.addOne クラスの派生物である、独自の非常に単純な Java クラスをインストールしようとしています。私のコードはすべて /tmp にあります。私が従った手順は次のとおりです。
Doug.java:
package com.msmetric;
import java.math.BigDecimal;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Time;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.TimeZone;
import java.util.logging.Logger;
public class Doug {
public static int addOne(int value) {
return value + 1;
}
}
「javac Doug.java」を使用して Doug.java をコンパイルすると、成功します。
「jar -cvf Doug.jar Doug.class」を使用して、Doug.class ファイルを含む JAR ファイルを作成します。これはうまくいきます。
ここで、JAR ファイルを Postgres (パブリック スキーマ) にロードし、クラスパスを変更し、JAR を呼び出す関数を作成してから、psql プロンプトで実行を試みます。
psql から sqlj.install_jar を実行します。
select sqlj.install_jar('file:/tmp/Doug.jar','Doug',false);
Postgres 内のクラスパスを設定します (psql プロンプト postgres=# から):
select sqlj.set_classpath('public','Doug');
JAR を呼び出す関数を作成します。この作成関数コードは、PL/JAVA に付属の examples.ddr ファイルから直接取得されます。org.postgres を com.msmetric に変更しただけです。
create or replace function addone(int) returns int as 'com.msmetric.Doug.addOne(java.lang.Integer)' language java;
JAR が読み込まれ、関数が作成されたので、実行してみます。この関数は、提供された数値に 1 を加算するだけです。
select addone(3);
結果: エラー: java.lang.ClassNotFoundException: com.msmetric.Doug
考え?