Rhinoで動的に.jarファイルのクラスを読み込んで利用する方法

タイトルのような事をしたい場合、URLClassLoaderを使えばいいらしいので、簡単なラッパーを作ってみた。

function JarClassLoader(pathList) {
    var urls = [];
    for(var i = 0, len = pathList.length; i < len; i++) {
        urls.push( (new java.io.File(pathList[i])).toURL() );
    }
    this._classLoader = new java.net.URLClassLoader(urls);
}
JarClassLoader.prototype.loadClass = function(name) {
    return this._classLoader.loadClass(name);
}

このJarClassLoaderでSQLiteJDBCドライバを使ってみる。

function getSqliteConnection(url) {
    var jar = ["C:\\lib\\sqlitejdbc-v048-nested.jar"];
    var loader = new JarClassLoader(jar);

    var jdbcClass = loader.loadClass("org.sqlite.JDBC");
    var jdbcDriver = jdbcClass.newInstance();

    var props = new java.util.Properties();
    return jdbcDriver.connect(url, props);
}

var conn = getSqliteConnection("jdbc:sqlite:C:/test1.db");

// 以下、普通にJDBC使うのとほぼ同じなので省略