Flyway ClassNotFoundException: JavaUtilLogCreator

Я использую Flyway 5.2.4 и OSGI Bundle Activator. Я хочу перенести базу данных с помощью метода start() пакета. Вот мой ActivatorClass:

import org.flywaydb.core.Flyway;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Activator implements BundleActivator {
    private final Logger log = LoggerFactory.getLogger(this.getClass());
    private ServiceRegistration serviceRegistration;

    public void start(BundleContext bundleContext) {
        log.info("Starting...");
        serviceRegistration = bundleContext.registerService(IConnector.class.getName(), new Connector(), null);
        log.info("Started.");

        //FlyWay Section
        Flyway flyway = Flyway.configure().dataSource("jdbc:postgresql://localhost:5432/", "postgres", "12345").load();
        flyway.migrate();
    }

    public void stop(BundleContext bundleContext) {
        log.info("Stopping...");
        serviceRegistration.unregister();
        log.info("Stopped.");
    }

}

Как видите, я использую slf4j в качестве регистратора. Может быть, поэтому я получаю эти ошибки в своем StackTrace после развертывания приложения:

java.lang.Exception: Could not start bundle mvn:internship/db-connector/1.0.0 in feature(s) feature-1.0.0: Activator start error in bundle db-connector [2343].
        at org.apache.karaf.features.internal.FeaturesServiceImpl.startBundle(FeaturesServiceImpl.java:519)[20:org.apache.karaf.features.core:3.0.8]
        at org.apache.karaf.features.internal.FeaturesServiceImpl.installFeatures(FeaturesServiceImpl.java:474)[20:org.apache.karaf.features.core:3.0.8]
        at org.apache.karaf.features.internal.FeaturesServiceImpl.installFeature(FeaturesServiceImpl.java:415)[20:org.apache.karaf.features.core:3.0.8]
        at Proxy683d032e_ad2c_4b9a_98f7_baca7b5564f1.installFeature(Unknown Source)[:]
        at Proxyfff1bf4b_671e_4ff6_bb97_e0dabf9f20e8.installFeature(Unknown Source)[:]
        at org.apache.karaf.kar.internal.KarServiceImpl.installFeatures(KarServiceImpl.java:282)[89:org.apache.karaf.kar.core:3.0.8]
        at org.apache.karaf.kar.internal.KarServiceImpl.install(KarServiceImpl.java:111)[89:org.apache.karaf.kar.core:3.0.8]
        at org.apache.karaf.kar.internal.KarServiceImpl.install(KarServiceImpl.java:93)[89:org.apache.karaf.kar.core:3.0.8]
        at Proxy40d8d25a_37b2_4855_a381_fbb78daa68ce.install(Unknown Source)[:]
        at Proxy068a2f57_120b_4ee8_b953_7c8262bae9a2.install(Unknown Source)[:]
        at org.apache.karaf.deployer.kar.KarArtifactInstaller.update(KarArtifactInstaller.java:62)[91:org.apache.karaf.deployer.kar:3.0.8]
        at Proxy3c143b4c_a2ef_49d0_870b_21a9b5f74704.update(Unknown Source)[:]
        at org.apache.felix.fileinstall.internal.DirectoryWatcher.update(DirectoryWatcher.java:1101)[7:org.apache.felix.fileinstall:3.5.2]
        at org.apache.felix.fileinstall.internal.DirectoryWatcher.update(DirectoryWatcher.java:898)[7:org.apache.felix.fileinstall:3.5.2]
        at org.apache.felix.fileinstall.internal.DirectoryWatcher.doProcess(DirectoryWatcher.java:478)[7:org.apache.felix.fileinstall:3.5.2]
        at org.apache.felix.fileinstall.internal.DirectoryWatcher.process(DirectoryWatcher.java:355)[7:org.apache.felix.fileinstall:3.5.2]
        at org.apache.felix.fileinstall.internal.DirectoryWatcher.run(DirectoryWatcher.java:307)[7:org.apache.felix.fileinstall:3.5.2]
Caused by: org.osgi.framework.BundleException: Activator start error in bundle db-connector [2343].
        at org.apache.felix.framework.Felix.activateBundle(Felix.java:2196)[org.apache.felix.framework-4.2.1.jar:]
        at org.apache.felix.framework.Felix.startBundle(Felix.java:2064)[org.apache.felix.framework-4.2.1.jar:]
        at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:955)[org.apache.felix.framework-4.2.1.jar:]
        at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:942)[org.apache.felix.framework-4.2.1.jar:]
        at org.apache.karaf.features.internal.FeaturesServiceImpl.startBundle(FeaturesServiceImpl.java:516)[20:org.apache.karaf.features.core:3.0.8]
        ... 16 more
