maven
Maven是apache公司开发的基于项目对象模型(POM) 可以通过一些描述信息来管理项目的构建、报告和文档的软件管理工具。
Maven 是用来管理项目,进行项目构建的一个软件。 java编写
项目构建流程: 1. 导入jar包 2. 配置文件 3.编写代码 4. 测试 5.部署
maven的好处
使用传统项目开发crm项目,项目大小:
同样的项目使用maven开发
同样的代码,实现功能都一样,maven项目如何做到的?可以初步推断maven项目中一定没有jar包。没有jar包的maven项目如何运行?
maven的好处如何实现
maven的两大核心:
**依赖管理:对jar包管理过程
**项目构建:项目在编码完成后,对项目进行编译、测试、打包、部署等一系列的操作都通过命令来实现
通过maven命令将web项目发布到tomcat:
maven安装、配置本地仓库
安装前提:maven程序是java开发的,它的运行依赖jdk。
maven官网下载:Maven – Download Apache Maven
目录结构:
配置环境变量
Jdk环境变量:JAVA_HOME
将maven_home环境变量配置到path环境变量中
查询maven的版本信息,验证配置成功:
配置仓库
本地仓库 :本电脑,通过setting配置
私服仓库:局域网内的服务器,通过pom文件配置
中央仓库:互联网,存放了99%的jar包
国内: 该仓库由阿里公司镜像映射【通过setting配置】
国外: 该仓库由apache公司维护 【自动找】
Maven默认的远程仓库,URL地址:http://search.maven.org/
配置maven本地仓库信息
配置国内镜像仓库
maven项目的生命周期maven的常用命令
在maven中存在“三套”生命周期,每一套生命周期相互独立,互不影响。在一套生命周期内,执行后面的命令前面操作会自动执行
CleanLifeCycle:清理生命周期
Clean
defaultLifeCycle:默认生命周期
compile,test,package,install,deploy
siteLifeCycle:站点生命周期
site
创建相关命令:
mvn archetype:generator :创建 Maven 项目
mvn eclipse:eclipse :生成 Eclipse 项目文件
clean生命周期命令
mvn clean :清除目标目录中的生成结果
default生命周期命令
mvn compile :编译源代码
mvn test : 运行应用程序中的单元测试
mvn package : 依据项目生成 jar 文件
mvn install :在本地 Repository 中安装 jar
Site生命周期命令
mvn site : 生成项目相关信息的网站
概念模型
两个核心:
**依赖管理:对jar包管理
**项目构建:通过命令进行项目构建
命令方式创建maven项目
maven创建java项目
先创建一个项目的文件夹名: 例如 maven;
在该文件夹下敲入命令
Mvn archetype:generate -DgroupId=com.kaikeba.test -DartifactId=hello -DpackageName=com.kaikeba.test -Dversion=1.0-SNAPSHOT
注意:高版本的maven不用archetype:create
原因:版本命令冲突,即在maven3.0.5以上版本舍弃了create,使用generate生成项目
maven创建web项目
mvn archetype:generate -DgroupId=com.kaikeba.test -DartifactId=helloapp -Dversion=1.0-SNAPSHOT -DarchetypeArtifactId=maven-archetype-webapp
第一次构建项目,所有依赖的jar包都要从maven的中央仓库下载,所以需要时间等待。等以后我们的本地仓库中积累了我们常用的jar包后,我们的开发将变得非常规范和方便。
在项目目录下输入
Mvn eclipse:eclipse -DdownloadSources=true
转成eclipse可以导入的maven项目
以IDE(eclipse)方式生成maven项目
安装eclipse的maven 插件
要在 eclipse 中使用 maven,首先需要安装 maven 插件。可以使用 eclipse 的更新管理器,更新地址为
http://m2eclipse.sonatype.org/update/
配置eclipse与maven相关的内容
选择window-->preferences-->输入maven
修改installations的参数值:
修改user settings参数值:
在eclipse中创建Maven项目
创建maven相关项目
右键-->new -->other... 或 直接按快捷键 ctrl +N
如果勾选,就会快速创建一个简单的项目,如果不勾选的话,得选择java项目或web项目的插件
创建java项目(不勾选Create a simple project 时)
创建web项目(不勾选 create a simple project 时)
maven项目标准目录结构
maven整合servlet
创建好的web项目,错误:
- web.xml缺失
- jdk编译版本1.5,在pom.xml中添加插件
- 创建servlet,serlvet编译报错,原因:缺失servlet-api-xx.jar包
查找依赖
注意:选择依赖选择[jar]
依赖范围(了解)
添加依赖范围:默认是compile
Provided: 运行部署到tomcat不在需要
如果将servlet-api.jar设置为compile,打包后包含serlvet-api.jar,war包部署到tomcat跟tomcat中存在servlet-api.jar包冲突。导致运行失败。
解决:
总结:如果使用到tomcat自带jar包,将项目中依赖作用范围设置为:provided,其他可以默认
运行项目
tomcat:run
调试:
Maven整合struts2
1、通过工具生成web.xml
2、添加struts2的依赖
3、创建struts.xml
4、创建action类
5、在web.xml中配置struts2框架核心过滤器
- 编写action中方法
- 在struts.xml中配置
核心pom文件解析
<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.chongshi.test</groupId>
<artifactId>hello</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<name>hello</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Ø project:pom.xml文件中的顶层元素;
Ø modelVersion:指明POM使用的对象模型的版本。这个值很少改动。
Ø groupId:指明创建项目的组织或者小组的唯一标识。GroupId是项目的关键标识,典型的,此标识以组织的完全限定名来定义。比如,org.apache.maven.plugins是所有Maven插件项目指定的groupId。
Ø artifactId: 指明此项目产生的主要产品的基本名称。项目的主要产品通常为一个JAR文件。第二,象源代码包通常使用artifactId作为最后名称的一部分。典型的 产品名称使用这个格式: <artifactId>- <version>. <extension>(比 如:myapp-1.0.jar)。
Ø version:项目产品的版本号。Maven帮助你管理版本,可以经常看到SNAPSHOT这个版本,表明项目处于开发阶段。
Ø name:项目的显示名称,通常用于maven产生的文档中。
Ø url:指定项目站点,通常用于maven产生的文档中。
Ø description:描述此项目,通常用于maven产生的文档中。
本项目的坐标信息及打包方式
【2】属性/常量配置
<properties>
<!--项目字符编码 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--自定义项目版本号-->
<spring.version>4.3.5</spring.version>
</properties>
【3】依赖配置【核心】
【4】私服配置
【5】插件配置
maven核心知识
依赖配置
依赖范围scope
scope用来控制依赖和编译,测试,运行的classpath的关系. 主要的是三种依赖关系如下:
1.compile: 默认编译依赖范围。对于编译,测试,运行三种classpath都有效
2.test:测试依赖范围。只对于测试classpath有效
3.provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api
4.runtime:运行时提供。例如:jdbc驱动
传递依赖
MakeFriends.jar直接依赖于HelloFriends.jar,而HelloFriends.jar又直接依赖于Hello.jar,那么MakeFriends.jar也依赖于Hello.jar,这就是传递性依赖,只不过这种依赖是间接依赖,如下图所示:
依赖原则:路径最短优先,第一声明顺序其次。
- 间接依赖路径最短优先原则
- 第一声明优先原则
有人就问了如果 a-b-c1.0 , d-e-c1.1 这样路径都一样怎么办?
maven会以在pom文件中申明的顺序来选版本,如果pom文件中先申明了d再申明了a,test项目最后依赖的会是c1.1
备注:遇到冲突的时候通过maven的依赖原则来调整坐标在pom文件的申明顺序是最好的办法
3.排除依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>...</groupId>
<artifactId>...</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
4版本锁定
Maven常用插件
jdk编译插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
Deploy插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>3.3</version>
<configuration>
<updateReleaseInfo>true</updateReleaseInfo>
</configuration>
</plugin>
Tomcat插件配置: 自动发布到 tomcat
步骤一:
在tomcat安装目录下找到tomcat-users.xml文件。该文件路径为【tomcat安装根目录】 /conf/
修改文件内容,增加下列内容:
tomcat 6
Java代码
- <role rolename="manager"/>
- <user username="tomcat" password="123456" roles="manager"/>
tomcat 7
Java代码
- <role rolename="manager-gui"/>
- <role rolename="manager-script"/>
- <user username="tomcat" password="123456" roles="manager-gui,manager-script"/>
步骤二:
在你的项目的pom.xml文件中,增加下列<plugin></plugin>中内容:
Java代码
- <build>
- 。。。。。
- <plugins> <plugin><groupId>org.codehaus.mojo</groupId><artifactId>tomcat-maven-plugin</artifactId><version>1.1</version><configuration><path>/test</path> <url>http://localhost:8080/manager/</url><server>tomcat</server> </configuration> </plugin>
- </plugins>
- </build>
其中username和password就是tomcat中配置的username和password。
里面的server需要在maven的配置文件settings.xml里配置如下:
<server><id>
tomcat
</id><username>
admin
</username><password>
123456
</password></server>
如果是tomcat7,url需要改成http://localhost:8080/manager/text
Jetty插件
Jetty和tomcat一样也属于web容器。Jetty做maven中做为一个插件。我们要在pom.xml中添加jetty的插件,才能调用jetty。
在<project>…</project>标签之间,插入如下信息:
<build>
<finalName>Struts2Example</finalName>
<plugins>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.10</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<stopKey>foo</stopKey>
<stopPort>9999</stopPort>
</configuration>
<executions>
<execution>
<id>start-jetty</id>
<phase>pre-integration-test</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<scanIntervalSeconds>0</scanIntervalSeconds>
<daemon>true</daemon>
</configuration>
</execution>
<execution>
<id>stop-jetty</id>
<phase>post-integration-test</phase>
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
在项目目录下执行mvn jetty:jetty
等插件下载完成后就可以运行jetty了,运行命令:mvn jetty:run
通过maven整合SSH框架(重点)
搭建struts2环境
- 创建strut2配置文件:struts.xml
- 在web.xml中配置strut2的核心过滤器
-
<!-- 配置Struts核心过滤器 --> <filter> <filter-name>struts</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
搭建spring环境
- 创建spring配置文件applicationContext.xml
- 在web.xml中配置监听器:ContextLoaderListener
<!-- 配置监听器:默认加载WEB-INF/applicationContext.xml -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 通过上下文参数指定spring配置文件路径 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
搭建Hibernate环境
- 创建Hibernate核心配置文件
<?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">update</property>
</session-factory>
</hibernate-configuration>
Struts2跟spring整合
整合关键点:action对象创建,交给spring创建
- 创建action类
- 将action对象配置到spring配置文件中
- 在struts.xml中在action节点中class属性配置为spring工厂中action对象bean的id
Spring跟Hibernate框架整合
整合关键点:1、数据源dataSource交给spring 2、SessionFactory对象创建交给spring创建 3、事务管理
- 配置dataSource
<!-- 加载属性文件 -->
<context:property-placeholder location="classpath:db.properties"/>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
- 配置SessionFactory对象
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocations" value="classpath:applicationContext.xml"></property>
</bean>
- 事务管理
- 配置事务管理器: PlatFormTransactionManager:接口
- Jdbc:DataSourceTransactionManager
- Hibernate:HibernateTransactionManager
- 配置事务管理器: PlatFormTransactionManager:接口
<!-- 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- xml方式管理事务 -->
<!-- 配置通知:具体增强逻辑 -->
<tx:advice id="txAdvice">
<tx:attributes>
<!-- 匹配业务类中方法名称 -->
<tx:method name="save*" />
<tx:method name="update*" />
<tx:method name="delete*" />
<tx:method name="find*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!-- 配置aop -->
<aop:config>
<!-- 配置切点:具体哪些方法要增强(真正被增强的方法)-->
<aop:pointcut expression="execution(* cn.itcast.service.*.*(..))" id="cut"/>
<!-- 配置切面:将增强逻辑作用到切点 (通知+切入点) -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="cut"/>
</aop:config>
<!-- xml方式管理事务 -->
需求
在地址栏输入action请求:http://locahost:8080/project/customerAction_findOne.action?custId=1,action-service-dao。完成客户查询
具体实现
- 创建客户实体类、映射文件、将映射文件引入Hibernate核心配置文件中
- 创建action、service、dao。完成注入
- 在类中添加属性生成set方法
- 在spring配置文件中完成注入
3.在struts.xml中配置action,配置结果视图
总结:
- 页面提交参数,在服务端action接收参数 参
- 调用业务层方法—》dao的方法—》DB 调
- 将返回的数据存值栈 存
- 配置结果视图,跳转页面 转
通过maven对项目进行拆分、聚合(重点)
对现在已有maven ssh项目进行拆分,拆分思路:将dao层的代码已经配置文件全体提取出来到一个表现上独立的工程中。同样service、action拆分。
ssh-parent: 父工程
ssh-dao:(子模块)
ssh-service
ssh-web
拆分完成对拆分后的项目进行聚合,提出概念父工程
创建父工程
创建好父工程目录结构:只有pom.xml,可以推断父工程不进行编码。
- 项目需要的依赖的信息,在父工程中定义,子模块继承过程
- 将各个子模块聚合到一起
将创建父工程发布到本地仓库
将来service、dao工程发布到本地仓库。发布的service工程会报错。
如果忘记此步骤,将父工程发布到本地仓库。
创建子模块ssh-dao
Ssh-dao负责数据访问层:包含dao相关代码&配置文件
将spring的配置文件拆分
:项目基础的信息
:dao层bean对象
创建子模块ssh-service
将ssh-dao工程打包到本地仓库;
在service工程pom.xml文件添加ssh-dao的依赖
单元测试
- 批量加载spring配置文件
- classpath:spring/applicationContext-*.xml
- classpath*:spring/applicationContext-*.xml:既要加载本项目中配置文件,还要加载jar包中配置文件
- 传递依赖范围(了解)
A:ssh-service 工程
B:ssh-dao工程
C:junit单元测试
总结:当项目中需要的某一个依赖没有传递过来。在自己工程中添加对应依赖就可以。
创建子模块ssh-web:war
在ssh-web项目中添加service工程依赖。
Web.xml
运行方式
Maven方式:
方式1:运行父工程。父工程将各个子模块聚合到一起。将ssh-web打war包发布到tomcat
方式2:直接运行web工程
其他方式:
部署到tomcat
私服应用(了解)
私服安装
- 下载安装包
解压到本地磁盘
使用管理员权限打开dos,在dos下执行命令安装私服
启动服务
找到私服的访问url:
http://localhost:8081/nexus/#welcome
登陆:admin/admin123
私服仓库类型
Hosted:宿主仓库
存放本公司开发的jar包(正式版本、测试版本、第三方:存在版权问题--Oracle)
Proxy:代理仓库
代理中央仓库、Apache下测试版本的jar包
Group:组仓库
将来连接组仓库。包含Hosted:宿主仓库,Proxy:代理仓库
上传jar包到私服上(应用)
- 在maven目录下conf/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包上传路径url
<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
下载jar包到本地仓库(应用)
- 在maven目录下conf/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>
Maven的好处
- 不再拷贝jar包。项目不需要存放jar包。导致项目源代码小
- 使用maven开发的工程,如果环境统一导入别的maven的项目不会报错
- 代码耦合度进一步降低.
- 方便项目进行升级
- 节省人力成本