查看原文
其他

Maven的高级玩法,你用过吗?

点击关注 👉 Java面试那些事儿 2020-10-08

接上一篇《Maven是个什么鬼?》,来一篇高级的用法。

# 不同环境使用不同配置:Profile+Filter


在实际开发场景下,我们必然会存在多套环境:测试环境、开发环境、线上环境等。在不同环境下,我们就会有多套配置文件,比如数据源配置。


我们期望的是,不论部署到什么环境,不必修改代码,不必修改配置


很庆幸的是,Maven提供了一个方便的解决方案:Profile功能。


给大家演示个小demo:


工程结构

对于多套环境而言,我们可以抽取出相同的部分,放入到公共的文件当中,把那些跟着环境变化而变化的配置信息,分环境存放,最后根据选择的环境而将那部分配置信息动态注入到公共的文件当中。(比如db.properties和filter/db-xxx.properties)


当然,我们也可以建立多个目录,每一个目录表示一个环境,那么选择一套环境,就让这个目录下的资源文件生效。(比如xxx/config.xml)


Profile定义:


Profile


IDEA Maven插件:


选择Profile

如pom.xml所示,通过profile定义了dev、release、test这3套环境。注意在<profile>中通过<properties>进行了自定义属性。


Maven属性的概念?


Maven有一套自己内置的属性,比如${basedir},${project.xxx},Java相关,操作系统相关等,这些可以直接在pom.xml中进行引用;用户也可以通过<properties>来自定义属性,比如上面的例子,我们就可以在pom.xml中通过${profiles.active}来指明用户选择的profile。


注意,可以指定默认的profile。


选择Profile进行打包?


实质上就是在执行mvn package -Pxxx而已。


我们来具体看一眼配置文件的内容信息:


配置文件信息

这里,我们需要重点注意的是:


在db.properties中,我们通过${jdbc.username}进行了引用,而jdbc.username是在db-xxx.properties中定义的。


说白了,现在,我们要让db-xxx.properties中的KEY成为变量,并进行替换db.properties这个资源文件中的内容。


filter配置:


filter配置

第一,我们通过filter来指定变量配置文件的地址,要通过profile变量进行动态选择;


第二,要知道默认Maven资源文件的打包,就是COPY一份资源文件到默认的输出目录,一般就是classes下,现在必须让资源文件可以进行变量替换,因此开启过滤功能


第三,在图中配置,通过exclude排除了filter资源目录下的文件,也就是最后打包里面没有filter目录下的文件;


第四:要么使用绝对路径,那就要使用到Maven的内置变量;要么使用相对路径,相对于pom.xml文件的路径;


资源插件配置:


plugin配置

上面的意思就是说把不同环境目录下的配置文件拷贝到classes下,而不是classes下的XXX目录下。

比如我们选择profile为test打包,结果如下:


war包结构


文件内容


# 多模块开发:继承与聚合


继承?聚合?


继承,在Java中就存在的概念,而且继承和多态往往密不可分。对于Maven而言,我们可以将一个大的复杂的项目,进行模块划分,这样各个模块各司其职,独立开发,这就涉及到继承与聚合了。


演示一个小Demo:


工程结构

依赖关系


父工程关键片段:


注意打包方式以及子模块包含


子工程关键片段:


子模块pom.xml配置

其实,上述demo把工程划分为:


parent:root工程,没有代码,只有配置(比如进行版本锁定),用于聚合子模块,在此工程上进行mvn clean/package等,那么maven会自动根据依赖关系对每一个模块进行处理;


web模块依赖service模块,service模块依赖dao模块;


我们可以想象下:


dao模块负责对DB的持久化操作,比如需要依赖mybatis,肯定也需要Spring来进行bean管理以及Mapper代理,也即是依赖mybatis+spring,注意mybatis的mapper文件以及spring的配置文件都放入到resources下。


service模块负责业务逻辑,需要依赖dao模块。由于依赖dao自然就引入了spring依赖,这里只需要加入事务的相关配置。


web模块负责前端交互,需要依赖service模块,以及spring-mvc。


到这里,对于多模块的继承和聚合就有点了解了吧。


这里提一个问题:


在web模块中,除了需要加载web模块中的Spring配置文件外,显然也需要加载service/dao模块中的Spring配置文件,可是web模块依赖service,service依赖dao,也就是说最终web模块会依赖service.jar(spring配置文件在其中),dao.jar(spring配置文件在其中),因此我们需要加载service.jar、dao.jar中的spring配置文件!


留给你思考!^_^


# 私服


Nexus

私服,我们对其的印象,就如上图所示。其实在日常中,我们对于私服的操作主要在于:


第一:可以搜索依赖坐标得到XML片段;


第二:deploy 依赖到私服以及从私服下载依赖;


私服仓库类型:


仓库信息


group:一个仓库组,说白了,就是几个仓库的集合。


hosted:宿主仓库,存储公司内部开发的jar,分为Releases/Snapshots。


proxy:用于代理中央仓库。


到这里,你应该能感觉到,在settings.xml/pom.xml中进行私服配置的时候,我们势必会配置宿主仓库的信息,比如仓库的ID、用户名、密码、访问URL等。

作者:张丰哲
链接:https://www.jianshu.com/p/34740cd1fb58


 往期推荐 

🔗



 

点击阅读原文,获得更多精彩内容

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存