1. Maven学习笔记二:解决依赖版本冲突问题、将项目部署到Tomcat服务器中、分模块开发。
1.1. Maven的仓库
- 本地仓库
- 本地上没有就会去远程上找。
- 公司远程仓库(私服)
- 远程上没有,就从中央仓库上找。
- 中央仓库(Apache团队维护)
1.2. 添加依赖
- 根据需要添加相应依赖
1.3. 依赖版本冲突解决
1.3.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>
<dependencies>
- 路径最近优先原则
- 添加一个jar包就会依赖传递获取其他包,这些版本低,我们可以在pom.xml再重新声明一个高的版本。这样就会不再依赖低的版本
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
- 排除原则
- 通过添加排除属性不使用该版本
<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>
- 版本锁定原则
- 通过锁定版本实现固定版本
<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>
1.3.2. pom.xml配置SSH依赖
<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.zhangsan.shop</groupId>
<artifactId>Shop</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<!-- 属性 -->
<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>
<!-- 局部jdk配置,pom.xml中 -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</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>/shop</path>
<!-- 可以灵活配置端口号 -->
<port>8080</port>
</configuration>
</plugin>
</plugins>
</build>
</project>
1.4. 从spring容器中获取对象的方法
- 跟IO的输入输出相似。加载类里面的配置文件。
ApplicationContext app=new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
CustomerDao customerDao = (CustomerDao) app.getBean("customerDao");
1.5. 将Maven项目部署到本地Tomcat7服务器
- 在maven安装文件的services中添加tomcat7用户名和密码
<server>
<id>tomcat7</id>
<username>admin</username>
<password>password</password>
</server>
- 在tomcat的配置文件中D:\apache-tomcat-7.0.93\conf下的tomcat-users.xml的tomcat-users中配置
- 别问我为什么,我也不太懂。只不过我按照这个成功了。
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user username="admin" password="password" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-script,admin-gui"/>
- 在maven项目的pom.xml中配置tomcat插件
- 注意:我的是jdk8,tomcat版本应该是7以上版本2.2以上。否则报错。
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!-- 注意此处的url,修改成tomcat监听的端口即可 -->
<url>http://localhost:8080/manager/html</url>
<server>tomcat7</server> <!-- 此处的名字必须和setting.xml中配置的ID一致 -->
<path>/${project.artifactId}</path> <!-- 此处的名字是项目发布的工程名 -->
<server>tomcat7</server>
</configuration>
</plugin>
- 运行Maven项目
1.6. Maven分模块开发
1.6.1. 建立父模块
- 创建父模块
- 父模块结构图
1.6.2. 创建dao,service层子模块
- 在父模块基础上创建子模块
- 子模块创建
- 子模块包类型
- 将属于该层的类包添加到该层。对于配置文件里不属于该层的配置要删除。
1.6.3. Maven创建测试
-
你要测试那个类就要右键点击那个类创建测试。
-
Maven会自动将测试类创建在测试区。
-
分模块开发测试问题scope范围
service依赖dao,那么这种依赖的范围是scope=compile,如果测试dao时,测试的scope值为test,那么就会service测试人员就无法测试,因为scope为test无法传递依赖。如图:
- 解决方案是:一将scope改为compile,二自己写一个测试依赖。
1.6.4. 给Maven添加索引
- 可以参考文档:添加索引
1.6.5. Maven测试类注解方法
- 通过注解获取配置文件
@ContextConfiguration(locations= {"classpath*:applicationContext-*.xml"})
- 通过注解配置Junit4测试
@RunWith(SpringJUnit4ClassRunner.class)
- 自动匹配对象@Autowired
@Autowired
private CustomerService customerService;
- 测试@Test
@Test
public void test() {
Customer customer = customerService.findById(1L);
System.out.println("********************"+customer.getCustName());
}
1.6.6. 创建web层子模块
- 创建时包类型要选择war类型,因为这个是web包,需要配置web.xml
- 创建后第一步要配置web.xml
- 编写Action,struts.xml,配置applicationContext-action.xml
- 修改web.xml中的contextConfigLocation
- classpath*:表示所有的classpath路径。
- applicationContext-*:表示所有的applicationContext-下的文件。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext-*.xml</param-value>
</context-param>
1.7. 注意事项
- 先创建父模块,并发布到本地仓库中。
- 在创建dao模块,创建完成后,就要install一下,发布到本地仓库中
- 创建service模块,并进行install
- 创建web模块,不需要install,本层可以直接部署到tomcat运行。
2. 私服
2.1. 私服准备工作
- 下载nexus私服,安装,启动服务器。
- 登录nexus,http://localhost:8081/nexus登录密码:admin/admin123
- 仓库类型
- virtual虚拟仓库
- proxy代理仓库
- Hosted宿主仓库,本地仓库
- Group组(包含Release,Snapshots,3rd party,Central)四项。
- 私服的作用:用于分模块开发,比如说:dao层工作人员,将dao打成jar包并上传到私服,然后service开发人员,可以下载dao的jar包。
2.2. 上传
- 配置Maven的setting.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
- 用于表示上传到那个仓库,上传的链接。
<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>
- 执行deploy命令发布到私服。
2.3. 下载
- 配置setting.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 project 就会自动从私服中下载。