В проекте Gradle Spring Boot, как я могу объявить зависимости, которые будут использоваться только при локальном запуске? - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть приложение Spring Boot, созданное с помощью Gradle, которое подключается к базе данных.При локальном запуске зачастую удобнее работать в базе данных в памяти (в данном случае h2 ), чем подключаться к реальному экземпляру базы данных.Для этого приложение объявляет пользовательскую задачу BootRun для локального запуска приложения.Как я могу убедиться, что зависимость h2 доступна при локальном запуске, но не включена в созданный Spring Boot jar?

Файлы:

build.gradle

import org.springframework.boot.gradle.tasks.run.BootRun

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.5.RELEASE")
    }
}

plugins {
    id 'java'
    id 'org.springframework.boot' version '2.1.1.RELEASE'
    id "io.spring.dependency-management" version "1.0.6.RELEASE"
}

group 'test'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    compile "org.springframework.boot:spring-boot-starter-web"
    compile "org.springframework.boot:spring-boot-starter-jdbc"

    // compile "..." // Dependency for the real, non-in memory, database goes here

    compile "com.h2database:h2" // How can I make sure this isn't included in the resulting jar?
}

task bootRunLocal(type: BootRun, group: ApplicationPlugin.APPLICATION_GROUP, dependsOn: classes) {
    main = 'test.BootApplication'
    classpath = sourceSets.main.runtimeClasspath

    systemProperty "spring.profiles.active", "local-db-h2"
}

application.yml

spring:
  datasource:
    # Default and non-in-memory datasource configuration goes here
---
spring:
  profiles: local-db-h2
  datasource.url: jdbc:h2:mem:testdb;MODE=Oracle
  datasource.platform: h2_local

test / BootApplication.java

package test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.jdbc.core.JdbcTemplate;

@SpringBootApplication
public class BootApplication implements CommandLineRunner {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public static void main(String[] args) {
        SpringApplication.run(BootApplication.class, args);
    }

    @Override
    public void run(String... args) {
        jdbcTemplate.query("SELECT 1", row -> {});
    }
}

1 Ответ

0 голосов
/ 18 декабря 2018

В реализованном мною решении используется пользовательская конфигурация Gradle для зависимости h2.

build.gradle

configurations {
    localDatabase
}

dependencies {
    compile "org.springframework.boot:spring-boot-starter-web"
    compile "org.springframework.boot:spring-boot-starter-jdbc"

    // compile "..." // Dependency for the real, non-in memory, database

    localDatabase 'com.h2database:h2'
}

task bootRunLocal(type: BootRun, group: ApplicationPlugin.APPLICATION_GROUP, dependsOn: classes) {
    main = 'test.BootApplication'
    classpath = sourceSets.main.runtimeClasspath + configurations.localDatabase

    systemProperty "spring.profiles.active", "local-db-h2"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...