目录
Maven 自动化构建工具
Maven简介
Maven的核心概念
maven约定的目录结构
仓库
POM文件
生命周期、命令、插件
Maven在IDEA中的应用
IDEA集成maven
IDEA创建Maven版java工程
IDEA创建Maven版web工程
IDEA中导入Maven工程(module)
依赖管理
Maven常用设置
maven相关资料放入评论区,需要的自提!
Maven 自动化构建工具
Maven简介
-
完成一个java项目,需要做哪些工作?
-
分析项目要做什么,知道项目由哪些组成部分。
-
设计项目,通过哪些步骤,使用哪些技术,需要多少人,多长时间......
-
组件团队,招人,购置设备,服务器,软件,笔记本......
-
开发人员编写代码。开发人员需要测试自己的代码,重复多次的工作。
-
测试人员测设项目功能是否符合要求。过程:测试开发人员提交代码,如果测试有问题,需要开发人员修改,开发人员再提交代码给测试人员,测试人员再测试代码,如果还有问题,再提交给开发人员,开发人员再提交,再测试......直到测试代码通过。
-
-
传统开发项目的问题(没有使用maven管理的项目)
-
很多模块之间由联系,手动管理关系比较繁琐。
-
需要很多第三方功能,需要很多jar文件,需要手工从网络中获取各个jar文件。
-
需要管理jar的版本。
-
管理jar文件之间的依赖,如果项目中的a.jar文件需要使用b.jar文件中的类,必须首先获取到b.jar文件才可以使用a.jar。a.jar需要b.jar这个关系叫做依赖。如果你的项目要使用mysql的驱动,则叫做项目依赖mysql驱动。
-
-
改进项目的开发和管理需要使用maven
-
maven可以管理jar文件
-
自动下载jar和他的文档、源代码
-
管理jar之间的依赖,a.jar需要b.jar,maven会自动下载b.jar
-
管理你需要的jar的版本
-
帮你编译程序,把java编译为class
-
帮你测试你的代码是否正确
-
帮你打包文件,形成jar文件,或者war文件
-
帮你部署项目
-
-
项目的构建,项目的构建是指将源代码和相关资源文件转换为可执行的应用程序或库的过程。maven支持的构建包括有:
-
清理:把之前项目编译的东西删除掉,为新的编译代码做准备。
-
编译:把程序源代码编译为执行代码(将Java文件编译为class文件),maven可以同时把成千上万的文件编译为class文件,javac一次只能编译一个文件。
-
测试:maven可以执行测试程序代码,验证你的功能是否正确。maven可以同时执行多个测试代码,同时测试很多功能。
-
报告:生成测试结果文件。
-
打包:把你的项目中所有的class文件、配置文件等所有的资源放到一个压缩文件中。通常java程序的压缩文件的扩展名是.jar,web应用的压缩文件的扩展名是.war。
-
安装:将打包生成的文件jar、war安装到本地仓库。
-
部署:把程序安装好可以执行。
-
-
maven核心概念
-
POM(项目对象模型):一个文件,名称是pom.xml。控制maven构建项目的过程,管理jar依赖。maven把一个项目一个模型使用。
-
约定目录结构:maven项目的目录和文件的位置都是规定的。
-
坐标:是一个唯一的字符串,用来表示资源的。
-
依赖管理:管理项目可以使用的jar文件。
-
仓库管理(了解):资源存放的位置。
-
生命周期(了解):maven工具构建项目的过程。
-
插件和目标(了解):执行maven构建的时候用的插件。
-
继承
-
聚合
-
-
学习maven的时候,是先难后易的。
-
难:使用maven的命令,命令不容易记忆。
-
易:再idea中可以直接使用maven,代替命令。
-
-
maven工具的安装和配置
-
从maven官网下载maven的安装包 apache-maven-3.3.9-bin.zip
-
解压安装包到一个非中文目录
-
bin:执行程序的目录,主要是mvn.cmd
-
conf:maven工具本身的配置文件 settings.xml
-
-
配置环境变量:在系统的环境变量中,指定一个M2_HOME的名称, 指定它的值是maven工具安装目录,bin之前的目录。
M2_HOME=D:\maven_work\apache-maven-3.3.9
再把M2_HOME加入到path之中,在所有路径之前加入
%M2_HOME%\bin
-
验证,新的命令行里,执行
C:\Users\Administrator>mvn -v
。注意:需要配置JAVA_HOME,指定JDK路径。
出现如下内容,maven安装,配置正确。
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00) Maven home: D:\maven_work\apache-maven-3.3.9 Java version: 1.8.0_131, vendor: Oracle Corporation Java home: D:\java\JDK\jre Default locale: zh_CN, platform encoding: GBK OS name: "windows 10", version: "10.0", arch: "amd64", family: "dos"
-
Maven的核心概念
maven约定的目录结构
约定是大家都要遵循的一个规则
Hello 根目录,也就是项目名
|---src 源代码
|---|---main 放置主程序的java代码和配置文件
|---|---|---java 程序包和包中的java文件
|---|---|---resources java程序中要使用的配置文件
|---|---test 放置测试程序代码和文件的(可以没有)
|---|---|---java 测试程序包和包中的java文件
|---|---|---resources 测试java程序中要使用的配置文件
|---pom.xml maven的核心文件(maven项目必须有)
-
第一个maven工程
-
在某个目录中创建文件夹Hello
-
在Hello中创建子文件
-
拷贝pom.xml到Hello目录和src是同级的
-
进入src目录,创建main,test目录
-
进入main目录,创建java,resources目录
-
进入java目录,创建目录 com/bjpowernode/HelloMaven.java文件
-
在HelloMaven文件中输入以下代码
package com.bjpowernode; public class HelloMaven { public int add(int n1,int n2){ return n1+n2; } public static void main(String[] args) { HelloMaven helloMaven = new HelloMaven(); int res = helloMaven.add(10, 20); System.out.printf("10+20="+res); } }
-
进入到Hello目录中,在终端执行
mvn compile
-
进入到 target/classes 目录,执行
java com.bjpowernode.HelloMaven
,出现以下截图证明运行成功。
-
-
疑问: mvn compile 编译 src/main目录下的所有java文件。
-
为什么要下载
-
maven工具执行的操作需要很多插件(java类的jar文件)完成的。
-
-
下载了什么东西
-
jar文件叫做插件,插件是完成某些功能的。
-
-
下载的东西存放到哪里了
-
默认仓库(本机仓库):
C:\Users\Administrator\.m2\repository
-
-
-
执行mvn compile,结果是在项目的根目录下生成target目录(结果目录),maven编译的java程序,最后的class文件都放在target目录中。
-
设置本机存放资源的目录位置(设置本地仓库)
-
修改maven的配置文件,进入
D:\maven_work\apache-maven-3.3.9\conf
,备份settings.xml文件。 -
打开settings.xml文件,修改 <localRepository> 指定的目录(不要使用中文目录)
D:\work\maven_work\maven_repository
-
仓库
-
仓库是是存放各种东西的,存放maven使用的jar和项目中使用的jar。
-
仓库的分类
-
本地仓库:个人计算机的文件夹,存放各种jar。
-
远程仓库:在互联网上的,使用网路才能使用的仓库。
-
中央仓库:最权威的,所有开发人员都共享使用的一个集中的仓库。中央仓库的地址:
https://repo.maven.apache.org
-
中央仓库的镜像:中央仓库的备份,在各大洲,重要的城市镜像。
-
私服:在公司内部,在局域网中使用的,不是对外使用的。
-
-
-
仓库的使用,maven仓库的使用不需要认为参与。
开发人员需要使用mysql驱动--->maven首先查本地仓库--->私服--->镜像--->中央仓库
POM文件
即Project Object Modeal项目对象模型。Maven把一个项目的结构和内容抽象成一个模型,在xml中进行声明,以方便进行构建和描述,pom.xml是Maven的灵魂。所以,maven环境搭建好之后,所有的操作和学习都是关于maven的。
-
坐标:唯一值,在互联网中唯一标识一个项目的
<groupId>公司域名的倒写</groupId> <artifactId>自定义项目名称</artifactId> <version>自定义版本号</version> https://mvnrepository.com/ 是搜索用到的中央仓库,使用groupId或者artifactId作为搜索条件。
-
packaging:打包后压缩文件的扩展名,默认是jar,web应用是war。packaging可以不写,默认是jar。
-
依赖:dependencies和dependency,相当于java代码中的import。
<dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.19</version> </dependency> </dependencies>
-
properties:设置属性
-
build:maven在进行项目的构建时,配置信息,例如指定编译java代码使用的jdk的版本等。
生命周期、命令、插件
-
maven的生命周期就是maven构建项目的过程,清理、编译、测试、报告、打包、安装、部署。
-
maven的命令:maven独立使用,通过命令完成maven的生命周期的执行(清理、编译、测试......)
mvn clean 清理(会删除原来编译和测试的目录,即target目录,但是已经install到仓库里的包不会删除) mvn compile 编译主程序(会在当前目录下生成一个target,里面存放编译主程序之后生成的字节码文件) mvn test-compile 编译测试程序(会在当前目录下生成一个target,里面存放编译测试程序之后生成的字节码文件) mvn test 测试(会编译、编译测试、生成一个目录surefire-reports,保存测试结果) mvn package 打包主程序(会编译、编译测试、测试,并且按照pom.xml配置把主程序打包生成jar包或者war包) mvn install 安装主程序(会把本工程打包,并且按照本工程的坐标保存到本地仓库中) mvn deploy 部署主程序(会把本工程打包,按照本工程的坐标保存到本地库中,并且还会保存到私服仓库中。还会自动把项目部署到 web 容器中)。
注意:执行以上命令必须在命令行进入 pom.xml 所在目录!
-
maven的插件:maven命令执行时,真正完成功能的是插件,插件就是一些jar文件,一些类。
<!-- 控制配置maven构建项目的参数设置,设置jdk的版本--> <build> <!-- 配置插件--> <plugins> <!-- 配置具体的插件--> <plugin> <groupId>org.apache.maven.plugins</groupId> <!-- 插件的名称--> <artifactId>maven-compiler-plugin</artifactId> <!-- 插件的版本--> <version>3.8.1</version> <!--配置插件的信息--> <configuration> <!-- 告诉maven 我们写的代码实在jdk1.8上编译的--> <source>1.8</source> <!-- 我们的程序应该运行在jdk1.8上--> <target>1.8</target> </configuration> </plugin> </plugins> </build>
-
单元测试:用的是junit,junit是一个专门测试的框架(工具)。junit测试的是类中的方法,每一个方法都是独立测试的。方法是测试的基本单位。
-
使用步骤
-
加入依赖,在pom.xml加入单元测试依赖
<!-- 单元测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency>
-
在maven项目中的src/test/java目录下,创建测试程序
推荐的测试类和方法: 测试类的名称:Test+要测试的类名 测试的方法名称:Test+方法名 例如要测试HelloMaven,创建测试类TestHelloMaven @Test public void testAdd(){ 测试HelloMaven的add方法是否正确 } 其中testAdd叫做测试方法,它的定义规则是: 方法必须是public 方法必须没有返回值 方法名称是自定义的,推荐是Test+方法名 在方法的上面加入@Test
-
mvn compile
编译main/java/目录下的java为class文件,同时把class拷贝到target/classes目录下面,把main/resources目录下的所有文件都拷贝到target/classes目录下。
-
Maven在IDEA中的应用
IDEA集成maven
-DarchetypeCatalog=internal,maven项目创建时,会联网下载模板文件,比较大,使用 -DarchetypeCatalog=internal,不用下载,创建maven项目速度快。
IDEA创建Maven版java工程
配置完成页面
IDEA创建Maven版web工程
配置完成页面
-
pom.xml添加tomcat依赖
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.1</version> <scope>provided</scope> </dependency>
IDEA中导入Maven工程(module)
依赖管理
-
依赖范围使用scope表示。
-
依赖的范围:compile、test、provided,默认采用compile。
-
compile test provided 对主程序是否有效 是 否 是 对测试程序是否有效 是 是 是 是否参与打包 是 否 否 是否参与部署 是 否 否 -
在项目中所用到的所有依赖(jar),必须在本地仓库中有,如果没有,必须通过maven下载。
-
servlet需要继承HttpServlet(provided),使用的HttpServlet是maven仓库中的。
-
当写好的程序放到tomcat服务器中运行时,此时你的程序中不包含servlet的jar,因为tomcat提供了servlet的jar。
Maven常用设置
maven的属性设置
-
<properties> 设置maven的常用属性
<properties> <maven.compiler.source>1.8</maven.compiler.source> 源码编译 jdk 版本 <maven.compiler.target>1.8</maven.compiler.target> 运行代码的 jdk 版本 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 项目构建使用的编码,避免中文乱码 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 生成报告的编码 </properties>
maven的全局变量
-
自定义的属性
-
在<properties>通过自定义标签声明变量(标签名就是变量值)
-
在pom.xml文件中的其它位置,使用${标签名}使用变量的值
-
-
自定义全局变量一般是定义依赖的版本号,当你的项目中要使用多个相同的版本号,先使用全局变量定义,再使用${变量名}
定义全局变量 <properties> <spring.version>4.3.10.RELEASE</spring.version> </properties> 引用全局变量 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency>
资源插件
<build>
<resources>
<resource>
<directory>src/main/java</directory><!--所在的目录-->
<includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<!—filtering 选项 false 不启用过滤器, *.property 已经起到过滤的作用了 -->
<filtering>false</filtering>
</resource>
</resources>
</build>
-
默认没有使用<resources>的时候,maven执行编译代码时,会把src/main/resources目录中的文件拷贝到target/classes目录中。对于src/main/java目录下的非java文件不处理,不会拷贝到target/calsses目录中。
-
使用<resources>的时候,对于src/main/java目录下的非java文件可以处理,可以拷贝到target/classes目录中。