maven笔记(二)

来源:互联网 发布:淘宝求好评短信 编辑:程序博客网 时间:2024/06/05 21:49

依赖管理-传递依赖

传递依赖

什么是传递依赖

当A 依赖B、B依赖C,在A中导入B后会自动导入C,C是A的传递依赖,如果C依赖D则D也可能是A的传递依赖。

如:web中添加struts-spring的jar,传递依赖了spring

依赖范围对传递依赖的影响

依赖会有依赖范围,依赖范围对传递依赖也有影响,有A、B、C,A依赖B、B依赖C,C可能是A的传递依赖,如下图:

最左边一列为直接依赖,理解为A依赖B的范围,最顶层一行为传递依赖,理解为B依赖C的范围,行与列的交叉即为A传递依赖C的范围。

举例: 比如 A对 B 有 compile 依赖,B 对C有 runtime 依赖,那么根据表格所示A对C 有 runtime 依赖。

又如:dao依赖junit,scop为test,service依赖dao.

查看下图红色框内所示传递依赖范围:

所以maven-first所依赖的junit的jar没有加入到maven-web工程。 如果修改maven-first依赖junit的scop为compile,maven-first所依赖的junit的jar包会加入到maven-web工程中,符合上边表格所示,查看下图红色框内所示:

依赖版本冲突解决

问题

当一个项目依赖的构件比较多时,它们相互之前存在依赖,当你需要对依赖版本统一管理时如果让maven自动来处理可能并不能如你所愿,如下例子:

同时加入以下依赖,观察依赖:

<!-- struts2-spring-plugin依赖spirng-beans-3.0.5 -->  <dependency>  <groupId>org.apache.struts</groupId>  <artifactId>struts2-spring-plugin</artifactId>  <version>2.3.24</version>  </dependency>      <!-- spring-context依赖spring-beans-4.2.4 -->  <dependency>  <groupId>org.springframework</groupId>  <artifactId>spring-context</artifactId>  <version>4.2.4.RELEASE</version>  </dependency>

org.apache.struts依赖spirng-beans-3.0.5,spring-context依赖spring-beans-4.2.4,但是发现spirng-beans-3.0.5加入到工程中,而我们希望spring-beans-4.2.4加入工程。

依赖调解原则

maven自动按照下边的原则调解:

  1. 第一声明者优先原则

在pom文件定义依赖,先声明的依赖为准。

测试:如果将上边struts-spring-plugins和spring-context顺序颠倒,系统将导入spring-beans-4.2.4。

分析:由于spring-context在前边以spring-context依赖的spring-beans-4.2.4为准,所以最终spring-beans-4.2.4添加到了工程中。

  1. 路径近者优先原则

例如:A依赖 spirng-beans-4.2.4,A依赖B依赖 spirng-beans-3.0.5,则spring-beans-4.2.4优先被依赖在A中,因为spring-beans-4.2.4相对spirng-beans-3.0.5被A依赖的路径最近。

测试:在本工程中的pom中加入spirng-beans-4.2.4的依赖,根据路径近者优先原则,系统将导入spirng-beans-4.2.4:

<dependency>  <groupId>org.springframework</groupId>  <artifactId>spring-beans</artifactId>  <version>4.2.4.RELEASE</version>  </dependency>

排除依赖

上边的问题也可以通过排除依赖方法辅助依赖调解,如下: 比如在依赖struts2-spring-plugin的设置中添加排除依赖,排除spring-beans, 下边的配置表示:依赖struts2-spring-plugin,但排除struts2-spring-plugin所依赖的spring-beans。

<!-- struts2-spring-plugin依赖spirng-beans-3.0.5 -->  <dependency>  <groupId>org.apache.struts</groupId>  <artifactId>struts2-spring-plugin</artifactId>  <version>2.3.24</version>  <!-- 排除 spring-beans-->  <exclusions>  <exclusion>  <groupId>org.springframework</groupId>  <artifactId>spring-beans</artifactId>  </exclusion><exclusion>  <groupId>org.springframework</groupId>  <artifactId>spring-context</artifactId>  </exclusion>  </exclusions>  </dependency>

