前言
搭建一个项目,看似简单,但是总会遇到一些奇奇怪怪的问题。
新建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>
就这,啥也不是。。。