具有多环境配置的 Maven 应用程序无法在 tomcat 上部署
maven application with multi environment configuration can't deploy on tomcat
我正在尝试使用 Spring Boot with Maven 为我的 Web 应用程序配置多部署环境。在 src/main/resources/config 下创建了几个 .properties 文件。
db-dev.properties 和 db-prod.properties 包含数据库特定信息:
db.url=jdbc:oracle:thin:@ldap://dev.com/risstg3,
db.username=owner
db.password=godzilla
在同一目录中,我还有 application.properties,它读取这些 db 属性 文件中定义的变量
#database info
spring.datasource.driverClassName=oracle.jdbc.OracleDriver
spring.datasource.url=${db.url}
spring.datasource.username=${db.username}
spring.datasource.password=${db.password}
#hibernate config
spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect
我的 pom 中设置了多个配置文件:
<profiles>
<profile>
<id>dev</id>
<properties>
<env>dev</env>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<env>prod</env>
</properties>
</profile>
</profiles>
<build>
<filters>
<filter>src/main/resources/config/db-${env}.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources/config</directory>
<filtering>true</filtering>
</resource>
</resources>
所有其他配置由 Spring 在我的应用程序中使用 @SpringBootApplication 注释引导 class。
然后我通过使用 -P 选项指定配置文件来构建 war,例如mvn install -Pprod
。但是由于以下错误,我无法在本地计算机上使用 tomcat 部署它:
SEVERE: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/ristoreService]]
Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
我以为我在 application.properties 中设置了 'hibernate.dialect' 和 spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect
基于此thread,这个错误可能不一定与休眠方言有关。如果数据库连接不成功,您可能会看到它。我错过了什么?有没有办法判断 war 是否使用正确的配置文件创建,以及是否选择了 db-{dev}.properties 中定义的变量?
这与您的设置略有不同,但我认为这有助于以更 Spring 友好的方式解决问题。 Spring 有配置文件的概念。您可以创建 application.properties
个文件作为默认设置,然后为您的配置文件特定设置创建 application-${profile}.properties
。如果您创建一个 application-dev.properties
和一个 application-prod.properties
,那么您需要做的就是指定一个名为 spring.profiles.active=dev
的环境变量,这将使用它们。这样您就不需要为每种类型的部署创建单独的 jar 文件。
我正在尝试使用 Spring Boot with Maven 为我的 Web 应用程序配置多部署环境。在 src/main/resources/config 下创建了几个 .properties 文件。 db-dev.properties 和 db-prod.properties 包含数据库特定信息:
db.url=jdbc:oracle:thin:@ldap://dev.com/risstg3,
db.username=owner
db.password=godzilla
在同一目录中,我还有 application.properties,它读取这些 db 属性 文件中定义的变量
#database info
spring.datasource.driverClassName=oracle.jdbc.OracleDriver
spring.datasource.url=${db.url}
spring.datasource.username=${db.username}
spring.datasource.password=${db.password}
#hibernate config
spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect
我的 pom 中设置了多个配置文件:
<profiles>
<profile>
<id>dev</id>
<properties>
<env>dev</env>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<env>prod</env>
</properties>
</profile>
</profiles>
<build>
<filters>
<filter>src/main/resources/config/db-${env}.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources/config</directory>
<filtering>true</filtering>
</resource>
</resources>
所有其他配置由 Spring 在我的应用程序中使用 @SpringBootApplication 注释引导 class。
然后我通过使用 -P 选项指定配置文件来构建 war,例如mvn install -Pprod
。但是由于以下错误,我无法在本地计算机上使用 tomcat 部署它:
SEVERE: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/ristoreService]]
Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
我以为我在 application.properties 中设置了 'hibernate.dialect' 和 spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect
基于此thread,这个错误可能不一定与休眠方言有关。如果数据库连接不成功,您可能会看到它。我错过了什么?有没有办法判断 war 是否使用正确的配置文件创建,以及是否选择了 db-{dev}.properties 中定义的变量?
这与您的设置略有不同,但我认为这有助于以更 Spring 友好的方式解决问题。 Spring 有配置文件的概念。您可以创建 application.properties
个文件作为默认设置,然后为您的配置文件特定设置创建 application-${profile}.properties
。如果您创建一个 application-dev.properties
和一个 application-prod.properties
,那么您需要做的就是指定一个名为 spring.profiles.active=dev
的环境变量,这将使用它们。这样您就不需要为每种类型的部署创建单独的 jar 文件。