锁定版本

面对众多的依赖,有一种方法不用考虑依赖路径、声明优化等因素可以采用直接锁定版本的方法确定依赖构件的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径,以锁定的版本的为准添加到工程中,此方法在企业开发中常用。

如下的配置是锁定了spring-beans和spring-context的版本:

<dependencyManagement>  <dependencies>  <!--这里锁定版本为4.2.4 -->  <dependency>  <groupId>org.springframework</groupId>  <artifactId>spring-beans</artifactId>  <version>4.2.4.RELEASE</version>  </dependency><dependency>  <groupId>org.springframework</groupId>  <artifactId>spring-context</artifactId>  <version>4.2.4.RELEASE</version>  </dependency>  </dependencies>  </dependencyManagement>

注意:在工程中锁定依赖的版本并不代表在工程中添加了依赖,如果工程需要添加锁定版本的依赖则需要单独添加<dependencies></dependencies>标签,如下:

<dependencies>  <!--这里是添加依赖 -->  <dependency>  <groupId>org.springframework</groupId>  <artifactId>spring-beans</artifactId> </dependency><dependency>  <groupId>org.springframework</groupId>  <artifactId>spring-context</artifactId> </dependency>  </dependencies>

上边添加的依赖并没有指定版本,原因是已在<dependencyManagement>中锁定了版本,所以在<dependency>下不需要再指定版本。

maven构建ssh工程

  • 定义pom.xml文件

maven工程首先要识别依赖,web工程实现SSH整合,需要依赖struts2.3.24、 spring4.2.4、hibernate5.0.7等,在pom.xml添加工程如下依赖:

两步骤:1.锁定版本 2.添加依赖

<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.yaolong.maven</groupId>      <artifactId>maven-web</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><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></project>
  • 定义实体

    数据库就简单的一张表NEWS,新闻信息 

News.java

package com.yaolong.maven.demo.domain;public class News implements java.io.Serializable {private static final long serialVersionUID = 1L;private Integer id;private String content;private String title;public Integer getId() {return id;}public String getContent() {return content;}public String getTitle() {return title;}public void setId(Integer id) {this.id = id;}public void setContent(String content) {this.content = content;}public void setTitle(String title) {this.title = title;}}

News.hbm.xml 对应的hibernate映射文件

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Generated 2017-8-8 13:53:51 by Hibernate Tools 3.4.0.CR1 --><hibernate-mapping>    <class name="com.yaolong.maven.demo.domain.News" table="NEWS">        <id name="id" type="java.lang.Integer">            <column name="ID" />            <generator class="assigned" />        </id>        <property name="content" type="java.lang.String">            <column name="CONTENT" />        </property>        <property name="title" type="java.lang.String">            <column name="TITLE" />        </property>    </class></hibernate-mapping>
  • 定义dao

NewsDao.java

package com.yaolong.maven.demo.dao;import com.yaolong.maven.demo.domain.News;public interface NewsDao {public News findNewsById(Integer newsId);}

NewsDaoImpl.java

package com.yaolong.maven.demo.dao.impl;import org.springframework.orm.hibernate5.support.HibernateDaoSupport;import com.yaolong.maven.demo.dao.NewsDao;import com.yaolong.maven.demo.domain.News;public class NewsDaoImpl extends HibernateDaoSupport implements NewsDao {@Overridepublic News findNewsById(Integer newsId) {return this.getHibernateTemplate().get(News.class, newsId);}}
  • 定义service 接口和实现类

NewsService.java

package com.yaolong.maven.demo.service;import com.yaolong.maven.demo.domain.News;public interface NewsService {public News findNewsById(Integer newsId);}

NewsServiceImpl.java

package com.yaolong.maven.demo.service;import com.yaolong.maven.demo.dao.NewsDao;import com.yaolong.maven.demo.domain.News;public class NewsServiceImpl implements NewsService {private NewsDao newsDao;public NewsDao getNewsDao() {return newsDao;}public void setNewsDao(NewsDao newsDao) {this.newsDao = newsDao;}@Overridepublic News findNewsById(Integer newsId) {return this.newsDao.findNewsById(newsId);}}
  • 定义action
