Jython で wsadmin を使用して EAR ファイルをデプロイしようとしています。実際のデプロイの前に、Java クラスを使用して DB 更新を実行する必要があります。私には意味をなさない ClassNotFoundException が発生しています。
背景: EAR ファイルは展開されています。wsadmin ツールは、以下のオプションで開始されます。
-wsadmin_classpath %CP%
-javaoption -Dpython.path=%CP%
これらは両方とも、必要なすべての JAR を含む同じクラスパスを指しています。
jython スクリプトはデータベースへの接続を取得し、ユーティリティ クラスを呼び出してデータベース スクリプトを作成します。ユーティリティ クラスはリフレクションを使用して、クラスパスから他のクラスをロードします (これは、使用しているライブラリの厳格な要件であり、変更することはできません)。基本的には次のようになります。
from liquibase import Liquibase
def main(args):
conn = getConnection(args)
updater = Liquibase(conn)
updater.update()
update() メソッドの間、Liquibase はリフレクションを使用して一部の Java クラスをインスタンス化します。これは、ClassNotFoundException を取得する場所です。たとえば、ClassNotFoundException: com.foo.CustomUpdate です。
私のスクリプトでは、com.foo.CustomUpdate クラスをインポートでき、エラーは発生しません。
from com.foo import CustomUpdate
c = CustomUpdate("select 1")
print c.getUpdate()
したがって、クラスがクラスパス上にあることがわかります。私の唯一の考えは、使用しているライブラリのリフレクションの側面と関係があるということです。他の誰かがこのようなものにぶつかりましたか?
上記が修正不可能な場合、私の他の唯一のアイデアは、シェルスクリプトに分割し、Java を使用して DB 更新を実行し、次に wsadmin を使用して EAR をデプロイすることです。