Maven 项目管理工具
1 Maven 的简介
1.1 什么是 maven
是 apache 下的一个开源项目,是纯 java 开发,并且只是用来管理 java 项目的
1.2 Maven 好处
普通的传统项目
Maven 项目
分析:maven 项目为什么这么小?没有 jar。 需要 jar 吗?肯定需要。没有存在于 maven 项目里面,jar 存在于哪?
1.3 依赖管理
1.4 项目一键构建
编码 编译 测试(junit)运行 打包 部署
一个 tomcat:run
就能把项目运行起来
Maven 能干的事:编译 测试(junit)运行 打包 部署
1.5 小结
Maven 的好处:
1.5.1 依赖管理
就是对 jar 包的统一管理 可以节省空间
1.5.2 一键构建
1.5.3 可以跨平台
1.5.4 应用于大型项目 可以提高开发效率
分析:
用户管理 订单管理 支付管理 。
Maven 的分模块开发
互联网项目 按业务分
传统项目 按层分 entity dao service web
2 Maven 的安装配置
2.1 下载安装
从此目录中拷贝文件:
直接解压到一个没有中文没有空格的文件夹里解压后的目录如下:
Maven 软件的核心文件:
2.2 Maven 环境变量配置
1、 要配置 jdk, maven3.3.9 这个版本所需的 jdk 版本必须要 1.7 以上
2、 最终要运行的是 maven 软件中 bin 目录的 mvn 命令
所以要配置 maven 的环境变量,在系统变量添加环境变量的名称:MAVEN_HOME
变量值:就是 maven 软甲解压的目录 F:\class32\apache-maven-3.3.9
3、把 MAVEN_HOME 添加到 path 里
4、验证 maven 是否配置成功:
打开 dos 窗口 输入: mvn –v
2.3 Maven 仓库
三种仓库
1、本地仓库 自己维护
本地仓库的配置只需要修改 settings.xml 文件就可以
2、远程仓库(私服) 公司维护
3、中央仓库 maven 团队维护 两个亿
三种仓库的关系如下:
3 演示入门程序
3.1 Maven 的目录结构
3.2 Maven 的常用命令
Clean 清理编译的文件
Compile 编译了主目录的文件
Test 编译并运行了 test 目录的代码
Package 打包
Install 就是把项目发布到本地仓库
Tomcat:run 一键启动
3.3 Maven 的生命周期(了解)
Compile test package install deploy(发布到私服)
- 三种生命周期
- Clean 生命周期
- Clean
- Default 生命周期
- Compile test package install deploy
- Site 生命周期
- Site
3.4 命令和生命周期的阶段的关系
不同的生命周期的命令可以同时执行
Mvn clean package
4 项目构建
M2e 插件的安装
Maven 在 eclipse 的配置
1、选择 3.3.9 版本的 maven 软件
2、修改默认的本地仓库地址
项目构建
1、 新建 maven 项目
2、调过骨架,如果不跳过骨架选择创建出的项目目录是不全的
2、 填写坐标
3、创建工程
4、处理红色叉号
手动在 webapp 文件夹下创建一个 WEB-INF 文件夹,在里面放一个 web.xml 文件
5、处理编译版本
在 pom.xml 中添加如下代码
<build> <!-- 配置了很多插件 --> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <configuration> <source>1.7</source> <target>1.7</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build>
5、创建一个 servlet
修改 web.xml
删除重复的代码
xmlns=http://java.sun.com/xml/ns/javaee
添加 jar 包
在 pom 中添加如下代码:
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.9</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency> </dependencies>
会发现 jar 包已添加到项目中
启动项目
右击项目 run as –maven build ….
5 依赖管理
Jar 包的管理
需求:整合 struts2 页面上传一个客户 id 跳转页面
5.1 添加依赖:
打开 maven 仓库的视图:
5.2 重建索引
- 创建 maven 项目(同上)
- 跳过骨架(同上)
- 填写坐标信息(同上)
- 添加 web.xml 文件(同上)
- 修改编译版本(同上)
- 添加坐标 选择 Dependencies 标签 点击 add
7、 手动输入要添加的坐标,选择版本
8、 可以看到 pom.xml 文件中多出了如下代码
9、 同样的方式添加 servlet-api.jar 和 jsp-api.jar 注意选择 scope 为 provided
10、 写 action 代码
import com.opensymphony.xwork2.ActionSupport; public class CutomerAction extends ActionSupport { private Long custId; public Long getCustId() { return custId; } public void setCustId(Long custId) { this.custId = custId; } public String findById(){ return SUCCESS; } }
11、 添加 struts.xml 文件放到 resources 目录中
内容:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- 配置常量 --> <!-- 字符集 --> <constant name="struts.i18n.encoding" value="UTF-8"></constant> <!-- 开发模式 --> <constant name="struts.devMode" value="true"></constant> <!-- 通用 package --> <package name="customer" namespace="/" extends="struts-default"> <action name="find" class="cn.itcast.action.CutomerAction" method="findById"> <result name="success">/jsp/info.jsp</result> </action> </package> </struts>
12、 添加 jsp 页面
15、修改 web.xml 文件 添加过滤器
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
5.3 依赖范围
5.3.1 Compile struts2-core
编译(compile)时需要 测试时需要,,运行时需要,打包时需要
5.3.2 Provided jsp-api.jar servlet-api.jar
编译(compile)时需要,测试(test)时也需要 ,运行时不需要,打包时不需要
5.3.3 Runtime 数据库驱动包
编译时不需要,测试时需要,,运行时需要,打包时需要
5.3.4 Test junit.jar
编译时不需要,测试时需要,运行时不需要,打包也不需要
添加插件
Maven add plugin
如果用 tomcat7 运行用命令:
Tomcat7:run
常见问题:
6 整合 ssh 框架
6.1 依赖传递
只添加了一个 struts2-core 依赖,发现项目中出现了很多 jar,
这种情况 叫 依赖传递
6.2 依赖版本冲突的解决
1、 第一声明优先原则
<dependencies> <!-- spring-beans-4.2.4 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.2.4.RELEASE</version> </dependency> <!-- spring-beans-3.0.5 --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>2.3.24</version> </dependency>
2、 路径近者优先原则
自己添加 jar 包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
3、 排除原则
<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>2.3.24</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </exclusion> </exclusions> </dependency>
4、 版本锁定原则
<properties> <spring.version>4.2.4.RELEASE</spring.version> <hibernate.version>5.0.7.Final</hibernate.version> <struts.version>2.3.24</struts.version> </properties> <!-- 锁定版本,struts2-2.3.24、spring4.2.4、hibernate5.0.7 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> </dependencies> </dependencyManagement>
需求:
传客户 ID 页面上显示客户信息
准备数据库
6.3 构建项目
1、 创建数据库,
2、 执行准备好的 sql 脚本
Sql 脚本的位置:
3、 完善 pom.xml 文件,把 ssh 相关的依赖都添加上去
<!-- 属性 --> <properties> <spring.version>4.2.4.RELEASE</spring.version> <hibernate.version>5.0.7.Final</hibernate.version> <struts.version>2.3.24</struts.version> </properties> <!-- 锁定版本,struts2-2.3.24、spring4.2.4、hibernate5.0.7 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</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-test</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>${hibernate.version}</version> </dependency> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>${struts.version}</version> </dependency> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>${struts.version}</version> </dependency> </dependencies> </dependencyManagement> <!-- 依赖管理 --> <dependencies> <!-- spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> </dependency> <!-- hibernate --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> </dependency> <!-- 数据库驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> <scope>runtime</scope> </dependency> <!-- c3p0 --> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> </dependency> <!-- 导入 struts2 --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> </dependency> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> </dependency> <!-- servlet jsp --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency> <!-- 日志 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.2</version> </dependency> <!-- junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.9</version> <scope>test</scope> </dependency> <!-- jstl --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies> <build> <plugins> <!-- 设置编译版本为 1.7 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.7</source> <target>1.7</target> <encoding>UTF-8</encoding> </configuration> </plugin> <!-- maven 内置 的 tomcat6 插件 --> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>tomcat-maven-plugin</artifactId> <version>1.1</version> <configuration> <!-- 可以灵活配置工程路径 --> <path>/ssh</path> <!-- 可以灵活配置端口号 --> <port>8080</port> </configuration> </plugin> </plugins> </build>
4、 完成实体类代码
5、 完成 dao 代码
接口
package cn.itcast.dao; import cn.itcast.entity.Customer; public interface CustomerDao { public Customer getById(Long id); }
实现类
package com.itcast.dao.impl; import org.springframework.orm.hibernate5.support.HibernateDaoSupport; import cn.itcast.dao.CustomerDao; import cn.itcast.entity.Customer; public class CustomerDaoImpl extends HibernateDaoSupport implements CustomerDao { @Override public Customer getById(Long id) { return this.getHibernateTemplate().get(Customer.class, id); } }
6、 完成 service 代码
接口
package com.itcast.service; import cn.itcast.entity.Customer; public interface CustomerService { public Customer getById(Long id); }
实现类
package com.itcast.service.impl; import com.itcast.service.CustomerService; import cn.itcast.dao.CustomerDao; import cn.itcast.entity.Customer; public class CustomerServiceImpl implements CustomerService { private CustomerDao customerDao; public void setCustomerDao(CustomerDao customerDao) { this.customerDao = customerDao; } @Override public Customer getById(Long id) { return customerDao.getById(id); } }
7、 完成 action 代码
package cn.itcast.action; import com.itcast.service.CustomerService; import com.opensymphony.xwork2.ActionSupport; import cn.itcast.entity.Customer; public class CutomerAction extends ActionSupport { //两个成员变量 private Customer customer; private Long custId; public Customer getCustomer() { return customer; } public void setCustomer(Customer customer) { this.customer = customer; } private CustomerService customerService; public void setCustomerService(CustomerService customerService) { this.customerService = customerService; } public Long getCustId() { return custId; } public void setCustId(Long custId) { this.custId = custId; } public String findById(){ customer = customerService.getById(custId); return SUCCESS; } }
8、 拷贝配置文件并修改
从如下图位置拿到配置文件
放入到 src/main/resources 目录中
修改内容 略
9、 修改 web.xml 添加 spring 的监听
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param>
10、 运行项目
7 分模块开发
依赖范围对依赖传递造成的影响(了解)
父工程来管理 聚合
7.1 创建父工程:
1、选择 pom
2、创建出的父工程如下
3、在 pom.Xml 中添加以下信息:
<!-- 属性 --> <properties> <spring.version>4.2.4.RELEASE</spring.version> <hibernate.version>5.0.7.Final</hibernate.version> <struts.version>2.3.24</struts.version> </properties> <!-- 锁定版本,struts2-2.3.24、spring4.2.4、hibernate5.0.7 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</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-test</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>${hibernate.version}</version> </dependency> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>${struts.version}</version> </dependency> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>${struts.version}</version> </dependency> </dependencies> </dependencyManagement> <!-- 依赖管理 --> <dependencies> <!-- spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> </dependency> <!-- hibernate --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> </dependency> <!-- 数据库驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> <scope>runtime</scope> </dependency> <!-- c3p0 --> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> </dependency> <!-- 导入 struts2 --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> </dependency> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> </dependency> <!-- servlet jsp --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency> <!-- 日志 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.2</version> </dependency> <!-- junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.9</version> <scope>test</scope> </dependency> <!-- jstl --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies> <build> <plugins> <!-- 设置编译版本为 1.7 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.7</source> <target>1.7</target> <encoding>UTF-8</encoding> </configuration> </plugin> <!-- maven 内置 的 tomcat6 插件 --> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>tomcat-maven-plugin</artifactId> <version>1.1</version> <configuration> <!-- 可以灵活配置工程路径 --> <path>/ssh</path> <!-- 可以灵活配置端口号 --> <port>8080</port> </configuration> </plugin> </plugins> </build>
4、发布到本地仓库
dao service web
7.2 创建 dao 子模块
1、在 ssh-parent 项目上右击 ,创建时选择 Maven Module
2、填写子模块名称 ssh-dao
3、把属于 dao 的代码拷贝到 该模块中:
4、完成后发布到本地仓库中
7.3 创建 service 子模块
1、创建方式如上:
2、把属于 service 的代码拷贝到该工程中
3、发布到本地仓库中
7.4 创建 Action 子模块
1、选择 war 的打包方式
5、 拷贝属于 action 的代码和配置文件
6、 修改 web.xml 添加 spring 监听
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:applicationContext-*.xml</param-value> </context-param>
4、添加页面:
8 私服 nexus
安装 nexus
启动服务
启动失败的解决方法:
登录 nexus
用户名/密码 admin/admin123
仓库类型
Virtual 虚拟仓库
Proxy 代理仓库
Hosted 宿主仓库 本地仓库
Group 组
需求:
把 dao 放到私服上,然后 service 从私服上下载
需求 :将 ssh_dao 的这个工程打成 jar 包,并放入到私服上去.
8.1 上传 dao
第一步: 需要在客户端即部署 dao 工程的电脑上配置 maven 环境,并修改 settings.xml 文件,配置连接私服的用户和密码 。
此用户名和密码用于私服校验,因为私服需要知道上传都 的账号和密码 是否和私服中的账号和密码 一致。
<server> <id>releases</id> <username>admin</username> <password>admin123</password> </server> <server> <id>snapshots</id> <username>admin</username> <password>admin123</password> </server>
第二步: 配置项目 pom.xml
配置私服仓库的地址,本公司的自己的 jar 包会上传到私服的宿主仓库,根据工程的版本号决定上传到哪个宿主仓库,如果版本为 release 则上传到私服的 release 仓库,如果版本为 snapshot 则上传到私服的 snapshot 仓库。
<distributionManagement > <repository> <id>releases</id> <url> http://localhost:8081/nexus/content/repositories/releases/</url> </repository> <snapshotRepository> <id>snapshots</id> <url> http://localhost:8081/nexus/content/repositories/snapshots/</url> </snapshotRepository> </distributionManagement>
注意:pom.xml 这里<id> 和 settings.xml 配置 <id> 对应!
第三步:执行 deploy 命令发布到私服
8.2 下载 dao
第一步 修改 settings.xml
<profile> <!--profile 的 id--> <id>dev</id> <repositories> <repository> <!--仓库 id,repositories 可以配置多个仓库,保证 id 不重复--> <id>nexus</id> <!--仓库地址,即 nexus 仓库组的地址--> <url> http://localhost:8081/nexus/content/groups/public/</url> <!--是否下载 releases 构件--> <releases> <enabled>true</enabled> </releases> <!--是否下载 snapshots 构件--> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <!-- 插件仓库,maven 的运行依赖插件,也需要从私服下载插件 --> <pluginRepository> <!-- 插件仓库的 id 不允许重复,如果重复后边配置会覆盖前边 --> <id>public</id> <name>Public Repositories</name> <url> http://localhost:8081/nexus/content/groups/public/</url> </pluginRepository> </pluginRepositories> </profile> <activeProfiles> <activeProfile>dev</activeProfile> </activeProfiles>
第二步 删除本地仓库中的 dao
第三步 update service 工程,出现以下信息说明已经成功
9 Maven 项目常见问题
1. 在 Maven 项目使用 Dubbo 和 Zookeeper 搭建分布式架构时,debug 显示找不到源码。
问题详述:使用 Dubbo 将 web 项目和 Service 项目分离,通过 Dubbo 架构进行通信,那么如果我们在 Service 层打断点,然后通过浏览器访问 Web 层,Service 层的断点有反应,但会显示找不到源码
解决方案:将与 Service 子项目相关的项目全部添加到源码当中。
2. 在使用 Dubbo 分布式架构时,Debug 会抛超时异常。
这是因为 dubbo 默认连接时间为 1000ms,超过 1000ms 就会抛出超时异常,如果超时 Dubbo 会默认尝试三次,如果都失败则不再进行。
解决方案:
但在 Debug 模式下 1S 中显然不够,我们需要将时间延迟,我们只需要在服务调用者的配置文件中加入 timaout 属性,指定超时时间即可。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
下一篇: 谈谈自己对于 AOP 的了解
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论