Gradle 的基本使用
Gradle 的优点 原文:https://blog.csdn.net/achenyuan/article/details/80682288
1. 按约定声明构建和建设;
2. 强大的支持多工程的构建;
3. 强大的依赖管理(基于Apache Ivy),提供最大的便利去构建工程;
4. 全力支持已有的 Maven 或者Ivy仓库基础建设;
5. 支持传递性依赖管理,在不需要远程仓库和pom.xml和ivy配置文件的前提下;
6. 基于groovy脚本构建,其build脚本使用groovy语言编写;
7. 具有广泛的领域模型支持构建;
8. 深度 API;
9. 易迁移;
10. 自由和开放源码,Gradle是一个开源项目,基于 ASL 许可。
下面是Gradle 基本配置的简介
build.gradle (作用类似于 maven 中的epom 文件)
plugins { id 'java' id 'war' } group 'gradle02-projext' version '1.0-SNAPSHOT' sourceCompatibility = 1.8 dependencies { testCompile group: 'junit', name: 'junit', version: '4.11' testCompile group: 'junit', name: 'junit', version: '4.12' }
原文位置(https://blog.csdn.net/cluzax/article/details/46583771)
目录文件 | 作用 |
---|---|
.gradle | gradle项目产生文件(自动编译工具产生的文件) |
.idea | IDEA项目文件(开发工具产生的文件) |
app | 其中一个module,复用父项目的设置,可与父项目拥有相同的配置文件 |
build | 自动构建时生成文件的地方 |
gradle | 自动完成gradle环境支持文件夹 |
.gitignore | git源码管理文件 |
build.gradle | gradle 项目自动编译的配置文件 |
gradle.properties | gradle 运行环境配置文件 |
gradlew | 自动完成 gradle 环境的linux mac 脚本,配合gradle 文件夹使用 |
gradlew.bat | 自动完成 gradle 环境的windows 脚本,配合gradle 文件夹使用 |
local.properties | Android SDK NDK 环境路径配置 |
*.iml | IDEA 项目文件 |
setting.gradle | gradle 项目的子项目包含文件 |
- .gradle .idea 是在分别在 gradle ,IDEA 运行时候会生成的文件,一般这样的文件也不会纳入源代码管理之中。
- app文件夹,是其中一个module,里面的文件内容与父类差不多,若没有定义,则在项目中使用父类的设置(意思就是,里面也能包含build.gradle、gradle.properties、setting.gradle 等相关gradle文件,怎么理解?其实每一层都是一个module,整个项目是一个大的 module 而已)
- gradle 文件夹,用于保存gradle 下载路径的配置文件位置,用于没有gradle环境的环境初始化使用
- build.gradle 项目的编译环境配置,比如制定项目依赖的lib包。
- gradle.properties 配置gradle运行环境的文件,比如配置gradle运行模式,运行时jvm虚拟机的大小
- gradlew && gradlew.bat 代替gradle 命令实现自动完成gradle环境搭建。配合gradle文件夹的内容,会降到IDEA如何搭配gradlew使用。
- local.properties 配置android NDK,SDK的地方,恩,非android项目可能没有这个文件,这个路径根据不同想电脑不同,一般也不会纳入源代码管理之中,一般可以写一个local.properties.simple 文件,告知需要修改该文件名并写上本地SDK NDK 路径。simple文件纳入源码管理之中。
- setting.gradle 子项目包含文件,声明当前目录下含有什么module,当然你的app底下加上这样的文件,也能继续在app底下加module。和我第点说的,整个project就是一个大的module,每个module下面还能包含相应的module。如果你理解这个了,其实app目录单独作为一个项目管理也是可以的,,把相应的配置文件配上而已,相当于主目录应用 android 的gradle plugin (下一点会说到这个)
-
gitignore 该文件是源码管理的配置文件,不在该文讲解。
既然gradle 是多 module形式,那么我们来看看 setting.gradle 配置的内容
rootProject.name = 'gradle'
从上面目录的配置文件内容来看,整个project也算是一个module,如果改module底下还有module,就可以通过setting.gradle配置进来,使得该module底下的gradle,从app module底下可以看出,module最少要含有 build.gradle文件,这个module的项目编译文件,该module依赖什么插件对该目录进行编译都在此配置,比如android与android-library,其他内容可继承父类的
同样maven项目需要依赖,Gradle也需要jar包
但是Gradle的jar包去哪里找呢 根据Build.Gradle 已经指出来了
repositories {
mavenCentral() maven中心仓库
}
网址是https://search.maven.org/ 使用搜狗浏览器我的打不开,所以我使用了谷歌
里面有一个jar包是将netty所有的jar包都包含了
我都拷贝出来吧
maven版本下的 还不让我copy
<dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <veresion>5.0.0.Alpha2<version> </dependency>
'io.netty:netty-all:4.1.34.Final'
E:\sturts2\gradle03-projext>gradle clean build BUILD SUCCESSFUL in 12s 2 actionable tasks: 2 executed E:\sturts2\gradle03-projext>
下面先上一个代码,输出helloworld 我再学习的时候,也是一脸懵或许等一下就好了吧
按照我的习惯,先写配置
plugins { id 'java' id 'war' } group 'gradle03-projext' version '1.0' sourceCompatibility = 1.8 targetCompatibility = 1.8 repositories { mavenCentral() } dependencies { /*testCompile group: 'junit', name: 'junit', version: '4.11'*/ testCompile group: 'junit', name: 'junit', version: '4.12' compile( 'io.netty:netty-all:4.1.34.Final' ) }
TestServer
import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioServerSocketChannel; /** * Description: gradle03 * Created by lenovo on 2019/4/17 19:39 */ public class TestServer { public static void main (String[] args) throws InterruptedException { /*netty中大量的就是对线程的处理对线程的控制,对io的一些异步的操作*/ /*先定义两个线程组NIo 就是异步的*/ /*事件循环组:*/ EventLoopGroup bossLoopGroup = new NioEventLoopGroup(); EventLoopGroup workLoopGroup = new NioEventLoopGroup(); ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap.group(bossLoopGroup,workLoopGroup).channel(NioServerSocketChannel.class).childHandler(new TestServerInitializer()); ChannelFuture channelFuture = serverBootstrap.bind(8899).sync(); channelFuture.channel().closeFuture().sync(); bossLoopGroup.shutdownGracefully(); workLoopGroup.shutdownGracefully(); } }
TestHttpServerHandler
import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.handler.codec.http.*; import io.netty.util.CharsetUtil; import javax.servlet.http.HttpServlet; import java.nio.charset.Charset; /** * Description: gradle03 * Created by lenovo on 2019/4/17 20:50 */ public class TestHttpServerHandler extends SimpleChannelInboundHandler<HttpObject> { @Override protected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception { if (msg instanceof HttpRequest){ ByteBuf content = Unpooled.copiedBuffer("hello world", CharsetUtil.UTF_8); DefaultFullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK, content); response.headers().set(HttpHeaderNames.CONTENT_TYPE,"text/plain"); response.headers().set(HttpHeaderNames.CONTENT_LENGTH,content.readableBytes()); ctx.writeAndFlush(response); } } }
TestServerInitializer
import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.socket.SocketChannel; import io.netty.handler.codec.http.HttpServerCodec; /** * Description: gradle03 * Created by lenovo on 2019/4/17 20:46 */ public class TestServerInitializer extends ChannelInitializer<SocketChannel> { @Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast("httpServerCode",new HttpServerCodec()); pipeline.addLast("testHttpServletHandler",new TestHttpServerHandler()); } }
浏览器中是可以访问到的
http://localhost:8899/
现在分析时间执行的流程,和方法回调
