#hibernate #maven #jpa #spring-boot #profile
#спящий режим #maven #jpa #spring-boot #Профиль
Вопрос:
Я использую Spring Boot / JPA / Hibernate. Я хотел бы использовать HSQLDB при тестировании на localhost и MySQL при развертывании на сервере.
В 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. Но я хотел бы использовать HSQLDB, когда local
профиль Spring активен, и использовать MySQL, когда server
профиль Spring активен. В идеале я хотел бы сгенерировать только один файл war и запустить локальную версию с mvn spring-boot:run
и развернуть серверную версию из файла war.
Есть идеи?
PS: я использую maven
Комментарии:
1. Какая у вас проблема, если установлены обе зависимости? Приложение запускается неправильно? Или что-то еще
2. Может быть, вы можете реализовать два разных источника данных в своем приложении и позволить значению профиля определять, какой источник данных используется.
3. @Patrick После еще нескольких исследований я обнаружил, что проблема связана с несовместимостью диалекта sql между MySQL и HSQLDB, но Стефан Николл прав, нет проблем с наличием обеих зависимостей в pom.xml .
Ответ №1:
Я, вероятно, не могу поместить обе зависимости в pom.xml из-за автоматической настройки загрузки Spring.
Конечно, у вас могут быть оба из них. Существует несколько решений.
Самый простой — иметь обе зависимости и создать application-server.properties
в своем проекте с настройками вашей базы данных mysql. Когда вы запускаете приложение без определенного профиля, Spring Boot не найдет никакой информации для подключения к MySQL, поэтому он вернется к HSQL. При развертывании приложения на сервере обязательно включите server
профиль. Один и тот же артефакт может использоваться для обоих вариантов использования.
Вы могли бы немного улучшить это решение, исключив зависимость от hsql при создании fat jar. Преимущество этого заключается в том, что если вы забудете включить профиль, вы получите исключение при запуске, а не будете использовать данные в памяти молча. Чтобы исключить hsql, просто настройте плагин maven. Вы сможете запускать приложение локально ( mvn spring-boot:run
) или в своей IDE, а fat jar будет содержать только зависимость mysql. Однако вам все равно придется включить server
профиль.
Если вы используете war, вы не можете использовать это последнее решение: еще одна причина переключиться на jar 😉
Комментарии:
1. Почему невозможно исключить hsql из файла war?
2. Вы можете. Но если вам нужно запустить файл war и вы исключите его, вы не сможете запустить свое приложение с базой данных в памяти. Когда у вас есть jar, вы можете запускать свое приложение непосредственно из IDE
Ответ №2:
Вам нужно создать профиль Maven, а не профиль spring, и соответствующим образом добавить зависимость. Создайте локальный профиль с зависимостью от hsqldb и активируйте его в режиме разработки. Затем создайте профиль сервера с зависимостью mysql и активируйте его при упаковке для развертывания на сервере. Я лично предпочитаю dev и release как соглашение об именовании (но это мое скромное мнение). Затем вам нужно сократить профиль maven с помощью профиля spring
<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]
Комментарии:
1. Это хорошее решение, но он должен создать два файла war для test и prod, верно?
2. @Patrick Это решение, используемое в проекте нашей компании. Производственный профиль минимизирует источники JS и CSS, чтобы улучшить время загрузки страницы. Мы используем
mvn clean package -Prelease
для создания файла prod war. Отсутствие минимизации при каждой сборке также экономит нам время ожидания во время разработки.3. @patrick это зависит: для тестирования и prod желательно использовать одну и ту же БД (например, mysql). он должен создать две войны: одну для разработки и одну для выпуска (для тестирования и производства). вот почему я предлагаю изменить соглашение об именах
4. @Sammyrulez На самом деле, у меня есть три комбинации профилей Spring:
local
для тестирования на моем локальном компьютере (HSQLDB),server,dev
для тестирования в производственной среде (MySQL) иserver
для развертывания в производственной среде (MySQL).5. @OrtomalaLokni профиль spring или профиль maven? извините, но это непонятно