项目管理工具:
构建项目使用
Ant--->Maven--->Gradle
ANT:build.xml
Maven:pom.xml
Gradle:
1:Maven的安装
-
A:解压压缩包到某一目录中。
-
B:配置环境变量
M2_HOME:D:\WorkSpace_Eclipse\apache-maven-3.2.5(类似Java_Home) path: 加入D:\WorkSpace_Eclipse\apache-maven-3.2.5\bin
-
C:cmd窗口:输出mvn -version:如果有提示信息,表示安装成功。
2:目录结构:
bin
conf目录:setting.xml:Maven的配置文件。
A:更改Maven的本地仓库的路径:
本地仓库:Maven用于存放从网络中下载的jar与插件的存放目录。
<localRepository>D:/WorkSpace_Eclipse/apache-maven-repository</localRepository>
3:Maven与IDE(MyEclipse)结合:
A:更改MyElipse的默认Maven。Preferences---->MyEclipse---->Maven--->Installing
添加本地的Maven的安装目录。
B:更改MyElipse的默认Maven。Preferences---->MyEclipse---->Maven4--->User Setting File:
更改为Maven目录的settting.xml的路径。
4:可以MyEclipse创建一个简单的Maven工程。
Java工程/WEB工程的约定:
Maven 提倡“约定优于配置”(Convention Over Configuration),这是 Maven最核心的设计理念之一。
原因之一就是使用约定可以大量减少配置。
a) 源码目录为 src/main/java/
b) 源码资源目录(配置文件)为 src/main/resources/
c) 测试目录为 src/test/java/
d) 测试资源目录为 src/test/resources/
e) 编译输出目录为 target/classes/
f) 打包方式为 jar/war
g) 包输出目录为 target/
h) 超级 pom
超级 pom 定义以上的目录结构、核心插件设定版本。Maven 设定核心插件的原因,
是防止由于插件版本的变化而造成构建的不稳定。
遵循约定虽然损失了一定的灵活性,用户不能随意安排目录结构,但是却能减少配置。
更重要的是,遵循约定能够帮用户遵循构建标准。个性往往意味着牺牲通用性,
意味着增加无谓的复杂度。
工程目录(main中的java/resource与test中的java/resource是源文件夹,不是文件夹。)
src
main
java: 放java的源文件
resources 放配置文件。
webapp
WEB-INF
web.xml
test
java 放测试javar的源文件
resources 放测试的的配置文件。
pom.xml 工程模型配置文件。
target或者target-eclipse
classes
5:用MyEclipse来创建Maven工程。
骨架(模板)
GAV(坐标)
Group Id
Java工程
1:新建一个Java Maven Project,设定相应的坐标(坐标一开始可以默认)
2:新建Maven工程时,Maven第一次会从中央仓库中下载所需要用到的jar包与插件。
中央仓库:提供Maven构建java工程所需要用到的依赖与插件。
3:Maven默认只会创建2个源文件夹。
新建Source Folder的操作,创建src/main/resources和src/test/resource两个文件夹。
4:在src/main/java下面新建包和java
5:配置文件放在src/main/resources
6:测试Java类是否正确读取配置文件。
6:镜像的设置
Maven中默认都是从中央仓库下载依赖jar包的。
更改镜像地址:setting.xml中配置镜像,加快下载的速度
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf> central不能改动。
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
Maven的依赖搜索:
https://mvnrepository.com/
7:pom.xml
坐标定义:(GAV):通过一个坐标定位到唯一的依赖。
<groupId>com.dfrz</groupId> G 公司或者组的定义。
<artifactId>Maven_01</artifactId> A 项目或者模块名称定义
<version>0.0.1-SNAPSHOT</version> V: 版本定义
GAV:坐标
SNAPSHOT--->Alpha--->Beta--->Release----GA
SNAPSHOT:内部开发版本
Alpha: 内部公测版本
Beta: 对外公开的测试版本
Release: 可以使用的版本
GA: 稳定版本
<packaging>jar</packaging> 运行maven的package命令时,该工程会打包为一个java
maven中通过GAV形成坐标。
8:坐标和依赖
//Maven工程中的依赖:从本地仓库中寻找。如果本地仓库中寻找不到,再找网络仓库(中央仓库)中寻找。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
4.1:scope取值
maven认为,程序对外部的依赖会随着程序的所处阶段和应用场景而变化,
所以maven中的依赖关系有作用域(scope)的限制。在maven中,scope包含如下的取值:
compile(编译范围)
compile是默认的范围;如果没有提供一个范围,那该依赖的范围就是编译范围。
编译范围依赖在所有的classpath中可用,同时它们也会被打包。
provided(已提供范围)
provided依赖只有在当JDK或者一个容器已提供该依赖之后才使用。
例如,如果你开发了一个web应用,
你可能在编译classpath中需要可用 的Servlet API来编译一个servlet,
但是你不会想要在打包好的WAR中包含这个Servlet API;
这个Servlet API JAR由你的应用服务器或者servlet容器提供。
已提供范围的依赖在编译classpath(不是运行时)可用。
它们不是传递性的,也不会被打包。
runtime(运行时范围)
runtime依赖在运行和测试系统的时候需要,但在编译的时候不需要。
比如,你可能在编译的时候只需要JDBC API JAR,
而只有在运行的时候才需要JDBC驱动实现。
test(测试范围)
test范围依赖 在一般的 编译和运行时都不需要,
它们只有在测试编译和测试运行阶段可用。
测试范围依赖在之前的中介绍过。
重要点:
compile/runtime/system:会进行依赖传递
provided/test: 不进行依赖传递。
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
<version>2.1.3</version>
<scope>system</scope>
<systemPath>${basedir}/lib/p6spy-2.1.3.jar</systemPath>
</dependency>
尽量少用system.
4.1:使用dependency来下载中央仓库中存在的jar
从中央仓库下载的jar,在本地仓库中存放是按照GAV的组合方式创建文件夹目录来存放。
jar包命名:artifactId + version.jar的命名方式。
4.2:中央仓库中不存在的jar,可以通过手工安装到本地仓库,然后再进行引用。
A:手工安装:
按照GAV的方式在仓库中建立对应的文件夹。
jar文件的命名:A-V.jar
B:使用命令安装。
mvn install:install-file -Dfile=D:\SoftWare_勿删\common_lib\SQLServer\sqljdbc_2005.jar -DgroupId=com.dfrz -DartifactId=sqlserver -Dversion=2005 -Dpackaging=jar -DgeneratePom=true -DcreateChecksum=true
mvn install:install-file -Dfile=C:\Users\study\Downloads\ph-bdve-5.2.7.jar -DgroupId=com.dfrz.java1903 -DartifactId=ph-bdve -Dversion=5.2.7 -Dpackaging=jar -DgeneratePom=true -DcreateChecksum=true
该命令放到cmd控制台中执行。
4.3:Maven对于工程的命令的操作。
compile
test
package:对工程打包。默认存放工程的taget目录下。
jar包的命名:artifactId-version.jar
install:将jar安装到本地仓库中。
deploy:将jar或者war包,部署到容器(Tomcat)中。
clean:清空target目录下的class
命令可以组合一起使用 package install
clean package
package install
<?xml version="1.0" encoding="UTF-8"?>
<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.dfrz.java1809</groupId>
<artifactId>Maven_Java_02</artifactId>
<version>0.0.2</version>
<packaging>jar</packaging>
<name>Maven_Java_02</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>
UTF-8
</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<maven.compiler.compilerVersion>
1.7
</maven.compiler.compilerVersion>
</properties>
<!-- 配置依赖jar包。 -->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
<scope>runtime</scope>
</dependency>
<!-- 这是原始使用system的方式
<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
<version>2.1.3</version>
<scope>system</scope>
<systemPath>
D:/SoftWare_勿删/common_lib/p6spy/p6spy-2.1.3.jar
</systemPath>
</dependency>
-->
<!-- 将p6spy安装到本地仓库的写法 -->
<dependency>
<groupId>com.dfrz</groupId>
<artifactId>p6spy</artifactId>
<version>2.1.3</version>
</dependency>
<dependency>
<groupId>com.dfrz</groupId>
<artifactId>sqlserver</artifactId>
<version>2005</version>
</dependency>
</dependencies>
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
<plugin>
<artifactId>
maven-project-info-reports-plugin
</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
5:工程中间Jar的引用
依赖冲突的问题
工程不同版本的引用
使用GVA来引用工程。/通过版本的控制
A(02) B:(03) C:(04)
log4j-1.2.11(compile) log4j-1.2.12 |
|
A
|
log4j-1.2.11
D:引入了A与B两个工程。
由于A与B都拥有log4j的版本。谁先依赖,就引入相应的jar包。
引入了B与C两个工程
根据层级来判断。B寻找到log4j只需要一级,C找到Log4j需要2级。
所以引入是B依赖的log4j的版本。
Maven自动判断
不同深度:路径优先级
相同深度:按依赖的先后顺序
手工判断(推荐):
A:排除依赖管理
<dependency>
<groupId>com.test</groupId>
<artifactId>maven_02</artifactId>
<version>0.0.1-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
B:在pom.xml中指定具体引用的版本。
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
C:通过继承的方式。在父类的pom中统一所有jar包的版本。子maven工程从父工程继承。
常用的jar引用
javax.servlet
servlet-api
2.5
provided
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- commons相关的jar包 -->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency>
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.3</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.18</version>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.6</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.3.31</version>
<exclusions>
<exclusion>
<artifactId>javassist</artifactId>
<groupId>javassist</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.11.Final</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>org.apache.openjpa</groupId>
<artifactId>openjpa-all</artifactId>
<version>2.2.0</version>
</dependency>
小知识点:
可以将Spring的版本定义为一个变量。然后在dependency中引用变量的值。
<properties>
<spring-version>4.3.0.RELEASE</spring-version>
</properties>
openjpa
<dependencies>
<dependency>
<groupId>org.apache.openjpa</groupId>
<artifactId>openjpa-all</artifactId>
<version>2.2.0</version>
</dependency>
</dependencies>