Скрипты Liquibase не выполняются в мультизагрузочном проекте Spring boot multi jar - PullRequest
0 голосов
/ 10 января 2019

У меня есть многомодульное загрузочное приложение Spring, которое я интегрировал с Liquibase. При запуске из IDE скрипты liquibase работают просто отлично. Тем не менее, при запуске его из банки, они не делают. После некоторого исследования кажется, что сама жидкость имеет основную проблему при попытке чтения из встроенных банок. Сами скрипты liquibase присутствуют во встроенных jar внутри fat jar, а основной XML-файл выглядит так:

<includeAll path="classpath*:config/liquibase/changelog/"/>

После дальнейшего исследования я сузил все до проблемы внутри самой жидкой базы. Я использую версию liquibase-3.6.2. Я подозреваю, что ошибка присутствует в liquibase в следующем классе: liquibase.resource.ClassLoaderResourceAccessor Метод, который я сузил, это

public Set<String> list(String relativeTo, String path, boolean includeFiles, boolean includeDirectories, boolean recursive) throws IOException

Вход для этого метода следующий:

relativeTo = null
path = jar:file:/C:/#{SOME_PATH}/xxx-1.0.0.0-SNAPSHOT.jar!/BOOT-INF/lib/yyy-1.0.0.0-SNAPSHOT.jar!/config/liquibase/changelog/
includeFiles = true
includeDirectories = false
recursive = true

Конечно, вам нужно заменить # {SOME_PATH} действительным путем на диске. Я отредактировал это в целях безопасности. Мы уже можем заметить, что liquibase выяснил, что могут быть некоторые сценарии во встроенном банке yyy внутри толстой банки xxx.

Проблема этого метода заключается в том, что вместо возврата XML-скриптов внутри банки он возвращает сам файл yyy. Это позже приведет к ошибке в коде, поэтому я предположил, что именно этот метод несет ответственность за поиск файлов XML (как это происходит, если я запускаю свой проект непосредственно из IDE, а не из jar-файла).

Строка, в которой я заметил серьезные проблемы, находится в строке 134:

String returnPath = SpringBootFatJar.getSimplePathForResources(entry.getName(), path);

В этот момент переменная пути прервана, и SpringBootFatJar возвращает неверный путь возврата. В следующей части я опишу, что происходит:

  • В строке 105 переменная пути разделяется и становится «config / liquibase / changelog /». Исходя из того, как он используется в строке 134 и javadoc внутри класса SpringBootFatJar, это может быть очень плохо.
  • Перемотка вперед на строку 134, entry.getName () возвращает «BOOT-INF / lib / yyy-1.0.0.0-SNAPSHOT.jar», и путь такой же, как указано выше. Исходя из javadoc внутри SpringBootFatJar, это очень плохо.
  • После строки 134 returnPath становится "BOOT-INF / lib / yyy-1.0.0.0-SNAPSHOT.jar", а остальное - история, так как nestedEntries в строке 143 никогда не будут начинаться с этого пути.

К сожалению, у меня нет времени на дальнейшее изучение этой проблемы на этой неделе, и я хотел опубликовать этот вопрос на stackoverflow, чтобы узнать, есть ли у кого-то еще эта проблема, является ли это известной ошибкой в ​​жидкой базе и есть ли простое исправление для Это. На следующей неделе я попытаюсь исследовать этот вопрос самостоятельно и проверить, все ли эти проблемы касаются, казалось бы, плохо разделенного параметра пути в строке 105, поскольку у введенного параметра пути есть ДВА экземпляра "! /" Внутри него.

Спасибо

1 Ответ

0 голосов
/ 11 января 2019

На тот случай, если кто-то еще наткнется на этот вопрос, он исправит его на мастере, но релиза пока нет. Мы взяли их хозяина из github и составили из него SNAPSHOT. Результат на момент написания этого комментария - 3.7.0-SNAPSHOT. Мы будем использовать официальный релиз 3.7.0, когда они доберутся до него.

...