idea构建maven多module项目

前言

搭建一个项目,看似简单,但是总会遇到一些奇奇怪怪的问题。

新建parent项目

新建一个springboot项目或者maven项目都可以,这个无所谓。

设置项目的maven仓库和编码。

建module

在parent项目下新建多个module,新建springboot项目或者maven项目都可以。

maven项目自己新建包的时候尽量按照groupId + artifactId的方式,如果artifactId是多个中划线连接,则去掉中划线,全小写拼接。

打包

新建完成上述项目之后,在parent下打包试一下,报错 “unable to find main class”。

介绍一下maven的packaging标签:

<packaging>pom</packaging>   --------->   父类型都为pom类型
<packaging>jar</packaging>   --------->   内部调用或者是作服务使用
<packaging>war</packaging>   --------->   需要部署的项目

把packaging 改为pom,大致就是告诉maven,咱只是个外包装,你不用找什么 main 方法了。

之后继续打包,发现没有一个module生成target目录

介绍一下maven的modules标签:

<modules>
    <module>moduleA</module>
    <module>moduleB</module>
    <module>moduleC</module>
</modules>

在parent项目的pom中加入modules标签,包含一下子模块,告诉maven,这都是我小弟。

子模块读取父模块或其他子模块的resource文件

首先说一下maven编译的时候处理相关文件的过程:

构建Maven项目的时候,如果没有进行特殊的配置,Maven会按照标准的目录结构查找和处理各种类型文件。

  • src/main/java和src/test/java :
    这两个目录中的所有*.java文件会分别在comile和test-comiple阶段被编译,编译结果分别放到了target/classes和targe/test-classes目录中,但是这两个目录中的其他文件都会被忽略掉。

  • src/main/resouces和src/test/resources
    这两个目录中的文件也会分别被复制到target/classes和target/test-classes目录中。

  • target/classes
    打包插件默认会把这个目录中的所有内容打入到jar包或者war包中。

此部分参考:https://www.cnblogs.com/pixy/p/4798089.html

了解了maven处理文件的过程,我们说一下maven的resources标签

resources标签通常包含在build标签中;

    <build>
        <resources>
            <resource>
                <directory>../src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                </includes>
            </resource>
        </resources>
    </build>

我们只需要配置resource的directory即可将其他模块的resource文件包含到本模块中。

maven profile和spring profile整合

其实就是想在application.properties文件中读取到pom中定义的变量

先说maven profile,引入maven profile主要是为了做环境的分离:

    <profiles>
        <profile>
            <id>dev</id>
            <properties>
                <!--主要这个标签名是自定义的-->
                <activeProfile>dev</activeProfile>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <activeProfile>prod</activeProfile>
            </properties>
        </profile>
    </profiles>

在application.properties中指定spring.profiles.active=@activeProfile@

maven编译的时候指定-P参数:mvn clean package -Pdev

理想情况下,application.properties中会变成spring.profiles.active=dev

但是,理想是丰满的,现实是骨感的,并没有成功,查了很多资料,很多人失败都是倒在了分隔符@@上,但是我并不是。。。

后来发现注释掉resources标签打包就可以替换,使用resources标签就不行,定位到肯定是这儿出的问题。

介绍一下resource标签下的filtering标签:
filtering代表开启过滤,用指定的参数替换directory下的文件中的参数。。。

然后在resource标签中加入filtering标签,设置为true就可以了

    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
                <includes>
                    <include>**/*.properties</include>
                </includes>
            </resource>
        </resources>
    </build>

就这,啥也不是。。。

posted on 2020-09-26 23:20  斜月三星一太阳  阅读(1576)  评论(0编辑  收藏  举报