Java学习笔记-Day77 Maven(一)
一、Maven简介
Maven是一个Java项目管理和构建工具,它可以定义项目结构、项目依赖,并使用统一的方式进行自动化构建,是Java项目不可缺少的工具。
一个使用Maven管理的普通的Java项目,它的目录结构默认如下:
a-maven-project
├── pom.xml
├── src
│ ├── main
│ │ ├── java
│ │ └── resources
│ └── test
│ ├── java
│ └── resources
└── target
项目的根目录a-maven-project是项目名,它有一个项目描述文件pom.xml,存放Java源码的目录是src/main/java,存放资源文件的目录是src/main/resources,存放测试源码的目录是src/test/java,存放测试资源的目录是src/test/resources。最后,所有编译、打包生成的文件都放在target目录里。这些就是一个Maven项目的标准目录结构。
所有的目录结构都是约定好的标准结构,千万不要随意修改目录结构。使用标准结构不需要做任何配置,Maven就可以正常使用。
二、Maven的安装和配置
(1)安装 Apache Maven 在Windows 系统上,需要下载 apache maven 的压缩包,并解压到你想安装的目录中。(Maven 3.2 要求 JDK 1.6 或以上版本, 而 Maven 3.0/3.1 需要 JDK 1.5 或以上)
(2)配置Maven的环境变量:添加 M2_HOME 和 MAVEN_HOME 环境变量到 Windows 环境变量,并将其指向你的 Maven 文件夹。添加 Maven 的 bin 文件夹到 PATH 中,如:%M2_HOME%\bin
。
(3)在DOS命令窗口中使用 mvn –version 命令验证是否安装成功。
三、Eclipse中配置Maven环境
(1)点击window -> 点击preferences -> 搜索Maven -> 点击Installations -> 点击Add -> 点击Directory -> 选择Maven 的文件夹 -> 点击Finish ->apache-maven 打钩 -> 点击Apply And Close。
(2)进入 User Settings,User Settings 中的 settings.xml 为 maven 的配置文件,Local Repostiory 是 maven 存放 jar 文件的仓库。这些使用默认的配置即可,不用修改。
四、Eclipse创建Maven项目
(1) 点击 File -> 点击 New -> 点击 Other -> 点击 Maven Project -> 点击 Next -> 选择 Use default Workspace loation -> 点击 Next -> Artifact Id 选择 maven-archetype-webapp -> 点击 Next -> 提供 Group Id(包名)、Artifact Id(项目名)和 version ,这些参数是项目可交付成果(jar/war/ear …) 在存储库中的唯一标识 -> 点击 Finish。
(2)项目名右键 -> 点击Properties -> 点击Project Facets -> 修改 Dynamic Web Module 为3.0、Java 为1.8 -> 选择 Apache Tomcat v9.0 -> 点击Apply。
(3)点击Java Compiler -> 修改Compiler compliance level 为1.8。
(4)删除项目中的WebContent目录,使用src\main\webapp目录代替WebContent目录。进入 Deployment Assembly,remove 移除/WebContent,Add -> Folder -> src\main\webapp -> 点击 Apply And Close。此时 pom.xml文件可能会报错,需要在文件中添加新的空白一行,再保存文件。
(5)通过在pom.xml添加jar包的坐标代码,下载jar包到仓库中。
- jar包的坐标代码
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
- 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.etc</groupId>
<artifactId>maven_project01</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>maven_project01 Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
<!-- 添加Spring5.1.1的核心包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.1.1.RELEASE</version>
</dependency>
<!-- 添加spring-context包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.1.RELEASE</version>
</dependency>
<!-- 添加spring-tx包 事务 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.1.1.RELEASE</version>
</dependency>
<!-- 添加spring-jdbc包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.1.RELEASE</version>
</dependency>
<!-- 为了方便进行单元测试,添加spring-test包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.1.RELEASE</version>
</dependency>
<!--添加spring-web包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.1.RELEASE</version>
</dependency>
<!--添加spring-web MVC包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.1.RELEASE</version>
</dependency>
<!-- 添加servlet3.0核心包 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.2-b01</version>
<scope>provided</scope>
</dependency>
<!-- jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>mavenproject01</finalName>
</build>
</project>
(6)Run as -> Maven install(编译测试->测试->打包[war])。
(7)Run as -> Maven clean(删除Target中的一些文件)
(6)右键 -> 点击 Add And Remove -> 将项目添加到Configured中 -> 点击Finish -> 右键 -> 点击 start 运行项目。
五、Maven项目包含SSM框架集
1、Spring + SpringMVC+ Mybatis(使用Mybatis注解)
(1)添加 appliationContext.xml 到 src\main\resources 目录中。
- appliationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<context:component-scan base-package="com.etc"></context:component-scan>
<!-- 读取的是db.properties中的数据库连接信息 -->
<context:property-placeholder location="classpath:db.properties" />
<!-- 配置sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 实例化sqlSessionFactory时需要使用上述配置好的数据源以及SQL映射文件 -->
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 配置数据源,使用的是alibaba的Druid(德鲁伊)数据源 -->
<bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="url" value="${jdbc_url}" />
<property name="username" value="${jdbc_username}" />
<property name="password" value="${jdbc_password}" />
<property name="driverClassName" value="${jdbc_driverClassName}"></property>
</bean>
<!-- 配置扫描器 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 扫描com.etc.dao这个包以及它的子包下的所有映射接口类 -->
<property name="basePackage" value="com.etc.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
</beans>
(2)添加 db.properties 到 src\main\resources 目录中。
- db.properties
jdbc_driverClassName=com.mysql.cj.jdbc.Driver
jdbc_url=jdbc:mysql://localhost:3306/mybatisdb?serverTimezone=Asia/Shanghai
jdbc_username=root
jdbc_password=root
(3)添加 springmvc.xml 到 src\main\resources 目录中。
- springmvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 组件扫描的路径,指定控制器的扫描包 -->
<context:component-scan base-package="com.etc.controller"></context:component-scan>
<!-- 视图解析器的配置 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 注入 -->
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
<!-- 视图的前缀 -->
<property name="prefix" value="/WEB-INF/jsp/"></property>
<!-- 视图的后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>
<!--静态资源的处理,我们的前端控制器不处理静态资源 ,注意,请求还是有走前端控制器,只不过不处理 -->
<mvc:default-servlet-handler/>
<!-- 这句话要加,否则控制器失效 -->
<mvc:annotation-driven></mvc:annotation-driven>
</beans>
(4)修改 src\main\webapp\WEB-INF 目录中的 web.xml 文件
- web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>Archetype Created Web Application</display-name>
<!-- 配置ContextLoaderListener监听器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:appliactionContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 配置DispatcherServlet前端过滤器 -->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
(5)在 pom.xml 中加入Spring和Mybatis以及其他相关的依赖包的坐标。
- 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.etc</groupId>
<artifactId>mavenssm01</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>mavenssm01 Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<!-- 添加Spring5.1.1的核心包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.1.1.RELEASE</version>
</dependency>
<!-- 添加spring-context包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.1.RELEASE</version>
</dependency>
<!-- 添加spring-tx包 事务 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.1.1.RELEASE</version>
</dependency>
<!-- 添加spring-jdbc包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.1.RELEASE</version>
</dependency>
<!-- 为了方便进行单元测试,添加spring-test包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.1.RELEASE</version>
</dependency>
<!--添加spring-web包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.1.RELEASE</version>
</dependency>
<!--添加spring-web MVC包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.1.RELEASE</version>
</dependency>
<!-- 添加springmvc文件上传有关jar包 commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.1</version>
</dependency>
<!-- 添加文件上传有关jar包 commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/aopalliance/aopalliance -->
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<!--添加aspectjweaver包 aop -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.5</version>
</dependency>
<!-- 添加mybatis的核心包 -->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
<!-- 添加mybatis与Spring整合的核心包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.3</version>
</dependency>
<!-- 添加servlet3.0核心包 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.2-b01</version>
<scope>provided</scope>
</dependency>
<!-- jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
<scope>provided</scope>
</dependency>
<!-- 添加mysql驱动包 -->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<!-- 添加druid连接池包 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.12</version>
</dependency>
<!-- 添加junit单元测试包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.10</version>
</dependency>
</dependencies>
<build>
<finalName>mavenssm01</finalName>
</build>
</project>
(6)entity层中:创建实体类 Blog。
- Blog.java
package com.etc.entity;
public class Blog {
private int id;
private String title;
private String content;
public Blog(int id, String title, String content) {
super();
this.id = id;
this.title = title;
this.content = content;
}
public Blog() {
super();
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return "Blog [id=" + id + ", title=" + title + ", content=" + content + "]";
}
}
(7)Dao层中:创建 BlogMapper类(包含Mybatis注解)。
- BlogMapper.java
package com.etc.dao;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import com.etc.entity.Blog;
@Repository
public interface BlogMapper {
@Select("select * from blog where blogid=#{id}")
@Results(id = "blogResultMap", value = {
@Result(property = "id", column = "blogid", id = true),
@Result(property = "title", column = "blogtitle"), @Result(property = "content", column = "blogcontent") })
public Blog selectBlog(int id);
}
(8)Service层中:创建 Service接口 和 实现类BlogServiceImpl。
- BlogService.java
package com.etc.service;
import com.etc.entity.Blog;
public interface BlogService {
public Blog selectBlog(int id);
}
- BlogServiceImpl.java
package com.etc.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.etc.dao.BlogMapper;
import com.etc.entity.Blog;
import com.etc.service.BlogService;
@Service
public class BlogServiceImpl implements BlogService {
@Autowired
private BlogMapper blogmapper;
@Override
public Blog selectBlog(int id) {
return blogmapper.selectBlog(id);
}
}
(9)Controller层中:创建 BlogController 类。
- BlogController.java
package com.etc.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import com.etc.entity.Blog;
import com.etc.service.BlogService;
@RestController
public class BlogController {
@Autowired
private BlogService blogservice;
@GetMapping("api/blog/{id}")
public Blog getBlog(@PathVariable("id") int id) {
Blog blog = blogservice.selectBlog(id);
return blog;
}
}
(10)访问地址:http://127.0.0.1:8080/mavenssm01/api/blog/1
。
2、Spring + SpringMVC+ Mybatis(使用Mybatis映射文件)
(1)步骤与Spring + SpringMVC+ Mybatis(使用Mybatis注解)一样,只是Dao层的BlogMapper接口实现方式是通过Mybatis映射文件。只需修改Dao层的文件和applicationContext.xml文件中的sqlSessionFactory的属性。
- Dao层中:修改 BlogMapper.java
package com.etc.dao;
import com.etc.entity.Blog;
public interface BlogMapper {
public Blog selectBlog(int id);
}
- Dao层中:创建 BlogMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.etc.dao.BlogMapper">
<select id="selectBlog" resultMap="blogResultMap">
select blog.blogid,blog.blogtitle,blog.blogcontent,author.authorid,author.authorname,author.authorage
from blog inner join author on blog.authorid=author.authorid where blog.blogid=#{
id}
</select>
<resultMap id="blogResultMap" type="com.etc.entity.Blog" >
<id property="id" column="blogid"/>
<result property="title" column="blogtitle"/>
<result property="content" column="blogcontent"/>
</resultMap>
</mapper>
- 修改 src\main\resources 目录中的applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<context:component-scan base-package="com.etc"></context:component-scan>
<!-- 读取的是db.properties中的数据库连接信息 -->
<context:property-placeholder location="classpath:db.properties" />
<!-- 配置sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 实例化sqlSessionFactory时需要使用上述配置好的数据源以及SQL映射文件 -->
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="classpath:com/etc/dao/*.xml" />
</bean>
<!-- 配置数据源,使用的是alibaba的Druid(德鲁伊)数据源 -->
<bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="url" value="${jdbc_url}" />
<property name="username" value="${jdbc_username}" />
<property name="password" value="${jdbc_password}" />
<property name="driverClassName" value="${jdbc_driverClassName}"></property>
</bean>
<!-- 配置扫描器 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 扫描com.etc.dao这个包以及它的子包下的所有映射接口类 -->
<property name="basePackage" value="com.etc.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
</beans>