Maven Multi Module坚持在业务模块

时间:2017-11-15 21:36:45

标签: spring hibernate maven jpa multi-module

我有spring 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将实体对象返回到product-business,product-business将实体对象返回到product-rest,product-rest返回json对象。

产品数据运行良好。但是一旦我运行产品业务,我就会收到错误"无法确定数据库类型为NONE" 的嵌入式数据库驱动程序类。 Spring在我的product-business / src / main / resources / application.properties文件中查找spring.datasource ....属性。如果我在这里定义了所有属性,那么错误就会消失,我从product-data中获取数据。

但是!!我已经在product-data / src / main / resources / application.properties文件中定义了属性。 为什么我必须在产品 - 业务模块中复制相同的属性?整个目的是分离图层。 product-data负责获取数据,它应该在自己的结构下找到spring.datasource ...属性。为什么它会强迫我复制业务模块中的属性呢?我相信我错过了一些东西。有人有任何线索吗?

我在SO上经历了许多类似的问题,但大多数人都错过了这些属性,因此无法解决我的问题。我假设我的pom文件不是嫌疑人,因为一旦我将属性从产品数据粘贴到产品 - 业务,那么错误就会消失。但是,如果你还想看到我的pom,那就好了。

  

母产品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>
  

产品数据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>
  

产品 - 业务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>

2 个答案:

答案 0 :(得分:2)

您可以使用 spring.config.name 属性覆盖默认值 application 并在其中放置更多属性文件名。

例如:

spring.config.name=entities,business,application

在这种情况下,您可以在实体模块中使用entities.properties,在业务模块中使用business.properties,在rest 或app 模块中使用application.properties。最后一个配置名称(应用程序)的优先级最高,第一个(实体)的优先级最低。

答案 1 :(得分:0)

根据this

  

不建议将application.properties放在库中,因为在运行时可能会在使用它的应用程序中发生冲突(从类路径中只加载了一个application.properties)

为解决此问题并仍然保持解耦架构,我在 product-data 模块的resources文件夹下创建了另一个文件 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