Maven部分
maven入门
maven在一般场景类似于Linux系统中的rpm、yum、apt、dpkg,这样的包管理器,但是在java中也可以对项目进行管理,进行依赖关系的管理,maven托管与Apache基金会,所以我们可以在Apache官网上下载maven,下载不必阐述,配置环境变量也很轻松,和java类似,主要是配置本地依赖和maven仓库是配置部分的重点,当配置完maven后,可以在cmd中进行测试,输入mvn -version,如果显示信息,就是配置成功了。
配置
Maven配置文件的路径在maven根目录中的[conf/settings.xml],找到mirror标签,其中可以设置maven远程仓库的路径,建议使用身边(国内的中央仓库,因为稳定和快)这里提供一个阿里云的镜像仓库
<!--这个标签复制到mirros标签中间-->
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
设置本地仓库,找到local字样的标签,<localRespitory>,标签内写本地仓库的绝对路径。保存即可,例如:
<!--注意:修改自己的本地仓库路径-->
<localRepository>D:\mvn\repository</localRepository>
仓库类型:
- 本地仓库:每当你添加一个依赖,或者说是安装一个依赖,就会下载到本地仓库中,以后再使用的话,就可以从本地获取了。
- 私服仓库:这个是个人服务器,也可以是公司服务器,公司内部的提交可以通过私服让程序猿们使用
- 中央仓库:可以说有一个组织管理了大量的依赖,构建了一个仓库,里面能找到你需要的大部分依赖
添加依赖
找到IDE中的pom.xml,其中自行写入dependencies标签,里面可以写需要的jar包坐标。格式如下
<dependencies>
<dependency>
<groupId>组织名</groupId>
<artifactId>具体的包</artifactId>
<version>版本</version>
<scope>作用范围</scope>
</dependency>
</dependencies>
scope中的参数:
- provided 这个就是项目运行时候可以用,发布之后就失效了【测试时候也有效】,但是不会传递依赖
- test 仅仅在测试时候有效,经常见到的就是JUnit依赖了
- compile 整个过程中都有效
- runtime 运行时和测试时有效,没怎么见过,在运行、测试时有效,但是在编译代码时无效。
- system 编译测试时有效,运行时无效,没见过,应该和编译过程有关叭。
依赖管理器
通过依赖管理器,管理子工程的依赖,主要是管理子工程依赖的版本,子工程中仍然要写依赖,但是不需要写版本信息了。依赖管理器的标是dependencyManagement,父工程例如:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
</dependencies>
</dependencyManagement>
子工程的依赖配置:
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<!--这里不需要写版本,写的话就是写的那个版本-->
</dependency>
</dependencies>
添加插件
maven插件可以实现很多功能,例如tomcat插件,利用maven插件可以运行web应用,pom文件配置如下所示。
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!--访问的项目地址-->
<path>/</path>
<!--访问的端口号-->
<port>8080</port>
</configuration>
</plugin>
packaging标签
packaging标签表示的时打包方式,也就是当前项目属于那种类型的项目,当你看到属性值也就理解了这个标签的含义了。
- pom 也就是这个最终生成的时依赖文件,一般工程当作父工程时候这么写。
- war 打包成web应用
- jar 最终生成的时jar包
maven传递依赖
如果一个项目依赖另一个项目,会把provided和test以外的依赖间接的依赖过来,就像文件上传的jar需要依赖IO相关的jar文件一样。
如果子工程不想依赖,可以通过exclusions标签解除依赖关系,例如:
<exclusions>
<exclusion>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
</exclusion>
</exclusions>
如果有相同依赖,但是版本不同,会选择路径较短的那个,如果一样长,那就默认是最后依赖的那个。
maven命令
clean :清除target目录,有时候maven抽风,编译后出现稀奇古怪的问题,clean可能就好了
install : 把当前项目安装到本地仓库
compile : 编译当前项目
test : 走test中的所有合法的测试方法
package :将项目工程打包
依赖版本统一管理
例如后面的spring框架,需要把所有模块进行版本统一,一个一个写或者是改,就很麻烦了,所以可以使用properties标签
<properties>
<spring.version>5.3.4</spring.version>
</properties>
然后再version里可以使用el表达式进行上面定义的填充,例如:
<version>${spring.version}</version>
父-子工程
通过IDEA可以方便的创建父子工程,但是父工程的packaging需要以pom形式打包,然后执行install,放到本地仓库中,然后创建一个maven工程,pom中会自动生成父工程的指向配置。如下所示
<parent>
<!--设置父工程的坐标-->
<groupId>父工程组织名</groupId>
<artifactId>父工程包名</artifactId>
<version>父工程版本</version>
<!--相对路径:父工程的pom.xml-->
<relativePath>父工程的pom文件,这样能解决爆红问题,实际上应该没什么作用。</relativePath>
</parent>
maven聚合工程
maven聚合就是一个maven工程中,通过父子工程实现一个大型工程,子项目是父工程的模块,父工程用pom形式打包,在当前的工程中创建module,属于包含的关系,通常使用依赖管理器进行管理依赖。例如我做一个商城系统,这个商城系统就是一个父工程,子工程是登录模块,订单模块,商品模块,管理模块等等。。。
异常
web项目运行时报错500-- * * * * is not a servlet
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope> <!--这个地方是不是provided,因为项目中已经包含了servletapi,这个只是在编译过程中用到了,运行时环境存在,所以冲突了。-->
</dependency>
编译过程中编译失败,版本相关问题,internal java compiler error,或者是需要1.8
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>utf-8</encoding>
</configuration>
</plugin>
</plugins>
</build>

评论 0
还没有评论,来说点什么吧。