什么是maven私服?
私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的 Maven 用户使用。当 Maven 需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为 Maven 的下载请求提供服务。我们还可以把一些无法从外部仓库下载到的构件上传到私服上。
Maven 私服的 5 个特性:
1、节省自己的外网带宽:减少重复请求造成的外网带宽消耗。
2、加速 Maven 构件:如果项目配置了很多外部远程仓库的时候,构建速度就会大大降低。
3、部署第三方构件:有些构件无法从外部仓库获得的时候,我们可以把这些构件部署到内部仓库(私服)中,供内部 Maven 项目使用。
4、提高稳定性,增强控制:Internet 不稳定的时候,Maven 构建也会变的不稳定,一些私服软件还提供了其他的功能。
5、降低中央仓库的负荷:Maven 中央仓库被请求的数量是巨大的,配置私服也可以大大降低中央仓库的压力。
什么是 Maven 仓库?
Maven 的仓库只有两大类:
1、本地仓库。 2、远程仓库。
在远程仓库中又分成了 3 种:
中央仓库。
私服。
其它公共库。
Maven 会先搜索本地仓库(repository),发现本地没有然后从远程仓库(中央仓库)获取。
但中央仓库只有一个,最好从其镜象处下载。国内可以用阿里云下的服务器。【其它公共库】 也有通过 Nexus 搭建的私服进行获取的。【私服】
如何解决 jar 冲突?
遇到冲突的时候第一步,要找到 Maven 加载的到时是什么版本的 jar 包,通过们 mvn dependency:tree 查看依赖树,或者使用 IDEA Maven Helper 插件。
然后,通过 Maven 的依赖原则来调整坐标在 pom 文件的申明顺序是最好的办法,或者使用将冲突中不想要的 jar 引入的 jar 进行 掉。
简单说一下Maven 依赖原则
1、赖路径最短优先原则。
一个项目 Demo 依赖了两个 jar 包,其中 A-B-C-X(1.0) , A-D-X(2.0) 。由于 X(2.0) 路径最短,所以项目使用的是 X(2.0) 。
2、pom文 件中申明顺序优先。
如果 A-B-X(1.0) ,A-C-X(2.0) 这样的路径长度一样怎么办呢?这样的情况下,Maven 会根据 pom 文件声明的顺序加载,如果先声明了 B ,后声明了 C ,那就最后的依赖就会是 X(1.0) 。
3、覆写优先
子 pom 内声明的优先于父 pom 中的依赖。
Maven 坐标的含义?
<groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13-BETA</version>
Maven 给我们制定了一套规则 —— 使用坐标进行唯一标识。Maven 的坐标元素包括 groupId、artifactId、version、packaging、classfier 。
在我们自己开发项目的时候,也是要给我们的项目定义坐标的,这是强制性要求,只有这样,其他项目才能引用该项目的构件。
groupId :定义当前 Maven 项目隶属的实际项目。首先,Maven 项目和实际项目不一定是一对一的关系。比如 Spring FrameWork 这一实际项目,其对应的 Maven 项目会有很多,如 spring-core、spring-context 等。这是由于 Maven 中模块的概念,因此,一个实际项目往往会被划分成很多模块。其次,groupId 不应该对应项目隶属的组织或公司。原因很简单,一个组织下会有很多实际项目,如果 groupId 只定义到组织级别,而后面我们会看到,artifactId 只能定义 Maven 项目(模块),那么实际项目这个层次将难以定义。最后,groupId 的表示方式与 Java 包名的表达方式类似,通常与域名反向一一对应。上例中,groupId 为 junit ,是不是感觉很特殊,这样也是可以的,因为全世界就这么个 junit ,它也没有很多分支。
artifactId :该元素定义当前实际项目中的一个 Maven 项目(模块)。推荐的做法是使用实际项目名称作为 artifactId 的前缀。比如上例中的 junit ,junit 就是实际的项目名称,方便而且直观。在默认情况下,Maven 生成的构件,会以 artifactId 作为文件头。例如 junit-3.8.1.jar ,使用实际项目名称作为前缀,就能方便的从本地仓库找到某个项目的构件。
version :该元素定义了使用构件的版本。如上例中 junit 的版本是 4.13-BETA ,你也可以改为 4.1.2 表示使用 4.1.2 版本的 junit 。
packaging :定义 Maven 项目打包的方式,使用构件的什么包。打包方式通常与所生成构件的文件扩展名对应。如上例中没有 packaging ,则默认为 jar 包,最终的文件名为junit-4.13-BETA.jar 。当然,也可以打包成 war 等。
classifier :该元素用来帮助定义构建输出的一些附件。附属构件与主构件对应。如上例中的主构件为 junit-4.13-BETA.jar ,该项目可能还会通过一些插件生成如 junit-4.13-BETA-javadoc.jar、junit-4.13-BETA-sources.jar,这样附属构件也就拥有了自己唯一的坐标。 上述 5 个元素中:
groupId、artifactId、version 是必须定义的。 packaging 是可选的(默认为 jar )。 而 classfier 是不能直接定义的,需要结合插件使用。
Maven 常用命令
mvn compile :编译源代码。
mvn deploy :发布项目。
mvn test-compile :编译测试源代码。
mvn test :运行应用程序中的单元测试。
mvn site :生成项目相关信息的网站。
mvn clean :清除项目目录中的生成结果。 mvn package :根据项目生成的 jar/war 等。
mvn install :在本地 Repository 中安装 jar 。
mvn eclipse:eclipse :生成 Eclipse 项目文件。
mvn jetty:run 启动 Jetty 服务。
mvn tomcat:run :启动 Tomcat 服务。
mvn clean package -Dmaven.test.skip=true :清除以前的包后重新打包,跳过测试类。
用到最多的命令
mvn clean :清除 Project 中以前的编译的东西,重新再来。
mvn compile :开始编译 Maven 的 Project 。
mvn clean package :清除以前的包后重新打包。
你们项目为什么选用 Maven 进行构建?
首先,Maven 是一个优秀的项目构建工具。使用maven,可以很方便的对项目进行分模块构建,这样在开发和测试打包部署时,效率会提高很多。
其次,Maven 可以进行依赖的管理。使用 Maven ,可以将不同系统的依赖进行统一管理,并且可以进行依赖之间的传递和继承。
Maven 是什么?
Maven 主要服务于基于 Java 平台的项目构建、依赖管理和项目信息管理。
Maven 的主要功能主要分为 4 点:
依赖管理系统
多模块构建
一致的项目结构
一致的构建模型和插件机制