LoginSignup
9
9

More than 5 years have passed since last update.

Pythonスクリプトからjarファイル中のクラスを直接importする

Posted at

Pythonスクリプトからjarファイル中のクラスを直接importする方法です。

CLASSPATHに依存しないので、JavaとJythonが動く環境があれば
PythonとJavaの連携を簡単にパッケージ化することが可能になります。

例えば、PythonでJavaの遺産とSQLiteを同時に使いたい時などに便利です。
Jythonは標準モジュールでSQLiteをサポートしていないのでJDBCドライバが必要ですが、
直接PythonスクリプトからJDBCドライバのjarファイルを読み込めるようにすれば、
必要なファイルを放り込むだけでPythonからJavaクラスとSQLiteを使用できます。

sys.pathをいじる

test.py
import.sys
sys.path.append("/path/to/hogehoge.jar")
import Hogehoge

で動くよ!という情報がありましたがダメでした。
単にパスを通すだけじゃなくて、そのなかのクラスを読み込まなければいけないようです。

ClassPathHacker

ClassPathHackerというのがひとつの解決法らしいです。
http://www.jython.org/jythonbook/en/1.0/appendixB.html#working-with-classpath

以下、sqliteのJDBCドライバをjythonから呼び出す一例です。

test2.py
from java.lang import Class
from java.sql import DriverManager

class classPathHacker:
    import java.net.URLClassLoader

    def addFile(self, s):
        sysloader = self.java.lang.ClassLoader.getSystemClassLoader()
        sysclass = self.java.net.URLClassLoader
        method = sysclass.getDeclaredMethod("addURL", [self.java.net.URL])
        method.setAccessible(1)
        f = self.java.io.File(s)
        method.invoke(sysloader, [f.toURL()])

c = classPathHacker()
c.addFile("/path/to/sqlite-jdbc.jar")
jdbc_url = "jdbc:sqlite:/path/to/database.db"
driver = "org.sqlite.JDBC"
Class.forName(driver).newInstance()
con = DriverManager.getConnection(jdbc_url)
# 以下ごにょごにょ

よくわかりませんが、URLClassLoader.addURLを無理矢理アクセス可能にして
クラスを読み込んでるみたいです。

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9