package com.yaolong.maven.demo.action;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;import com.yaolong.maven.demo.domain.News;import com.yaolong.maven.demo.service.NewsService;public class NewsAction extends ActionSupport {private static final long serialVersionUID = 1L;private News news;public News getNews() {return news;}public void setNews(News news) {this.news = news;}    private NewsService newsService;    public NewsService getNewsService() {return newsService;}public void setNewsService(NewsService newsService) {this.newsService = newsService;}//根据主键获取新闻信息public String queryNews(){String id = ServletActionContext.getRequest().getParameter("id"); news = newsService.findNewsById(Integer.valueOf(id)); return SUCCESS;}        }

queryNews.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>测试</title></head><body><!-- 从模型对象中获取属性值 -->${news.content}</body></html>
  • 配置文件 applicationContext.xml
<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:aop="http://www.springframework.org/schema/aop" 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.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx  http://www.springframework.org/schema/tx/spring-tx.xsd"><!-- 数据库连接池 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="com.mysql.jdbc.Driver" /><property name="jdbcUrl" value="jdbc:mysql://localhost:3306/hibernatedb" /><property name="user" value="root" /><property name="password" value="12345" /></bean><!-- 配置sessionFactory --><bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"><!-- 依赖dataSource --><property name="dataSource" ref="dataSource"/><!-- 创建工厂需要加载hibernate映射文件 --><property name="configLocations" value="classpath:hibernate.cfg.xml"></property></bean><!-- dao --><bean id="newsDao" class="com.yaolong.maven.demo.dao.impl.NewsDaoImpl"><property name="sessionFactory" ref="sessionFactory"/></bean><!-- service --><bean id="newsService" class="com.yaolong.maven.demo.service.NewsServiceImpl"><property name="newsDao" ref="newsDao"/></bean> <!-- action --><bean id="newsAction" class="com.yaolong.maven.demo.action.NewsAction" scope="prototype"><property name="newsService" ref="newsService"/></bean></beans>

hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?><!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration><!-- 会话工厂 --><session-factory><!-- 数据库方言,根据数据库选择 -->    <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property><!--为了方便调试是否在运行hibernate时在日志中输出sql语句 --><property name="hibernate.show_sql">true</property><!-- 是否对日志中输出的sql语句进行格式化 --><property name="hibernate.format_sql">true</property><property name="hibernate.hbm2ddl.auto">none</property><!-- 加载映射文件 --><mapping resource="com/yaolong/maven/demo/domain/News.hbm.xml"/></session-factory></hibernate-configuration>

struts.xml

<?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><!-- 主题 --><constant name="struts.ui.theme" value="simple"></constant><!-- 扩展名 --><constant name="struts.action.extension" value="action"></constant><!-- 通用package --><package name="customer" namespace="/" extends="struts-default"><action name="queryNews" class="newsAction"method="queryNews"><result name="success">/jsp/queryNews.jsp</result></action></package></struts>

log4j.properties

### direct log messages to stdout ###log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target=System.outlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n### set log levels - for more verbose logging change 'info' to 'debug' ####在开发阶段日志级别使用debuglog4j.rootLogger=debug, stdout### 在日志中输出sql的输入参数 ###log4j.logger.org.hibernate.type=TRACE

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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"id="WebApp_ID" version="2.5"><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.htm</welcome-file><welcome-file>default.jsp</welcome-file></welcome-file-list><servlet><servlet-name>servletTest</servlet-name><servlet-class>com.yaolong.maven.servlet.ServletTest</servlet-class></servlet><servlet-mapping><servlet-name>servletTest</servlet-name><url-pattern>/test</url-pattern></servlet-mapping><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><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></web-app>
  • 项目结构

运行tomcat:run命令,访问http://localhost:8081/ssh/queryNews.action?id=1 

原创粉丝点击