Maven Multi Module 坚持在业务模块中复制数据源 application.properties
Maven Multi Module insists on duplicating datasource application.properties in business module
我有 spring 引导 maven java 多模块结构。我的结构是:
product (parent pom module)
..product-data (child pom module)
..product-business (has dependency for product-data)
..product-rest (has dependency for product-business)
..product-entities (child pom module)
product-data 将 return 实体对象指向 product-business 和 product-business 将 return 实体对象指向 product-rest 和 product-rest returns json 目的。
产品数据运行没问题。但是一旦我 运行 product-business,我就会收到错误 "Cannot determine embedded database driver class for database type NONE"。 Spring 在我的 product-business/src/main/resources/application.properties 文件下寻找 spring.datasource.. 属性。如果我在这里定义所有属性,那么错误就会消失,我会从产品数据中获取数据。
但是!!我已经在 product-data/src/main/resources/ application.properties 文件下定义了属性。 为什么我必须在我的产品业务模块中复制相同的属性? 整个目的是分离层。 product-data 负责获取数据,它应该在自己的结构下找到 spring.datasource... 属性。为什么它也迫使我复制业务模块中的属性?我确定我错过了什么。有人知道吗?
我在 SO 上遇到过许多类似的问题,但其中大多数都缺少属性,因此无法解决我的问题。我假设我的 pom 文件不是可疑的,因为一旦我将属性从产品数据复制粘贴到产品业务,错误就会消失。但是万一你还想看我的 pom:
Parent product POM
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.owner</groupId>
<artifactId>product</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<nopeasti.version>1.0.0-SNAPSHOT</nopeasti.version>
</properties>
<dependencies>
</dependencies>
<modules>
<module>product-data</module>
<module>product-business</module>
<module>product-rest</module>
<module>product-entities</module>
</modules>
</project>
product-data POM
<project>
<artifactId>product-data</artifactId>
<packaging>jar</packaging>
<parent>
<groupId>com.owner</groupId>
<artifactId>product</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.8.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.0.0.M6</version>
</plugin>
</plugins>
</build>
</project>
product-business POM
<project>
<artifactId>product-business</artifactId>
<packaging>jar</packaging>
<parent>
<groupId>com.owner</groupId>
<artifactId>product</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.8.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.owner</groupId>
<artifactId>product-data</artifactId>
<scope>compile</scope>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.0.0.M6</version>
</plugin>
</plugins>
</build>
</project>
根据this,
It is not advisable to put application.properties in a library because there might be a clash at runtime in the application that uses it (only one application.properties is ever loaded from the classpath)
为了解决这个问题并仍然保持解耦架构,我在 product-data 的资源文件夹下创建了另一个文件 data.properties模块并在配置文件中指定 @PropertySource 注解。这是 product-data 模块的配置文件。 spring.datasource 属性已在此文件中定义。然后在其他 2 个模块中不需要 spring.datasource 属性。
@ComponentScan
@EnableAutoConfiguration
@SpringBootConfiguration
@PropertySource(value = "data.properties")
public class NopeastiDataConfig {
// no main needed here as this is library consumed by business layer
}
进一步阅读此处:Externalized Configuration
您可以使用 spring.config.name
属性 覆盖默认值 application
并在其中放置更多 属性 个文件名。
例如:
spring.config.name=entities,business,application
在这种情况下,您可以在实体模块中使用 entities.properties,在业务模块中使用 business.properties,在休息或应用程序模块中使用 application.properties。最后一个配置名称(应用程序)具有最高优先级,第一个(实体)具有最低优先级。
我有 spring 引导 maven java 多模块结构。我的结构是:
product (parent pom module)
..product-data (child pom module)
..product-business (has dependency for product-data)
..product-rest (has dependency for product-business)
..product-entities (child pom module)
product-data 将 return 实体对象指向 product-business 和 product-business 将 return 实体对象指向 product-rest 和 product-rest returns json 目的。
产品数据运行没问题。但是一旦我 运行 product-business,我就会收到错误 "Cannot determine embedded database driver class for database type NONE"。 Spring 在我的 product-business/src/main/resources/application.properties 文件下寻找 spring.datasource.. 属性。如果我在这里定义所有属性,那么错误就会消失,我会从产品数据中获取数据。
但是!!我已经在 product-data/src/main/resources/ application.properties 文件下定义了属性。 为什么我必须在我的产品业务模块中复制相同的属性? 整个目的是分离层。 product-data 负责获取数据,它应该在自己的结构下找到 spring.datasource... 属性。为什么它也迫使我复制业务模块中的属性?我确定我错过了什么。有人知道吗?
我在 SO 上遇到过许多类似的问题,但其中大多数都缺少属性,因此无法解决我的问题。我假设我的 pom 文件不是可疑的,因为一旦我将属性从产品数据复制粘贴到产品业务,错误就会消失。但是万一你还想看我的 pom:
Parent product POM
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.owner</groupId>
<artifactId>product</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<nopeasti.version>1.0.0-SNAPSHOT</nopeasti.version>
</properties>
<dependencies>
</dependencies>
<modules>
<module>product-data</module>
<module>product-business</module>
<module>product-rest</module>
<module>product-entities</module>
</modules>
</project>
product-data POM
<project>
<artifactId>product-data</artifactId>
<packaging>jar</packaging>
<parent>
<groupId>com.owner</groupId>
<artifactId>product</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.8.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.0.0.M6</version>
</plugin>
</plugins>
</build>
</project>
product-business POM
<project>
<artifactId>product-business</artifactId>
<packaging>jar</packaging>
<parent>
<groupId>com.owner</groupId>
<artifactId>product</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.8.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.owner</groupId>
<artifactId>product-data</artifactId>
<scope>compile</scope>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.0.0.M6</version>
</plugin>
</plugins>
</build>
</project>
根据this,
It is not advisable to put application.properties in a library because there might be a clash at runtime in the application that uses it (only one application.properties is ever loaded from the classpath)
为了解决这个问题并仍然保持解耦架构,我在 product-data 的资源文件夹下创建了另一个文件 data.properties模块并在配置文件中指定 @PropertySource 注解。这是 product-data 模块的配置文件。 spring.datasource 属性已在此文件中定义。然后在其他 2 个模块中不需要 spring.datasource 属性。
@ComponentScan
@EnableAutoConfiguration
@SpringBootConfiguration
@PropertySource(value = "data.properties")
public class NopeastiDataConfig {
// no main needed here as this is library consumed by business layer
}
进一步阅读此处:Externalized Configuration
您可以使用 spring.config.name
属性 覆盖默认值 application
并在其中放置更多 属性 个文件名。
例如:
spring.config.name=entities,business,application
在这种情况下,您可以在实体模块中使用 entities.properties,在业务模块中使用 business.properties,在休息或应用程序模块中使用 application.properties。最后一个配置名称(应用程序)具有最高优先级,第一个(实体)具有最低优先级。