Я пытаюсь использовать wsadmin с Jython для развертывания файла EAR. Перед фактическим развертыванием мне нужно запустить обновление БД с использованием класса Java. Я сталкиваюсь с 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 для запуска обновления базы данных, а затем wsadmin для развертывания EAR.