Flyway ClassNotFoundException: JavaUtilLogCreator - PullRequest
2 голосов
/ 30 мая 2019

Я использую 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 в качестве своего Logger. Возможно, именно поэтому я получаю эти ошибки в 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. Похоже, запрос на получение как-то связан с моей проблемой.

Ответы [ 2 ]

1 голос
/ 09 июля 2019

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

1 голос
/ 30 мая 2019

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

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

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

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

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

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

...