2016-10-05 3 views
0

Я использую Spring Boot/JPA/Hibernate. Я хотел бы использовать HSQLDB при тестировании на localhost и MySQL при развертывании на сервере.Spring Boot/JPA/Hibernate, Как переключить поставщика баз данных в соответствии с профилем Spring?

В pom.xml, у меня есть эта зависимость для MySQL:

<dependency> 
    <groupId>mysql</groupId> 
    <artifactId>mysql-connector-java</artifactId> 
</dependency> 

и эту зависимость для HSQLDB:

<dependency> 
    <groupId>org.hsqldb</groupId> 
    <artifactId>hsqldb</artifactId> 
</dependency> 

я, вероятно, не может поставить обе зависимости в pom.xml из-за Автоконфигурация Spring Boot. Но я хотел бы использовать HSQLDB, когда профиль Spring local активен и использует MySQL, когда активен профиль Spring server. В идеале я хотел бы создать только один файл войны и запустить локальную версию с mvn spring-boot:run и развернуть версию сервера из военного файла.

Любая идея?

P.S .: Я использую Maven

+0

Какой вопрос у вас есть, если оба зависимостей установлены? Не работает ли приложение неправильно? Или что-то еще – Patrick

+0

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

+0

@Patrick. После нескольких исследований я обнаружил, что проблема возникает из-за несовместимости sql-диалектов между MySQL и HSQLDB, но Стефан Николл прав, нет проблем с обеими зависимостями в pom.xml. –

ответ

3

Возможно, я не могу установить обе зависимости в pom.xml из-за автоконфигурации Spring Boot.

Уверенный, что вы можете иметь их обоих. Существует несколько решений.

Самый простой в том, чтобы иметь обе зависимости и создать application-server.properties в вашем проекте с настройками базы данных mysql. Когда вы запускаете приложение без определенного профиля, Spring Boot не найдет никакой информации для подключения к MySQL, поэтому он вернется к HSQL. При развертывании приложения на сервере обязательно включите профиль server. Один и тот же артефакт может использоваться для обоих случаев.

Вы можете немного улучшить это решение, исключив зависимость hsql при генерации жировой банки. Это имеет то преимущество, что если вы забудете включить профиль, вы получите исключение при запуске, вместо того, чтобы молча использовать базы данных в памяти. Чтобы исключить hsql, просто configure the maven plugin. Вы сможете запускать приложение локально (mvn spring-boot:run) или в вашей среде IDE, а жирная баня будет содержать только зависимость mysql.Однако вам все равно придется включить профиль server.

Если вы используете войну, вы не можете использовать это последнее решение: еще одна причина, чтобы перейти к банку ;-)

+0

Почему исключить hsql из файла войны ? –

+0

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

3

Вам нужно создать Maven профиль не пружинный профиль и добавить зависимость accordily. Создайте локальный профиль с зависимостью hsqldb и активируйте его в режиме dev. Затем создайте профиль с зависимостью mysql и активируйте его во время упаковки для развертывания на сервере. Я лично предпочитаю dev и релиз как соглашение об именовании (но это мое скромное мнение). Тогда вы должны ярлык профиля Maven с яровой профиль

<plugin> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-maven-plugin</artifactId> 
    <version>xyz</version> 
    <configuration> 
     <profiles> 
     <profile>local</profile>.... 

В локальном профиле и

<plugin> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-maven-plugin</artifactId> 
    <version>1.4.1.RELEASE</version> 
    <configuration> 
     <profiles> 
     <profile>server</profile>... 

в профиле сервера и запуска желаемой конфигурации с помощью этого переключателя

mvn spring-boot:run -P[local or server] 

Introduction to Build Profiles

+0

Это хорошее решение, но он должен создать два военных файла для теста и prod, не так ли? – Patrick

+1

@Patrick Это решение, используемое в проекте нашей компании. Профиль производства минимизирует источники JS и CSS, чтобы улучшить время загрузки страницы. Мы используем 'mvn clean package -Prelease' для создания файла prod war. Не минимизация на каждой сборке также спасает нас от раздражающего ожидания во время разработки. – coladict

+0

@patrick это зависит: для теста и prod целесообразно использовать тот же db (так mysql). он должен создать две войны: одну для разработки и одну для выпуска (для тестирования и производства). поэтому я предлагаю изменить соглашение об именах – Sammyrulez

Смежные вопросы