项目构建,编译打包
构建工具的发展:Make→Ant→Maven→Gradle
构建:以java源文件、框架配置文件、国际化i18n资源文件、jsp,HTMM,图片等资源作为“原材料”,去“生产”出一个可以运行的项目的过程。
构建~=编译,部署,搭建
编译:java源文件【xxx.java】–编译–> Class字节码文件【xxx.class】 -->交给JVM去执行
部署:一个BS项目最终运行的并不是动态web工程本身,而是这个动态web工程【编译的结果】,例如tomcat编译web工程后的文件夹。
搭建:
构建过程中的几个主要环节
①清理:删除之前的编译结果,为重新编译做好准备。
②编译:将Java源程序编译为字节码文件。
③测试:自动测试(自动调用junit程序),针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
④报告:将每一次测试后以标准的格式记录和展示测试结果。
⑤打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java工程对应jar包,Web工程对象war包。
⑥安装:Maven特定概念。将打包的结果【jar包或War包】复制到本地仓库中。
⑦部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行。
Ant
build.xml
build.xml类似于linux/unix下的makefile。
Maven 包依赖管理
服务于java平台的自动化构建工具。
maven能解决的问题:
- 一个项目就是一个工程
如果项目非常庞大,就不适合继续使用package来划分模块。最好是每一个模块对应一个项目,利于分工协作。
借助于maven就可以将一个项目拆分成多个工程。 - 项目中需要的jar包必须手动【复制】、【粘贴】到WEB-INF/lib 项目下
带来的问题:同样的jar包文件重复出现在不同的项目工程中,一方面浪费存储空间,另外也让工程比较臃肿。
借助Maven,可以将jar包仅仅保存在【仓库】中,有需要使用的工程【引用】这个文件,并不需要重复复制。 - jar包需要别人替我们准备好,或到官网下载
所有知名框架或第三方工具jar包已经按照统一规范放在了Maven的中央仓库中。 - 一个jar包依赖的其他jar包需要自己手动加到项目中
Maven会自动将被依赖的jar包导入进来。
下载安装
http://maven.apache.org/download.cgi
1)JDK安装配置环境变量
JDK 是 Maven 安装的前置条件,所以使用 java -version
确认是否已经安装了 JDK
2)下载 Maven 安装包
bin(binary) | src(source) | |
---|---|---|
tar.gz | Unix的二进制 class 文件 | Unix的Java 源文件 |
zip | Windows的二进制 class 文件 | Windows的Java 源文件 |
3)解压下载的安装包
目录 | 用途 |
---|---|
bin | Maven 运行的所有脚本。 用来配置 Java 命令,准备执行环境,然后执行 Java 命令。 |
boot | plexus-classworlds-xxx-jar 。 该文件是一个类加载器框架,相当于默认的 Java 类加载器,提供了更加丰富的语法以便配置,Maven 使用该加载器加载自己的类库。 |
conf | settings.xml |
lib | Maven运行时所需要的 Java 类库,包括Maven 依赖的第三方类库 |
4)配置环境变量
MAVEN_HOME:安装路径/bin
验证配置是否生效:cmd mvn -v
IDE配置Maven
菜单-Windows-preferences->maven->user setting setting.xml路径
pom.xml
英文全称:Project Object Model 项目对象模型
1:jar包自动引入。
2:项目管理(模块关联)。
3:模块依赖:模块之间单向依赖,不能双向依赖(类似死循环),非父子模块。
pom.xml = modelVersion + groupId + artifactId + version + 其他元素。
Maven项目 = groupId + artifactId + version = groupdId:artifactId:version。
<?xml version="1.0" encoding="UTF-8"?>
<!-- XML头,指定了该xml文档的版本和编码方式 -->
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 当前POM的版本,对于Maven 3来说,值只能是4.0.0 -->
<groupId>...</groupId>
<!-- 项目属于哪个组织,通常是组织域名的倒序;此名称是本地仓库中的路径;命名规范:项目名称,模块,子模块-->
<artifactId>...</artifactId>
<!-- 模块名称,当面项目在组织中的唯一ID -->
<version>...</version>
<!--项目当前的版本号;SNAPSHOT意为快照,说明该项目还处于开发中。-->
<dependencies>
<dependency>
<groupId>实际项目</groupId>
<artifactId>模块</artifactId>
<version>版本</version>
<type>依赖类型</type>
<scope>依赖范围:1)compile,2)test,3)runntime,4)provided,5)system</scope>
<optional>依赖是否可选</optional>
<!—主要用于排除传递性依赖-->
<exclusions>
<exclusion>
<groupId>…</groupId>
<artifactId>…</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
.......
</dependency>
<dependencies>
<name>...</name>
<!-- 项目别名 -->
<packaging>...</packaging>
<!-- 打包的格式。1)jar,2)war,3)rar -->
<parent>...</parent>
<dependencyManagement>...</dependencyManagement>
<modules>...</modules>
<properties>...</properties>
<!-- 构建过程的设置 Build Settings -->
<build>...</build>
<reporting>...</reporting>
<!-- 项目信息设置 More Project Information -->
<description>...</description>
<url>...</url>
<inceptionYear>...</inceptionYear>
<licenses>...</licenses>
<organization>...</organization>
<developers>...</developers>
<contributors>...</contributors>
<!-- 环境设置 Environment Settings -->
<issueManagement>...</issueManagement>
<ciManagement>...</ciManagement>
<mailingLists>...</mailingLists>
<scm>...</scm>
<prerequisites>...</prerequisites>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<distributionManagement>...</distributionManagement>
<profiles>...</profiles>
</project>
compile,默认的依赖范围,表示依赖需要参与当前项目的编译,后续的测试、运行周期也参与其中,是比较强的依赖。
test,表示依赖仅仅参与测试相关的工作,包括测试代码的编译和运行。比较典型的如 junit。
runntime,表示依赖无需参与到项目的编译,不过后期的测试和运行需要其参与其中。
provided,表示打包的时候可以不用包进去,别的容器会提供。和 compile 相当,但是在打包阶段做了排除的动作。
system,从参与程度上来说,和 provided 类似,但不通过 Maven 仓库解析,可能会造成构建的不可移植,要谨慎使用。
父子目录
------projectA
------projectB
-----pom.xml
------pom.xml
非父子目录
------projectA
------pom.xml
------projectB
------pom.xml
Maven在建立项目的时候是基于Maven项目下的pom.xml进行的,我们项目依赖的信息和一些基本信息都是在这个文件里面定义的。那如果当我们有多个项目要进行,这多个项目有些配置内容是相同的,有些是要彼此关联的,那如果按照传统的做法的话我们就需要在多个项目中都定义这些重复的内容。这无疑是非常耗费时间和不易维护的。好在Maven给我们提供了一个pom的继承和聚合的功能。
继承parent
项目projectA的pom.xml定义如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xxx.yyy</groupId>
<artifactId>projectA</artifactId>
<packaging>jar</packaging>
<version>1.0</version>
</project>
项目projectB继承项目projectA。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<!-- 父子目录 -->
<parent>
<groupId>com.xxx.yyy</groupId>
<artifactId>projectA</artifactId>
<version>1.0</version>
</parent>
<!-- 非父子目录 -->
<parent>
<groupId>com.xxx.yyy</groupId>
<artifactId>projectA</artifactId>
<version>1.0</version>
<relativePath>../projectA/pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.xxx.yyy</groupId>
<artifactId>projectB</artifactId>
<packaging>jar</packaging>
<version>1.0</version>
</project>
聚合modules
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tiantian.mavenTest</groupId>
<artifactId>projectA</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>projectB</module>
</modules>
</project>
聚合+继承
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tiantian.mavenTest</groupId>
<artifactId>projectB</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
<optional>true</optional>
</dependency>
</dependencies>
</project>
maven仓库
maven仓库 | conf/setting.xml | |
---|---|---|
本地/自身仓库 | local | 代码一 |
中央/maven仓库 | central | 代码二 |
远程 | remote |
代码一
<localRepository>本地maven仓库路径</localRepository>
代码二
<!--中央maven仓库-->
<repositories>
<repository>
<id>ali-maven</id>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</snapshots>
</repository>
</repositories>
<!--镜像仓库。如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。-->
<mirrors>
<!-- 给定仓库的下载镜像。 -->
<mirror>
<!-- 该镜像的唯一标识符。id用来区分不同的mirror元素。 -->
<id>planetmirror.com</id>
<!-- 镜像名称 -->
<name>PlanetMirror Australia</name>
<!-- 该镜像的URL。构建系统会优先考虑使用该URL,而非使用默认的服务器URL。 -->
<url>http://downloads.planetmirror.com/pub/maven2</url>
<!-- 被镜像的服务器的id。例如,如果我们要设置了一个Maven中央仓库(http://repo.maven.apache.org/maven2/)的镜像,就需要将该元素设置成central。这必须和中央仓库的id central完全一致。 -->
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
maven命令
mvn clean:表示运行清理操作(会默认把target文件夹中的数据清理)。
mvn clean compile:表示先运行清理之后运行编译,会将代码编译到target文件夹中。
mvn clean test:运行清理和测试。
mvn clean package:运行清理和打包。
mvn clean install:运行清理和安装,会将打好的包安装到本地仓库中,以便其他的项目可以调用。
mvn clean deploy:运行清理和发布(发布到私服上面)。