JavaWeb - Maven(1/8):总体介绍(什么是 Maven、Maven 的作用、摘要)
目录
什么是Maven
Maven的作用
依赖管理
统一项目结构
项目构建
小结
Web前端开发的知识了解完毕后,接下来要进入后端Web开发的学习,这一部分的内容是学习的重点。在这一部分内容中,首先要了解 Java 项目的构建工具 Maven。
首先先来介绍一下什么是 Maven。
什么是Maven
- Maven是apache旗下的一个开源项目,是一款用于管理和构建java项目的工具。
是一款管理和构建 Java 项目的工具。这是 Maven 的 logo,
这里提到了一个组织,Apache
Apache软件基金会,成立于1999年7月,是目前世界上最大的最受欢迎的开源软件基金会,也是一个专门为支持开源项目而生的非盈利性组织。
开源项目:Welcome to The Apache Software Foundation!
所谓开源指的是源代码是开放的,谁都可以看到这个项目的源代码,而且它还是免费的。Apache 旗下的开源项目可以通过访问特定网址看到所有项目,Maven 只是其中的一个开源项目。
Maven的作用
作为一名 Java 开发工程师,在工作当中还会遇到很多 Apache 旗下的项目。
Maven 是一款管理和构建 Java 项目的工具,它的作用主要体现在三个方面:一是依赖管理;二是统一的项目结构;三是标准化的项目构建流程。
依赖管理
先来介绍第一个方面依赖管理。通过 Maven 这个工具,可以很方便快捷地管理项目当中的依赖资源,主要指的是 jar 包。
依赖管理
- 方便快捷地管理项目依赖的资源(jar包),避免版本冲突问题。
通过这款工具,还可以避免依赖 Java 包的冲突问题。如果通过传统的手动导入包的方式来开发一个大型项目,会非常繁琐。
比如在项目中要使用 Logback 来记录日志,首先得上网去找 Logback 相关的 Java 包,把这些包下载下来,复制到项目当中,然后在项目当中才可以使用 Logback 相关的功能来记录日志。
如果采用传统的手动导入包的方式,将会变得非常繁琐,因为首先得上网搜索这些包,一个一个下载下来,还得注意包之间的版本配套情况,然后再将这些包一个一个导入到项目当中。
如果在后期要对某一个包的版本进行升级,不仅要升级这个版本,相关依赖的版本都需要升级,这就非常繁琐。
有了 Maven 这款项目构建工具以后,我们不用再手动导入包了,只需要在配置文件当中简单描述一下我们所需要的依赖信息,Maven 就会自动联网下载,然后在项目当中就可以直接使用了。
如果要升级这个依赖的版本,也只需要修改一下这个文件,把版本号改了,刷新一下,此时这个版本会自动切换,并且相关的依赖版本全部会切换过来。
这是 Maven 的第一个作用依赖管理。
统一项目结构
接下来介绍第二个作用,统一的项目结构。
Java 项目的开发工具非常多,比如像早期的 Eclipse 以及当前最流行的 IntelliJ IDEA,它们所构建出来的 Java 项目是有差异的,所创建的 Java 工程不能直接导入到另一个开发工具当中。
这个问题将会得到完美的解决,Maven 给我们提供了一套标准的项目结构。不管你用的是哪款开发工具,只要使用 Maven 这款项目构建工具生成出来的目录结构,在其他的开发工具当中都可以将这个 Maven 工程直接导入进来,所有的开发工具都是通用的。
在 Maven 创建出来的这个工程当中,src 下有两个子目录,一个是 main,下面存放的是项目的实际资源;另一个是 test,下面存放的是项目的测试资源。而 main 以及 test 的下面就是 Java 的源代码。而 resources 下面存放的是配置文件等资源。
下面还有一份比较核心的配置文件叫 pom.xml,这个是 Maven 工程的核心,当前工程所需要导入的依赖的信息都需要在这份核心配置文件当中来配置。
这是 Maven 的统一的项目结构。
项目构建
接下来再介绍最后一个作用,标准化的项目构建流程。
在 Maven 当中提供了一套跨平台标准的项目构建方式。
具体来说,我们所开发的 Java 项目要运行,需要先通过 Java 编译器进行编译。如果没有像 IntelliJ IDEA 这样的高级开发工具,就需要先进行编译,编译完毕之后再来进行测试,测试我们的程序是否能够正常运行。
测试完毕之后就可以将项目进行打包,然后再对外发布这个项目。这是每一个项目当中都需要做的事情,但是在做一些大型项目的时候,这一系列的操作会非常繁琐。
Maven 将这一系列的操作制作了一套标准的构建流程,我们可以直接基于它提供的一些命令中的指令,快速地来完成项目的编译、测试、打包、发布等操作。
我们可以到 IDEA 简单演示一下,这里有一个命令窗口,假如我们要对项目进行编译,我们只需要点击右侧的命令面板,然后在这里找到里面的一条指令,
这个项目就会自动的进行编译,并且将编译后的文件放在了一个目录(target)下。target 下存放的就是编译之后的文件。
如果你要对当前项目进行打包,只需要双击一下特定指令,
那么此时 Maven 会自动的对项目进行打包,并且将打好的包也放在 target 这个目录下。而且像 compile、package 这些 Maven 当中的一些指令,在 Windows 系统上是支持的,同样在 Linux 系统、Mac 系统上都是支持的,所以它还是跨平台的。
这是 Maven 的三个作用。
小结
用一句话来总结 Maven,Maven 就是一款 Java 项目的工具。
既然它是一款工具,我们在学习 Maven 的时候,主要学习的就是这款工具的使用、Maven 当中的一些概念以及这款工具的安装、怎么样集成 Maven,最核心的一块功能就是 Maven 的使用。
END
学习自:黑马程序员——JavaWeb课程
下一篇: Golang 地图简介 - Go 地图
推荐阅读
-
JavaWeb - Maven(1/8):总体介绍(什么是 Maven、Maven 的作用、摘要)
-
异步编程RxJava-介绍-前言 前段时间写了一篇对协程的一些理解,里面提到了不管是协程还是callback,本质上其实提供的是一种异步无阻塞的编程模式;并且介绍了java中对异步无阻赛这种编程模式的支持,主要提到了Future和CompletableFuture;之后有同学在下面留言提到了RxJava,刚好最近在看微服务设计这本书,里面提到了响应式扩展(Reactive extensions,Rx),而RxJava是Rx在JVM上的实现,所有打算对RxJava进一步了解。 RxJava简介 RxJava的官网地址:https://github.com/ReactiveX/RxJava, 其中对RxJava进行了一句话描述:RxJava – Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequences for the Java VM. 大意就是:一个在Java VM上使用可观测的序列来组成异步的、基于事件的程序的库。 更详细的说明在Netflix技术博客的一篇文章中描述了RxJava的主要特点: 1.易于并发从而更好的利用服务器的能力。 2.易于有条件的异步执行。 3.一种更好的方式来避免回调地狱。 4.一种响应式方法。 与CompletableFuture对比 之前提到CompletableFuture真正的实现了异步的编程模式,一个比较常见的使用场景: CompletableFuture<Integer> future = CompletableFuture.supplyAsync(耗时函数); Future<Integer> f = future.whenComplete((v, e) -> { System.out.println(v); System.out.println(e); }); System.out.println("other..."); 下面用一个简单的例子来看一下RxJava是如何实现异步的编程模式: Observable<Long> observable = Observable.just(1, 2) .subscribeOn(Schedulers.io).map(new Func1<Integer, Long> { @Override public Long call(Integer t) { try { Thread.sleep(1000); //耗时的操作 } catch (InterruptedException e) { e.printStackTrace; } return (long) (t * 2); } }); observable.subscribe(new Subscriber<Long> { @Override public void onCompleted { System.out.println("onCompleted"); } @Override public void onError(Throwable e) { System.out.println("error" + e); } @Override public void onNext(Long result) { System.out.println("result = " + result); } }); System.out.println("other..."); Func1中以异步的方式执行了一个耗时的操作,Subscriber(观察者)被订阅到Observable(被观察者)中,当耗时操作执行完会回调Subscriber中的onNext方法。 其中的异步方式是在subscribeOn(Schedulers.io)中指定的,Schedulers.io可以理解为每次执行耗时操作都启动一个新的线程。 结构上其实和CompletableFuture很像,都是异步的执行一个耗时的操作,然后在有结果的时候主动告诉我结果。那我们还需要RxJava干嘛,不知道你有没有注意,上面的例子中其实提供2条数据流[1,2],并且处理完任何一个都会主动告诉我,当然这只是它其中的一项功能,RxJava还有很多好用的功能,在下面的内容会进行介绍。 异步观察者模式 上面这段代码有没有发现特别像设计模式中的:观察者模式;首先提供一个被观察者Observable,然后把观察者Subscriber添加到了被观察者列表中; RxJava中一共提供了四种角色:Observable、Observer、Subscriber、Subjects Observables和Subjects是两个被观察者,Observers和Subscribers是观察者; 当然我们也可以查看一下源码,看一下jdk中的Observer和RxJava的Observer jdk中的Observer: public interface Observer { void update(Observable o, Object arg); } RxJava的Observer: public interface Observer<T> { void onCompleted; void onError(Throwable e); void onNext(T t); } 同时可以发现Subscriber是implements Observer的: public abstract class Subscriber<T> implements Observer<T>, Subscription 可以发现RxJava中在Observer中引入了2个新的方法:onCompleted和onError onCompleted:即通知观察者Observable没有更多的数据,事件队列完结 onError:在事件处理过程中出异常时,onError会被触发,同时队列自动终止,不允许再有事件发出。 正是因为RxJava提供了同步和异步两种方式进行事件的处理,个人觉得异步的方式更能体现RxJava的价值,所以这里给他命名为异步观察者模式。 好了,下面正式介绍RxJava的那些灵活的操作符,这里仅仅是简单的介绍和简单的实例,具体用在什么场景下,会在以后的文章中介绍 Maven引入