创建Maven工程
在Eclipse中配置Maven
1.指定Maven核心程序的位
Window→Preferences→Maven→Installations --(Installation home:D:\apache-maven-3.2.2)
2.指定settings.xml
Window→Preferences→Maven→User Settings --(Global Setting:D:\apache-maven-3.2.2\conf\settings.xml)
自动查找settings.xml中Local Repository:(D:\RepMaven)
修改工程默认的JDK版本:
D:\apache-maven-3.2.2\conf\settings.xml下
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
创建Maven项目
new→New Maven project(勾选Create a simple project,然后next)
→Artifact下(Group Id:com.atguigu.maven ; Artifact Id:MakeFriend,然后finish)
导入 Maven工程:
如果第一次导入手动创建的Maven工程:
Import→Maven→Existing Maven Project(next)→Root Directory:直接选择工作空间(会自动扫描,勾选后,Finish)
导入后HelloFriend工程,目录:D:\SpringToolSuite\HelloFriend下
会多出:
.settings
.classpath
.project
如果导入通过Eclipse创建的Maven工程:
可以Import→General→Existing Projects into Workspace
运行Maven工程
工程右键Run As,可选build:
1.Maven build
2.Maven build...
3.Maven clean --清理
4.Maven generate-sources
5.Maven install --安装
6.Maven test --测试
如果没有想要的命令:可以选择2.Maven build...,Main中(Goals:compile)点击Run
解决项目测试乱码问题:
在当前项目的pom.xml文件中增加插件配置
<build>
<plugins>
<!-- 解决maven test命令时console出现中文乱码乱码 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.7.2</version>
<configuration>
<forkMode>once</forkMode><!--在一个进程中进行所有测试 ; 默认值:once -->
<argLine>-Dfile.encoding=UTF-8</argLine>
</configuration>
</plugin>
</plugins>
</build>
Maven项目依赖的范围
1) compile
[1]main目录下的Java代码可以访问这个范围的依赖
[2]test目录下的Java代码可以访问这个范围的依赖
[3]部署到Tomcat服务器上运行时要放在WEB-INF的lib目录下
例如:对Hello的依赖。主程序、测试程序和服务器运行时都需要用到。
2) test
[1]main目录下的Java代码不能访问这个范围的依赖
[2]test目录下的Java代码可以访问这个范围的依赖
[3]部署到Tomcat服务器上运行时不会放在WEB-INF的lib目录下
例如:对junit的依赖。仅仅是测试程序部分需要。
3) provided
[1]main目录下的Java代码可以访问这个范围的依赖
[2]test目录下的Java代码可以访问这个范围的依赖
[3]部署到Tomcat服务器上运行时不会放在WEB-INF的lib目录下
例如:servlet-api在服务器上运行时,Servlet容器会提供相关API,所以部署的时候不需要。
4)runtime
[1]main目录下的Java代码不能访问这个范围的依赖
[2]test目录下的Java代码可以访问这个范围的依赖
[3]部署到Tomcat服务器上运行时要放在WEB-INF的lib目录下
其他:import、system等。
Maven项目依赖的传递性
当存在间接依赖的情况时,主工程对间接依赖的jar可以访问吗?这要看间接依赖的jar包引入时的依赖范围——只有依赖范围为compile时可以访问。
Maven项目依赖的原则:解决jar包冲突
1) 路径最短者优先
2) 路径相同时先声明者优先
这里“声明”的先后顺序指的是dependency标签配置的先后顺序。
Maven依赖的排除
1) 有的时候为了确保程序正确可以将有可能重复的间接依赖排除。请看如下的例子:
假设当前工程为public,直接依赖environment。environment依赖commons-logging的1.1.1对于public来说是间接依赖。
当前工程public直接依赖commons-logging的1.1.2
加入exclusions配置后可以在依赖environment的时候排除版本为1.1.1的commons-logging的间接依赖
在public项目的pom.xml文件中增加插件配置
<dependency>
<groupId>com.atguigu.maven</groupId>
<artifactId>Environment</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 依赖排除 -->
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.2</version>
</dependency>
public在依赖Environment时排除他的依赖的commons-logging1.1.1版本,public再依赖commons-logging1.1.2版本
Maven统一管理目标jar包的版本
问题是如果我们想要将这些jar包的版本统一升级为4.1.1,统一配置的方式
<properties>
<spring.version>4.1.1.RELEASE</spring.version>
</properties>
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency>
Maven项目更新:
Maven→Update Project
Maven继承
为什么需要继承机制?
由于非compile范围的依赖信息是不能在“依赖链”中传递的,所以有需要的工程只能单独配置。例如:
Hello |
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.0</version> <scope>test</scope> </dependency> |
HelloFriend |
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.0</version> <scope>test</scope> </dependency> |
MakeFriend |
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.0</version> <scope>test</scope> </dependency> |
此时如果项目需要将各个模块的junit版本统一为4.9,那么到各个工程中手动修改无疑是非常不可取的。使用继承机制就可以将这样的依赖信息统一提取到父工程模块中进行统一管理。
创建父工程
创建父工程和创建一般的Maven工程操作一致,唯一需要注意的是:打包方式处要设置为pom
在父工程中管理依赖
将Parent项目中的dependencies标签,用dependencyManagement标签括起来
<!-- 通过继承管理依赖 --> <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.9</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement>
在子工程中引用父工程
<parent>
<!-- 父工程坐标 -->
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<relativePath>从当前目录到父项目的pom.xml文件的相对路径</relativePath>
</parent>
<!-- 配置父工程 --> <parent> <groupId>com.atguigu.maven</groupId> <artifactId>Parent</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- 从当前工程出发查询父工程中的pom.xml文件的相对路径 --> <relativePath>../Parent/pom.xml</relativePath> </parent>
此时如果子工程的groupId和version如果和父工程重复则可以删除。
<!-- <groupId>com.atguigu.maven</groupId> --> <artifactId>MakeFriend</artifactId> <!-- <version>0.0.1-SNAPSHOT</version> -->
在子项目中重新指定需要的依赖,删除范围和版本号
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <!-- <version>4.0</version> --> <scope>test</scope> </dependency>
Maven项目聚合:
为什么要使用聚合?
将多个工程拆分为模块后,需要手动逐个安装到仓库后依赖才能够生效。修改源码后也需要逐个手动进行clean操作。而使用了聚合之后就可以批量进行Maven工程的安装、清理工作。
如何配置聚合?
在总的聚合工程Parent中使用modules/module标签组合,指定模块工程的相对路径即可
<!-- 聚合 --> <modules> <module>../MakeFriend</module> <module>../OurFriend</module> <module>../HelloFriend</module> <module>../Hello</module> </modules>
结果:
[INFO] Parent ............................................. SUCCESS [ 0.254 s] --因为是所有子工程的父工程,所以先
[INFO] Hello .............................................. SUCCESS [ 1.268 s] --因为HelloFriend 和MakeFriend 依赖Hello ,所以先
[INFO] HelloFriend ........................................ SUCCESS [ 0.674 s] --因为MakeFriend 依赖HelloFriend ,所以先
[INFO] OurFriend .......................................... SUCCESS [ 0.035 s] --因为MakeFriend 依赖OurFriend,所以先
[INFO] MakeFriend ......................................... SUCCESS [ 0.075 s] --因为没有被依赖所以最后,如果都没有相互依赖,按pox.xml中的顺序
Maven项目的Web工程
创建Maven的Web工程和创建一般的Maven工程操作一致,唯一需要注意的是:打包方式处要设置为war
但项目中的pom.xml会报错,
解决办法:项目右键属性→Project Facets,把Dynamic Web Module勾去掉,告诉Eclipse不是一个Web工程,点击Apply应用
然后再把Dynamic Web Module勾选上,下方出现Further configuration available,点击应用并关闭