spring-boot не удается загрузить изменение базы данных при сборке gradle

#intellij-idea #spring-boot

#intellij-idea #spring-boot

Вопрос:

Я использую Spring-boot 1.1.1.RELEASE, и у меня есть база данных H2, которая создается при запуске. Когда я запускаю свой основной класс из IntelliJ, все работает хорошо. Когда я запускаю «тест сборки gradle«, я получаю ошибки в своих интеграционных тестах:

 Caused by: java.lang.IllegalStateException: Cannot find changelog location: class path resource [db/changelog/db.changelog-master.yaml] (please add changelog or check your Liquibase configuration)
    at org.springframework.util.Assert.state(Assert.java:385)
    at org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration$LiquibaseConfiguration.checkChangelogExists(LiquibaseAutoConfiguration.java:80)
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:349)
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:300)
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:133)
  

Вот мой файл gradle:

 apply plugin: 'java'
apply plugin: 'groovy'
apply plugin: 'idea'
apply plugin: 'spring-boot'
apply plugin: 'jacoco'
apply plugin: 'maven'

project.ext {
    springBootVersion = '1.1.1.RELEASE'
}

buildscript {
    repositories {
        maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }
        maven { url "http://repo.spring.io/libs-milestone" }
        maven { url "http://repo.spring.io/libs-snapshot" }
        mavenLocal()
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.0.1.RELEASE")

    }
}

jar {
    baseName = 'my-app'
    version = '0.1.0'
}

repositories {
    mavenCentral()
    maven { url "http://repo.spring.io/libs-milestone" }
    maven { url "https://repository.jboss.org/nexus/content/repositories/releases" }
    maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }
    maven { url "http://repo.spring.io/snapshot" }
    maven { url 'http://repo.spring.io/milestone' }
}

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web:$springBootVersion")
    compile("org.springframework.boot:spring-boot:1.0.1.RELEASE")
    compile("org.springframework.boot:spring-boot-starter-thymeleaf")
    compile("org.springframework.boot:spring-boot-starter-security")
    compile("org.springframework.boot:spring-boot-starter-data-jpa:$springBootVersion")
    compile("org.springframework.security:spring-security-web:4.0.0.M1")
    compile("org.springframework.security:spring-security-config:4.0.0.M1")
    compile('org.thymeleaf.extras:thymeleaf-extras-springsecurity3:2.1.1.RELEASE')

    compile("org.springframework:spring-orm:4.0.0.RC1")
    compile("org.hibernate:hibernate-core:4.3.4.Final")
    compile("org.hibernate:hibernate-entitymanager:4.3.4.Final")
    compile("org.hibernate:hibernate-validator")

    compile("com.h2database:h2:1.3.172")
    compile("joda-time:joda-time:2.3")
    compile("org.codehaus.groovy.modules.http-builder:http-builder:0.7.1")
    compile('org.codehaus.groovy:groovy-all:2.2.1')
    compile('org.jadira.usertype:usertype.jodatime:2.0.1')
    compile("org.liquibase:liquibase-core")

    testCompile('org.spockframework:spock-core:1.0-groovy-2.0-SNAPSHOT') {
        exclude group: 'org.codehaus.groovy', module: 'groovy-all'
    }

    testCompile('org.spockframework:spock-spring:1.0-groovy-2.0-SNAPSHOT') {
        exclude group: 'org.spockframework', module: 'spock-core'
        exclude group: 'org.spockframework', module: 'spring-beans'
        exclude group: 'org.spockframework', module: 'spring-test'
        exclude group: 'org.codehaus.groovy', module: 'groovy-all'
    }
    testCompile("org.springframework.boot:spring-boot-starter-test:$springBootVersion")
    testCompile('org.codehaus.groovy.modules.http-builder:http-builder:0.7 ')
    testCompile("junit:junit")
}

jacocoTestReport {
    group = "Reporting"
    description = "Generate Jacoco coverage reports after running tests."
}

task wrapper(type: Wrapper) {
    gradleVersion = '1.11'
}
  

У меня есть как в src / main /resources, так и в src / test / resources файл application.properties, который содержит следующую запись:

 liquibase.changeLog=classpath:db/changelog/db.changelog-master.xml
  

И затем как в src / main /resources /db / changelog, так и в src / test /resources / db / changelog у меня естьdb.changelog-master.xml Когда я собираю проект, я вижу, что build / resources /test и build / resources /main имеют application.properties, db/changelog/db.changelog-master.xml там.

Похоже, это проблема с путем к классам, поскольку она работает из IntelliJ, а не из командной строки. Кто-нибудь может подсказать, что я могу здесь делать неправильно?

Комментарии:

1. Я согласен, что это звучит как проблема с путем к классам. После того, как вы запустите «gradle build», что находится в build/resources /main и build/ resources / test?

2. У меня есть как master, так и build: /build/resources/…/db/changelog/db.changelog-master.xml , build/resources/…/application.properties в дополнение к другим ожидаемым файлам. Итак, все помещается туда.

3. Я полагаю, вы вообще не настраивали тестовую задачу Gradle, чтобы изменить ее путь к классу? Возможно, вы могли бы поделиться где-нибудь проектом, который иллюстрирует проблему?

4. К сожалению, я не могу поделиться всем проектом. И в моем файле build.gradle нет никаких тестовых заданий, специфичных для него. Я обновил свой пост с помощью файла my gradle.

Ответ №1:

Я хотел добавить сюда свое исправление (хотя моя сборка Maven). Мой application.properties был в моем корневом каталоге, но он не нашел мой db.changelog.xml путь к классу, как указано из корневого каталога. Для этого требовалось, чтобы путь к классу был из моего /resources каталога. Возможно, у меня есть мой application.properties в нетрадиционном месте, но я думал, что его нужно поместить в корневой каталог.

Мое исправление

Хотя фактический путь от моего application.properties таков:
liquibase.change-log=classpath:/src/main/resources/liquibase/db.changelog.xml

Для его поиска требовался этот путь:
liquibase.change-log=classpath:/liquibase/db.changelog.xml

Ответ №2:

Я вижу spock в пути к тестовому классу, так что, вероятно, он все еще не использует правильный загрузчик тестового контекста (хотелось бы, чтобы они это исправили). Вам нужно добавить загрузчик или инициализатор вручную в свой @ContextConfiguration . Документы здесь.