maven项目构建ssh工程(父工程与子模块的拆分与聚合)
>> Eclipse下创建普通Maven项目
- 创建maven project:
- 创建一个简单项目:
- 配置项目:
- 项目创建完成,但是会报错:
- 查看
problem
报错信息:缺少web.xml文件
- 在webapp目录下右键new文件夹:WEB-INF
- 在其他项目拷贝一个web.xml放到WEB-INF文件夹下,并修改值为当前项目名称:
- 当前JRE版本为Maven默认的1.5,需要在pom文件里面进行配置:添加jdk编译插件
- 配置完pom之后保存,项目会报错:需要update项目
- 项目名右键 –> maven–>update project
- 开始创建包、类
>> Eclipse下创建多模块Maven项目
参考链接:http://www.cnblogs.com/whgk/p/7121336.html
创建父模块Maven Project:
File --> New --> Other --> Maven --> Maven Project --> Next
:
创建好父工程之后,从它的目录结构可以看出,父工程本身不写代码,它里面有一个
pom.xml
文件,这个文件可以将多个子模块中通用的jar所对应的坐标,集中在父工程中配置,将来的子模块就可以不需要在pom.xml
中配置通用jar的坐标了;src文件夹可以删除;
在父工程的
pom.xml
中抽取一些重复的配置的,比如:锁定jar包的版本、设置编译版本等,一般这种都不需要我们自己临时配置,网上或者公司都有已经写好了的,每次使用就直接丢过来即可;(配置代码见“配置Maven项目”)创建
maven-dao
子模块:File --> New --> Other --> Maven --> Maven Module --> Next
:
点击finish,完成之后,查看父工程中的
pom.xml
文件,多了一个modules节点,说明有一个子模块tkpmalltest_dao
:
看
tkpmalltest_dao
中的pom.xml
文件,会发现多了一个 parent结点,并且内部所包含的结点,其实就是父工程的坐标:
查看
tkpmalltest_dao
的目录结构:
因为是在dao层,和数据库打交道,那么就在这个项目中,需要配置
hibernate.hbm.xml
和hibernate.cfg.xml
,但是又集成了spring,所以hibernate.cfg.xml
就不需要了,添加applicationContext.xml
即可(这里需要有spring整合hibernate的基础)创建
tkpmalltest_service
子模块:同dao,在tkpmalltest_service
的pom.xml
中添加两个依赖:
- 添加依赖 可以手写代码,也可以直接在项目名处右键
Maven --> Add Dependency
- 添加依赖 可以手写代码,也可以直接在项目名处右键
创建
tkpmalltest_web
子模块,创建方法同dao;同时在pom.xml
文件里面添加service的依赖;
注意:打包方式为war,而不再是jar包了,因为该层需要放到tomcat中去。与浏览器交互,就是web项目了,所以打成war包;
Maven项目标准目录结构:(对项目中文件进行细分)
创建完web子模块会出现两个错误:
缺失
web.xml
文件,需要手动添加、或者为项目增加web项目必须的一些基础文件结构:(下一小节会讲到),或者通过工具生成web.xml:项目名右键 –> JavaEE Tools –> Generate Deployment Descriptor Sub:
项目右键
Maven --> Update Project
时jdk版本为1.5,需要在pom.xml
文件里添加插件,或者项目名右键 –> Maven –> add plugin
父工程和子模块都写完之后,就成这样了:
>> 将 Maven 项目改为 Web 工程结构
如今Maven仍然是最常用的项目管理工具,若要将Java Web项目使用Maven进行管理,则首先需要新建Maven项目,然后将其转化为web项目;使用Maven开发项目是需要项目的文件结构以某种形式存在的,本文将展示如何在eclipse中新建一个Maven Project到最终变为Mavne格式的web应用;
(1)为项目增加web项目必须的一些基础文件结构:
项目名 右键 --> Properties --> Project Facets --> 勾选Dynamic Web Module 3.1 --> Apply --> OK
;(可能会出现错误)
dynamic web module 3.0 requires java 1.6 or newer
错误解决:把所有的设计到jdk的地方全都设为1.8;- (1)
Window --> Properties --> java --> Compiler、Installed JREs
- (2)
项目名右键 --> Properties --> Java Build Path
- (3)在项目的根目录找到
.settings
文件夹,里面
org.eclipse.jdt.core.prefs
设计到1.5的全部改为1.8;
org.eclipse.wst.common.component
将第一行的version=”1.5.0”改为version=”1.7.0”
org.eclipse.wst.common.project.facet.core.xml:<installed facet="java" version="1.8"/>
- (1)
修改完之后,刷新项目,重新右键右键-属性,选择勾选
dynamic web module
,选择最高版本3.1:
点击下方
Further configuration available
:
点击OK之后,回到上面
dynamic web module
版本选择页面,点击Apply-OK,tkpmalltest_web
项目错误消失,webapp下出现两个文件夹,项目结构如下图:
项目名
右键 --> Maven --> Update project
;
(2)修改部署项目时文件的发布路径(Tomcat)
如果需要项目其它普通web项目一样在本地tomcat下部署、运行、测试,还需进行一下设置:
**在
XX_web
项目名处右键 --> Properties --> Deployment Assembly
- 删除test两项以及WebContent,因为test是测试时使用,并不需要部署**;
- 添加src/main/webapp的部署路径;
- 添加Maven Dependencies的部署路径;
点击
Apply --> ok
,完成maven web项目的转换,此时即可以把该项目部署到tomcat上;
>> dependencies与dependencyManagement的区别
参考链接:https://blog.csdn.net/liutengteng130/article/details/46991829
(1)DepencyManagement应用场景
当我们的项目模块很多的时候,我们使用Maven管理项目非常方便,帮助我们管理构建、文档、报告、依赖、scms、发布、分发的方法。可以方便的编译代码、进行依赖管理、管理二进制库等等。
由于我们的模块很多,所以我们又抽象了一层,抽出一个parent来管理子项目的公共的依赖。为了项目的正确运行,必须让所有的子项目使用依赖项的统一版本,必须确保应用的各个项目的依赖项和版本一致,才能保证测试的和发布的是相同的结果。
在我们项目顶层的POM文件中,我们会看到dependencyManagement元素。通过它元素来管理jar包的版本,让子项目中引用一个依赖而不用显示的列出版本号。Maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用在这个dependencyManagement元素中指定的版本号。
<dependencyManagement> //父工程的pom.xml
<dependencies>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>org.eclipse.persistence.jpa</artifactId>
<version>${org.eclipse.persistence.jpa.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
</dependencyManagement>
<parent> //子模块继承父工程
<artifactId>parent</artifactId>
<groupId>com.tgb</groupId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../itoo-base-parent/pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>base</artifactId>
<packaging>ejb</packaging>
<dependencies> //依赖关系
<dependency> //不用声明版本号
<groupId>org.eclipse.persistence</groupId>
<artifactId>org.eclipse.persistence.jpa</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
这样做的好处:统一管理项目的版本号,确保应用的各个项目的依赖和版本一致,才能保证测试的和发布的是相同的成果,因此,在顶层pom中定义共同的依赖关系。同时可以避免在每个使用的子项目中都声明一个版本号,这样想升级或者切换到另一个版本时,只需要在父类容器里更新,不需要任何一个子项目的修改;如果某个子项目需要另外一个版本号时,只需要在dependencies中声明一个版本号即可。子类就会使用子类声明的版本号,不继承于父类版本号。
(2)Dependencies
相对于dependencyManagement,所有声明在dependencies里的依赖都会自动引入,并默认被所有的子项目继承;
(3)两者的区别
dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承);
dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。
>> 配置Maven项目
(1) 配置父工程的pom.xml
文件:
https://blog.csdn.net/qq_37546891/article/details/79882397
(2) 配置xxx_web
子项目的web.xml
文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1" >
<display-name>tkpmalltest_web</display-name> //tkpmalltest_web是子项目的项目名
<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>
</web-app>
(3) 配置xxx_dao
子项目的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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.taikang.test</groupId>
<artifactId>tkpmalltest</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>tkpmalltest_dao</artifactId>
<packaging>jar</packaging>
<name>tkpmalltest_dao</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
(4) 配置xxx_service
子项目的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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.taikang.test</groupId>
<artifactId>tkpmalltest</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>tkpmalltest_service</artifactId>
<packaging>jar</packaging>
<name>tkpmalltest_service</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- 依赖dao-->
<dependency>
<groupId>com.taikang.test</groupId>
<artifactId>tkpmalltest_dao</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
(5) 配置xxx_web
子项目的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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.taikang.test</groupId>
<artifactId>tkpmalltest</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>tkpmalltest_web</artifactId>
<packaging>war</packaging>
<name>tkpmalltest_web</name>
<url>http://maven.apache.org</url>
<dependencies>
<!-- 依赖service-->
<dependency>
<groupId>com.taikang.test</groupId>
<artifactId>tkpmalltest_service</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>tkpmalltest_web</finalName>
<plugins>
<plugin> <!--配置Jetty插件-->
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
(6) 更新、打包、发布
使用maven-update整个工程:
父工程名右键 --> Maven --> Update Project
打包:
父工程名右键 --> Run As--->Maven Install
打包web子工程:
父工程名右键 --> Run As --> Maven Build... --> Goals: clean package --> Run
启动Tomcat,浏览器访问;
>> Maven整合servlet
在
src/mian/java
下创建servlet:在java文件夹下
右键 --> New --> Other --> servlet --> 写上包名com.tk.test、类名,Next --> Next(默认) --> Finish(默认)
创建好之后,可能会编译报错,原因是缺少jar包,需要在pom.xml 文件里面添加依赖;
javax.servlet / servlet-api / 2.5 / <scope>test</scope>
编写Servlet文件,然后运行,因为项目名右键没有
mvn tomcat:run
这个命令,所以需要手动输入命令:
项目名右键 --> maven build ... --> Goals处填写:tomcat:run(省略mvn前缀) --> Run
;这样就把war包部署到了tomcat;
注意:这里运行的tomcat跟eclipse下的server里的Tomcat启动与否没有关系,也就是说不使用eclipse启动tomcat,也可以部署war包到tomcat,然后浏览器地址栏输入web项目的地址,进行访问项目;maven build ...
:可以自己手动输入一些命令;maven build
:执行Maven的一些历史记录,可以直接选择历史记录中的命令进行操作;
调试运行:debug模式
- 使用eclipse工具:servers窗口下,在tomcat下右键 –> debug:
- 使用maven命令:项目名右键 –> Debug As –> Maven build … –> Goals:tomcat:run –> 关联源码(若不关联源码,会报错,断点进不来):
注意:启动调试前先看一下console处是否有maven tomcat在运行,若没有关闭上次运行的项目,可能或出现tomcat端口被占用的错误;
- 使用eclipse工具:servers窗口下,在tomcat下右键 –> debug:
启动Debug之后,可以加断点,然后在浏览器地址栏访问项目,然后单步调试:
>> Maven整合Struts2
创建
maven project
,跳过原型选择,打包方式war包创建完项目报错:缺少
web.xml
文件:手动添加,或者配置相关设置,或者借助工具–项目名右键->JavaEE Tools
生成;在pom.xml里面添加代码,设置JDK编译版本:
项目名右键 --> Maven --> add Plugin --> compile(编译插件)
;在
pom.xml
文件里会创建添加插件的代码,继续设置configuration,设置详细信息:
项目名右键Maven,刷新项目;
添加Struts2依赖:只需添加
Struts2 core
核心包,其他jar包依赖包自动添加进来(Maven的一大好处)
在
src/main/resources
下面创建Struts.xml
配置文件:
在
src/main/java
下面创建action类:
在web.xml中配置Struts2框架的核心过滤器:过滤器配置完之后,发送任何
.action
结尾,或者空白请求都会经过核心过滤器;(JSP页面不会经过这个过滤器)
编写action类中的方法;
在
Struts.xml
文件中配置:
创建xx页面:
启动项目,浏览器地址栏中输入:
http://localhost:8080/项目名/XxxAction_方法名.action(.action不是必须写的,Struts2拦截.action请求和空白请求)
;若方法运行成功,并且页面转到xx页面成功,那么Struts2就整合成功;
>> 解决问题
(1)Missing artifact com.oracle:ojdbc14:jar:10.2.0.4.0
4:https://blog.csdn.net/qq_37546891/article/details/79038751
(2)The project cannot be built until build path errors are resolved
5:https://blog.csdn.net/qq_37546891/article/details/79038751
(3) Tomcat8 警告: Unable to add the resource at [***] to the cache...
6:https://blog.csdn.net/qq_37546891/article/details/79038751