网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
demo
├─app_common
│ └─build.gradle
├─app_one
│ └─build.gradle
├─app_two
│ └─build.gradle
├─build.gradle
├─settings.gradle
这种多模块创建方式比较简单,直接选中根目录demo,右键选择 New -> Module…
选中Gradle -> Java -> Next
命名要添加的子模块名称、填写GroupId/ArtifactId/Version三要素 -> Finish:
同理,将app_one、app_two另外两个子模块也创建出来即可
最终得到的工程结构如下图所示:
每一个子模块下的build.gradle跟主模块的结构是一样的
例如app_common/build.gradle配置如下:
plugins {
id 'java'
}
group 'com.example'
version '0.0.1'
repositories {
mavenCentral()
}
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
}
test {
useJUnitPlatform()
}
主模块下的settings.gradle主要负载依赖其他子模块:
rootProject.name = 'demo'
include 'app\_common'
include 'app\_one'
include 'app\_two'
2.2 构建单模块
同样的,完成多个子模块的创建后,测试一下Gradle构建单个模块是否正常
展开右边的Gradle -> app_common -> Tasks -> build -> jar,双击执行即可完成单模块的构建
最终得到app_common-0.0.1.jar单个构建包,一般生成在build的相关目录下:
2.3 构建多模块
也可以Gradle同时构建多个模块
展开右边的Gradle -> build -> jar,双击执行即可完成多模块的同时构建
三、定制多模块(单配置)
3.1 定制化说明
可以看到前面传统的多模块虽然创建简单,不过每一个子模块都需要维护一个
build.gradle
配置,对于实际应用来说,可能会比较繁琐了,因此可以考虑将多个子模块的配置整合到一个配置里面,这里本文做了一个定制化的配置,除了原有的build.gradle
、settings.gradle
两个配置文件之外,还新建了另外一个dependencies.gradle
以及自定义template
目录下相关的脚本
结构预览
springboot-gradle-demo
├─template
├─gradle
├─v1
├─build_java.gradle //bootjar、jar、war等构建方式定义
├─buildscript.gradle //统一加载需要的插件
├─functions.gradle //gralde定制化主函数配置
├─junit.gradle //单元测试依赖的jdk版本、源码目录等
├─app_common
├─app_one
├─app_two
├─build.gradle //仓库定义、引用外部函数、插件以及依赖各个子模块定制化等
├─dependencies.gradle //根据名字可以看出主要用来进行依赖jar包用途
├─settings.gradle //主模块及子模块之间的include依赖
3.2 定制化配置
核心配置文件build.gradle、dependencies.gradle、settings.gradle及template配置内容及用途说明如下:
(1)settings.gradle
配置及说明:
//Gradle主工程名
rootProject.name = 'springboot-gradle-demo'
//Gradle子模块名
include 'app\_common','app\_one','app\_two'
(2)build.gradle
配置及说明:
//==================定制化1:仓库、编译、插件、公共依赖start==================
buildscript {
//全局声明变量
ext {
//maven公共仓库
maven_public_repo_url="https://maven.aliyun.com/repository/public/"
//gradle插件中心
gradle_repo_url="https://plugins.gradle.org/m2/"
//maven应用系统私有仓库
//maven\_private\_dev\_repo\_url="https://maven.aliyun.com/repository/spring/"
//DEV SNAPSHOTS依赖仓库
//maven\_snapshots\_dev\_repo\_url="https://oss.sonatype.org/content/repositories/snapshots/"
//插件目录(放在工程目录下,也可以单独存放到资源服务器,指定访问文件的具体url)
template_dir="/template/gradle/v1"
//编译目录(相对路径)
output_dir="build"
}
//全局仓库: 自上而下寻找依赖
repositories {
//maven本地仓库: 优先加载
mavenLocal()
//maven仓库中心
mavenCentral()
//jcenter仓库中心
//jcenter()和mavenCentral()是两个独立的仓库,两者毫无关系,jcenter()有的mavenCentral()可能没有,反之亦然。
jcenter()
//google仓库中心
//google()
//maven远程仓库: 阿里云或公司私服仓库
maven {
url = maven_public_repo_url
url = gradle_repo_url
//url = maven\_private\_dev\_repo\_url
//url = maven\_snapshots\_dev\_repo\_url
}
}
//全局公共依赖
apply from: template_dir+'/buildscript.gradle',to: buildscript
}
//==================定制化1:仓库、编译、插件、公共依赖end==================
//Java插件: 未配置时api、implementation无法加载
plugins {
id 'java'
id 'java-library'
}
//==================定制化2:配置构建主入口、全局功能函数start==================
//自定义全局工具定制化: 自动构建主入口+配置全局功能函数
apply from: template_dir+'/functions.gradle'
//==================定制化2:配置构建主入口、全局功能函数end==================
//=======================定制化3:gradle子项目模块start=========================
//common project
project(':app\_common'){
apply from: '..'+template_dir+'/build\_java.gradle'
apply from: '..'+template_dir+'/junit.gradle'
}
//app\_one project
project(':app\_one'){
apply from: '..'+template_dir+'/build\_java.gradle'
apply from: '..'+template_dir+'/junit.gradle'
}
//app\_two project
project(':app\_two'){
apply from: '..'+template_dir+'/build\_java.gradle'
apply from: '..'+template_dir+'/junit.gradle'
}
//=======================定制化3:gradle子项目模块end=========================
//=======================定制化4:子项目定义依赖start=========================
apply from: 'dependencies.gradle'
//=======================定制化4:子项目定义依赖end=========================
//setSysSnapshotsRepo
//待扩展...
(3)dependencies.gradle
配置及说明:
//========================Gradle工程子模块依赖jar包及版本控制=========================
//===========参数说明start=========
//api: 依赖暴露,其他模块都可见
//implementation: 表示依赖屏蔽,仅自己模块内可见
//===========参数说明end===========
//公共子模块依赖定义:app\_common
project(':app\_common'){//app\_common公共项目子模块: 作为jar工程供其他子模块引用,其他无须重复定义相关jar包
dependencies{
//依赖仓库jar包
api 'org.springframework.boot:spring-boot:2.4.3'
api 'org.springframework.boot:spring-boot-starter-web:2.4.3'
api 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.3'
api 'mysql:mysql-connector-java:5.1.47'
//依赖第三方jar包:指定工程资源lib目录下所有依赖包
api fileTree(dir:'src/main/resources/lib',includes: ['\*.jar'])
//引入 mybatis-generator 插件
//apply plugin: "com.arenagod.gradle.MybatisGenerator"
//测试依赖:仅供测试用,仅当前模块生效,不会加载到打包版本中,PS: 根据实际需要定义
testImplementation 'junit:junit:4.11'
}
}
//独立子模块依赖定义: app\_one
project(':app\_one'){
dependencies{
//模块依赖: 指定某个模块进行依赖
implementation project(':app\_common')
//依赖第三方jar包:指定工程资源lib目录下所有依赖包
compile fileTree(dir:'src/main/resources/lib',includes: ['\*.jar'])
//依赖排除(包级别):exclude的内容将不会被该jar包引用,PS: 根据实际需要定义
testImplementation (('org.springframework:spring-test:5.3.3')) {
exclude group: 'org.springframework', module: 'mock'
exclude group: 'org.springframework', module: 'mock'
exclude group: 'org.springframework', module: 'mock'
exclude group: 'org.springframework', module: 'mock'
}
//依赖排除(模块级别):exclude的内容将不会被该jar包引用,PS: 根据实际需要定义
implementation (project(':app\_common')) {
exclude group: 'org.springframework', module: 'mock'
exclude group: 'org.springframework', module: 'mock'
exclude group: 'org.springframework', module: 'mock'
exclude group: 'org.springframework', module: 'mock'
}
//测试依赖:仅供测试用,仅当前模块生效,不会加载到打包版本中,PS: 根据实际需要定义
testImplementation 'junit:junit:4.11'
testImplementation 'org.mybatis.generator:mybatis-generator-core:1.3.7'
}
//依赖排除(全局级别):exclude的内容将不会被该jar包引用,PS: 当要排除的依赖范围很广时,可采用该方式
configurations.all {
exclude group: 'org.springframework', module: 'spring-core'
}
}
//独立子模块依赖定义: app\_two
project(':app\_two'){
dependencies{
//模块依赖: 指定某个模块进行依赖
implementation project(':app\_common')
//依赖第三方jar包:指定工程资源lib目录下所有依赖包
compile fileTree(dir:'src/main/resources/lib',includes: ['\*.jar'])
//依赖排除(包级别):exclude的内容将不会被该jar包引用,PS: 根据实际需要定义
testImplementation (('org.springframework:spring-test:5.3.3')) {
exclude group: 'org.springframework', module: 'mock'
exclude group: 'org.springframework', module: 'mock'
exclude group: 'org.springframework', module: 'mock'
exclude group: 'org.springframework', module: 'mock'
}
//依赖排除(模块级别):exclude的内容将不会被该jar包引用,PS: 根据实际需要定义
implementation (project(':app\_common')) {
exclude group: 'org.springframework', module: 'mock'
exclude group: 'org.springframework', module: 'mock'
exclude group: 'org.springframework', module: 'mock'
exclude group: 'org.springframework', module: 'mock'
}
//测试依赖:仅供测试用,仅当前模块生效,不会加载到打包版本中,PS: 根据实际需要定义
testImplementation 'junit:junit:4.11'
testImplementation 'org.mybatis.generator:mybatis-generator-core:1.3.7'
}
}
(4)template下的相关组件及函数
除了template/gradle/v1/functions.gradle
这段内容中的包名com.justin
需要改成自己的之外,其他可以可以不需要动
//deploy package dir of the project (sub-dir of output-dir)
setSysPrivateRepo = { sys_id ->
allprojects{
repositories{
maven {
url maven_private_dev_repo_url
content { includeGroupByRegx "com\\.justin\\."+sys_id+".\*" }
}
}
}
}
3.3 构建多模块(定制化)
同样整合了多个子模块的配置进行几种管理之后,跟前面一样,可以通过Gradle视图栏,对多个模块或者单个模块进行构建,生成得到jar、bootjar、war等格式的架包
如果大家有需要将多个模块的配置整合到一个配置里面进行管理的需求,可以根据本文提供的spring-boot-demo示例工程进行修改,来实现自己工程的定制化多模块配置的统一管理~
最后,附上spring-boot-demo工程的GitHub源码下载地址:https://github.com/JustinJava/springboot-gradle-demo
或者CSDN下载地址:https://download.csdn.net/download/JustinQin/23279945
❤️原创不易,觉得有用的小伙伴点亮⭐收藏,支持一下吧!❤️
本人从事网路安全工作12年,曾在2个大厂工作过,安全服务、售后服务、售前、攻防比赛、安全讲师、销售经理等职位都做过,对这个行业了解比较全面。
最近遍览了各种网络安全类的文章,内容参差不齐,其中不伐有大佬倾力教学,也有各种不良机构浑水摸鱼,在收到几条私信,发现大家对一套完整的系统的网络安全从学习路线到学习资料,甚至是工具有着不小的需求。
最后,我将这部分内容融会贯通成了一套282G的网络安全资料包,所有类目条理清晰,知识点层层递进,需要的小伙伴可以点击下方小卡片领取哦!下面就开始进入正题,如何从一个萌新一步一步进入网络安全行业。
需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)
学习路线图
其中最为瞩目也是最为基础的就是网络安全学习路线图,这里我给大家分享一份打磨了3个月,已经更新到4.0版本的网络安全学习路线图。
相比起繁琐的文字,还是生动的视频教程更加适合零基础的同学们学习,这里也是整理了一份与上述学习路线一一对应的网络安全视频教程。
网络安全工具箱
当然,当你入门之后,仅仅是视频教程已经不能满足你的需求了,你肯定需要学习各种工具的使用以及大量的实战项目,这里也分享一份我自己整理的网络安全入门工具以及使用教程和实战。
项目实战
最后就是项目实战,这里带来的是SRC资料&HW资料,毕竟实战是检验真理的唯一标准嘛~
面试题
归根结底,我们的最终目的都是为了就业,所以这份结合了多位朋友的亲身经验打磨的面试题合集你绝对不能错过!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!