gradle新建工程,多项目依赖,聚合工程
感谢gradle完全的文档。开始完全没想过新建项目会弄我一天时间,都说gradle构建项目简单,我现在回复他们呵呵。
gradle是个非常复杂的工具,从他的完整包80M和72章官方文档就可以看出一二。
一、平级项目依赖includeFlat
我的环境是gradle3.2.1,eclipse-neon,eclipse插件是(Buildship 1.0),jdk1.8
最常见的项目就是多工程平级的项目项目构造如下:
A
B
C
三个工程完全平级A是基础工程打成jar包给C引用,B是jar工程 也是打成jar给C引用。C是web工程打成war包发布。
网上的坑爹教程都是骗人的,没一个能解决这个问题。还是官方文档靠谱,只是72章太多了。
这样的工程配置其实非常简单,新建三个gradle工程
A中的build.gradle完全不用改
B中的settings.gradle
[plain] view plain copy print?
rootProject.name = 'B'
includeFlat 'A'
记得请使用includeFlat表示水平级别。最开始写成了include ‘A’结果坑了我4个多小时。
B中的build.gradle
dependencies {
compile project(':A')
testCompile 'junit:junit:4.12'
}
请注意
compile project(':A')
这个是gradle的依赖工程的写法。有多个就写多个就好
到这里B工程就配置完成了,打B的jar包就可以A一起打了。
C中的settings.gradle,和B的一样加上
includeFlat 'A','B'
C中的build.gradle就需要改一下完整的如下
apply plugin: 'war'
apply plugin: 'java'
apply plugin: 'eclipse'
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
compile project(':A')
compile project(':B')
compile 'org.slf4j:slf4j-api:1.7.21'
testCompile 'junit:junit:4.12'
}
修改了几个地方
1,加上了war的引用 加上之后插件中就显示有war的选项了,build的时候也会默认安装war的方式去打包。
2,中央库被我改成默认使用maven的中央库了
3,同时依赖了A B2个工程
到这里多个平级工程就建好了!其实真的挺简单。
二、聚合工程,模块式开发include
然后开发中还会有一种需求,在maven中叫聚合工程。项目结构如下:
C
|------C1
|------C2
就是一个工程被分为多个模块,每个模块需要在eclipse中显示为单独的工程。
其实写法非常简单,只是把之前的includeFlat改成include就好了
C中settings.gradle
rootProject.name = 'C'
include 'C1','C2'
C1和C2都不需要修改任何代码,只是要在根目录下新增一个名为C1和C2的文件夹,C1和C2的文件夹下需要存在一个语法正确的build.gradle。
然后刷新gradle就可以看到工程已经出来了。
三、多工程,多模块依赖(bt依赖)
假设
A
|----A1
C
|----C1
现在如果C1需要依赖A1,那么问题来了,这2个子模块根本没啥关系,如何依赖呢!
A中的settings.gradle
rootProject.name = 'A'
include 'A1'
A1貌似不需要修改啥
C中的settings.gradle
rootProject.name = 'C'
include 'C1'
includeFlat 'A'
include 'A:A1'
一般来说我们是不会在子模块中放入settings.gradle。即使放了C1中的settings.gradle也是不生效的,所以只能在C中的配置中写入。 C1中就可以在build.gradle
dependencies {
compile project(':A:A1')
testCompile 'junit:junit:4.12'
}
刷新gradle,这里的依赖请注意,因为gradle是默认带有依赖传递的,所以已经在A1引入的jar包在C1中也会默认引入,请注意jar包冲突。
如果有重复的jar包,会以C1中的为准,这种工程非常容易出现重复的jar,请注意jar的依赖。
总结:其实gradle是个很好用的工具,只是现在资料不好找。而且网上误导不全的一大把! 所以学gradle还是老老实实去看官方文档吧。
- Python爬虫之豆瓣音乐及糗事百科
- oracle、mysql 分页查询比较
- Linux乱码问题解决方案
- JDBC为什么要使用PreparedStatement而不是Statement
- tcpdump捕捉样例
- Log4j详细使用教程
- Android系统线控和歌曲信息屏显的那点事
- 利用Spring中同名Bean相互覆盖的特性,定制平台的类内容。
- 关于java传参
- 浅析ButterKnife
- SQL Server常用语句
- pyecharts(一):Python可视化利器
- 如何在Python中保存ARIMA时间序列预测模型
- SVN+Apache域用户认证配置方法_Windows(转,重新排版,部分内容更新优化)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Salesforce LWC学习(二十七) File Upload
- 让我们来谈谈python中的prettyprint和pprint
- vue 开发规范
- Markdown 编写规范
- JavaScript编码规范
- HTML编码规范
- postgres数据库不能用ip地址访问的问题
- Flutter基础widgets教程-ButtonBar篇
- 如何在linux服务上创建samba文件共享服务
- Salesforce Javascript(二) 箭头函数
- java面试基础部分;
- 7-2.表单-HTML基础
- 如何在github上传多个项目
- Flutter基础widgets教程-Card篇
- Springboot热部署,使用spring-boot-devtools、springloaded两种方式进行热部署