Caused by: java.lang.ExceptionInInitializerError
        at org.flywaydb.core.internal.util.FeatureDetector.isSlf4jAvailable(FeatureDetector.java:96)
        at org.flywaydb.core.internal.logging.LogCreatorFactory.getLogCreator(LogCreatorFactory.java:39)
        at org.flywaydb.core.api.logging.LogFactory.getLog(LogFactory.java:78)
        at org.flywaydb.core.internal.util.FeatureDetector.<clinit>(FeatureDetector.java:25)
        at org.flywaydb.core.internal.logging.LogCreatorFactory.getLogCreator(LogCreatorFactory.java:35)
        at org.flywaydb.core.api.logging.LogFactory.getLog(LogFactory.java:78)
        at org.flywaydb.core.Flyway.<clinit>(Flyway.java:86)
        at internship.connectors.postgresConnector.Activator.start(Activator.java:18)
        at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:645)
        at org.apache.felix.framework.Felix.activateBundle(Felix.java:2146)
        ... 20 more
Caused by: org.flywaydb.core.api.FlywayException: Unable to instantiate class org.flywaydb.core.internal.logging.javautil.JavaUtilLogCreator : org.flywaydb.core.internal.logging.javautil.JavaUtilLogCreator
        at org.flywaydb.core.internal.util.ClassUtils.instantiate(ClassUtils.java:63)[2348:org.flywaydb.core:5.2.4]
        at org.flywaydb.core.internal.logging.LogCreatorFactory.getLogCreator(LogCreatorFactory.java:46)[2348:org.flywaydb.core:5.2.4]
        at org.flywaydb.core.api.logging.LogFactory.getLog(LogFactory.java:78)[2348:org.flywaydb.core:5.2.4]
        at org.flywaydb.core.internal.util.ClassUtils.<clinit>(ClassUtils.java:39)[2348:org.flywaydb.core:5.2.4]
        ... 30 more
Caused by: java.lang.ClassNotFoundException: org.flywaydb.core.internal.logging.javautil.JavaUtilLogCreator
        at java.net.URLClassLoader.findClass(Unknown Source)[:1.8.0_212]
        at java.lang.ClassLoader.loadClass(Unknown Source)[:1.8.0_212]
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)[:1.8.0_212]
        at java.lang.ClassLoader.loadClass(Unknown Source)[:1.8.0_212]
        at java.lang.Class.forName0(Native Method)[:1.8.0_212]
        at java.lang.Class.forName(Unknown Source)[:1.8.0_212]
        at org.flywaydb.core.internal.util.ClassUtils.instantiate(ClassUtils.java:61)[2348:org.flywaydb.core:5.2.4]
        ... 33 more

Итак, я просто понятия не имею, что здесь не так, я использовал простейший пример с официального сайта Flyway и получил эти ошибки. Я уже пытался удалить свой Logger. Я думал, что он может позволить FlyWay использовать свой регистратор, но все идет по тому же пути (те же ошибки).

Не могли бы вы помочь мне?

P.S. Похоже, этот пул реквест как-то связан с моей проблемой.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
379
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Действительно, кажется, что у Flyway могут быть проблемы с OSGi. Может быть, вы можете предоставить им проблему и свой пример.

Другая проблема с вашим примером заключается в том, что вы пытаетесь получить доступ к источнику данных через URL-адрес. Это не работает в OSGi. Причина в том, что таким образом пролетный путь должен иметь прямой доступ к классам драйверов базы данных. Это не работает в OSGi.

В OSGi доступ к базе данных осуществляется с помощью DataSourceFactory, который драйвер базы данных создает как службу. Из этой фабрики вы можете создать DataSource.

Поскольку не все драйверы баз данных предлагают эту услугу, существует pax-jdbc, который предоставляет фабрики для всех распространенных баз данных. Это также позволяет создавать DataSource, включая объединение из конфигурации OSGi.

Ваш подход к миграции при запуске пакета - очень плохая идея. Методы в активаторе должны возвращаться быстро, а миграция базы данных может занять некоторое время. Конечно, вы хотите убедиться, что миграция происходит до того, как какой-либо пакет в системе получит доступ к базе данных. К счастью, есть способ подключиться к созданию DataSource, чтобы выполнять такие действия, как миграция.

См. учебник по жидкой базе, в котором также показана миграция базы данных. Он использует PreHook, предлагаемый pax-jdbc, который гарантирует, что ваш код миграции будет запущен до того, как DataSource будет передан любому другому пакету.

Спасибо, вы правы, было плохой идеей поставить что-то еще в Activator. Я очень ценю вас за этот учебник по liquibase, это потрясающе.

Nikita Kalugin 30.05.2019 08:34

Мне удалось избежать этой ошибки, установив пользовательское LogFactory перед вводом кода миграции flyway. Основная идея представлена ​​в этот пример фиксации

Другие вопросы по теме