Loading... # 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远程仓库的路径,建议使用身边(国内的中央仓库,因为稳定和快)这里提供一个阿里云的镜像仓库 ```xml <!--这个标签复制到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>,标签内写本地仓库的绝对路径。保存即可,例如: ```xml <!--注意:修改自己的本地仓库路径--> <localRepository>D:\mvn\repository</localRepository> ``` 仓库类型: 1. 本地仓库:每当你添加一个依赖,或者说是安装一个依赖,就会下载到本地仓库中,以后再使用的话,就可以从本地获取了。 2. 私服仓库:这个是个人服务器,也可以是公司服务器,公司内部的提交可以通过私服让程序猿们使用 3. 中央仓库:可以说有一个组织管理了大量的依赖,构建了一个仓库,里面能找到你需要的大部分依赖 ## 添加依赖 找到IDE中的pom.xml,其中自行写入dependencies标签,里面可以写需要的jar包坐标。格式如下 ```xml <dependencies> <dependency> <groupId>组织名</groupId> <artifactId>具体的包</artifactId> <version>版本</version> <scope>作用范围</scope> </dependency> </dependencies> ``` scope中的参数: - provided 这个就是项目运行时候可以用,发布之后就失效了【测试时候也有效】,但是不会传递依赖 - test 仅仅在测试时候有效,经常见到的就是JUnit依赖了 - compile 整个过程中都有效 - runtime 运行时和测试时有效,没怎么见过,在运行、测试时有效,但是在编译代码时无效。 - system 编译测试时有效,运行时无效,没见过,应该和编译过程有关叭。 ## 依赖管理器 通过依赖管理器,管理子工程的依赖,主要是管理子工程依赖的版本,子工程中仍然要写依赖,但是不需要写版本信息了。依赖管理器的标是dependencyManagement,父工程例如: ```xml <dependencyManagement> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.49</version> </dependency> </dependencies> </dependencyManagement> ``` 子工程的依赖配置: ```xml <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <!--这里不需要写版本,写的话就是写的那个版本--> </dependency> </dependencies> ``` ## 添加插件 maven插件可以实现很多功能,例如tomcat插件,利用maven插件可以运行web应用,pom文件配置如下所示。 ```xml <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标签表示的时打包方式,也就是当前项目属于那种类型的项目,当你看到属性值也就理解了这个标签的含义了。 1. pom 也就是这个最终生成的时依赖文件,一般工程当作父工程时候这么写。 2. war 打包成web应用 3. jar 最终生成的时jar包 ## maven传递依赖 如果一个项目依赖另一个项目,会把provided和test以外的依赖间接的依赖过来,就像文件上传的jar需要依赖IO相关的jar文件一样。 如果子工程不想依赖,可以通过exclusions标签解除依赖关系,例如: ```xml <exclusions> <exclusion> <groupId></groupId> <artifactId></artifactId> <version></version> </exclusion> </exclusions> ``` 如果有相同依赖,但是版本不同,会选择路径较短的那个,如果一样长,那就默认是最后依赖的那个。 ## maven命令 clean :清除target目录,有时候maven抽风,编译后出现稀奇古怪的问题,clean可能就好了 install : 把当前项目安装到本地仓库 compile : 编译当前项目 test : 走test中的所有合法的测试方法 package :将项目工程打包 ## 依赖版本统一管理 例如后面的spring框架,需要把所有模块进行版本统一,一个一个写或者是改,就很麻烦了,所以可以使用properties标签 ```xml <properties> <spring.version>5.3.4</spring.version> </properties> ``` 然后再version里可以使用el表达式进行上面定义的填充,例如: ```xml <version>${spring.version}</version> ``` ## 父-子工程 通过IDEA可以方便的创建父子工程,但是父工程的packaging需要以pom形式打包,然后执行install,放到本地仓库中,然后创建一个maven工程,pom中会自动生成父工程的指向配置。如下所示 ```xml <parent> <!--设置父工程的坐标--> <groupId>父工程组织名</groupId> <artifactId>父工程包名</artifactId> <version>父工程版本</version> <!--相对路径:父工程的pom.xml--> <relativePath>父工程的pom文件,这样能解决爆红问题,实际上应该没什么作用。</relativePath> </parent> ``` ## maven聚合工程 maven聚合就是一个maven工程中,通过父子工程实现一个大型工程,子项目是父工程的模块,父工程用pom形式打包,在当前的工程中创建module,属于包含的关系,通常使用依赖管理器进行管理依赖。例如我做一个商城系统,这个商城系统就是一个父工程,子工程是登录模块,订单模块,商品模块,管理模块等等。。。 ## 异常 web项目运行时报错500-- * * * * is not a servlet ```xml <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 ```xml <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> ``` © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