maven 继承webapp

2015-04-17 10:34:06 xu573267476 阅读数 396

前言

本章要讲解的Maven在项目中划分模块上的应用,用到上文中提到的继承和聚合,来减少重复,通过各个模块的划分,提高灵活性,以求达到高内聚,低耦合的效果。以下将会以一个Web项目为例来进行说明。


模块的划分

我们在开发web项目时,会将项目分成3层架构:

  • Dao层负责数据库交互,封装了与数据库交互的类。
  • Service层处理业务逻辑,放一些Service接口。
  • Web层负责与客户端交互,主要有一些Structs的Action类。
  • Utils类负责一些工具类,供其它层次调用。

我们使用包来分割,包之间单项调用,各个模块对应的包名
edu.fudan.app.dao
edu.fudan.app.Service
edu.fudan.app.Web
edu.fudan.qpp.Utils

通过这3个层次的划分,实现了3个模块的高内聚,以及模块间的低耦合,但是对于构建层次来说,所有东西还是耦合在一起的。(需要同时,一起构建)

这样在开发的过程中就会出现一些问题:
1 随着项目的增大,编译整个项目的时间会很长,即使你只需要负责Web这个模块的开发,也必须每次都编译整个项目。
2 项目的某个模块可能需要专门的人员进行处理,并不是任何程序员都可以 进行修改,比如Utils工具集合,可能需要专门的维护,最终成为公司中独立的一个框架,供其它所有项目调用。


具体实现

实现的思路

  • app-parent(pom.xml,pom 打包方式)
    • app-dao ( pom.xml , jar 打包方式 )
    • app-service ( pom.xml ,jar 打包方式 )
    • app-utils ( pom.xml , jar 打包方式 )
    • app-web (pom.xml ,war打包方式)

依赖关系:(->表示依赖于)
app-dao->app-utils
app-service->app-dao
app-web->app-service

parent中pom中利用<modules>聚合了其他的子模块来实现一键编译
各个子模块中使用<parent> 来继承父类来消除重复
这样也可以使项目的各个解决上述构建中的问题。

实现步骤

1 按照上面给出的项目划分,建立起各个项目,其中app-web是web类型的项目。
项目目录
如上所示,即为建好的项目目录

2 按照继承和聚合,来修改各个项目的pom文件

1 修改Parent的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>
<groupId>edu.fudan</groupId>
<artifactId>App-Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>

<!-- 此处打包方式必须为pom -->
<packaging>pom</packaging>

<!-- 此处可以项目的信息,会显示在生成的文档中 -->
<name>App-Parent</name>

<!-- 聚合整个项目的所有模块 -->
<modules>
    <module>../App-Utils</module>
    <module>../App-Dao</module>
    <module>../App-Service</module>
    <module>../App-Web</module>
</modules>

<!-- 定义一些公共,容易修改的变量 -->
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <junit.version>4.9</junit.version>
    <pro.version>0.0.1-SNAPSHOT</pro.version>
</properties>

<!-- 此处定义依赖,dependencyManagement 中的 dependencies 元素只表明依赖项版本的优先选择,并不影响项目的依赖项 -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>edu.fudan</groupId>
            <artifactId>App-Utils</artifactId>
            <version>${pro.version}</version>
        </dependency>
        <dependency>
            <groupId>edu.fudan</groupId>
            <artifactId>App-Dao</artifactId>
            <version>${pro.version}</version>
        </dependency>
        <dependency>
            <groupId>edu.fudan</groupId>
            <artifactId>App-Service</artifactId>
            <version>${pro.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>
</project>`

2 修改Utils的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>
<artifactId>App-Utils</artifactId>
<packaging>jar</packaging>
<name>App-Utils</name>

<!-- 此处为继承 -->
<parent>
    <groupId>edu.fudan</groupId>
    <artifactId>App-Parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>../App-Parent/pom.xml</relativePath>
</parent>

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <!-- 此处无需写版本号,Parent中已经定义 -->
        <scope>test</scope>
    </dependency>
</dependencies>
</project>

3 修改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>
<artifactId>App-Dao</artifactId>
<packaging>jar</packaging>
<name>App-Dao</name>

<!-- 此处为继承 -->
<parent>
    <groupId>edu.fudan</groupId>
    <artifactId>App-Parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>../App-Parent/pom.xml</relativePath>
</parent>

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>edu.fudan</groupId>
        <artifactId>App-Utils</artifactId>
    </dependency>
</dependencies>
</project>

4 修改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>
<artifactId>App-Service</artifactId>
<packaging>jar</packaging>
<name>App-Service</name>

<!-- 继承 -->
<parent>
    <groupId>edu.fudan</groupId>
    <artifactId>App-Parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>../App-Parent/pom.xml</relativePath>
</parent>

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>edu.fudan</groupId>
        <artifactId>App-Dao</artifactId>
    </dependency>
</dependencies>
</project>

5 修改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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>App-Web</artifactId>
<packaging>war</packaging>
<name>App-Web Maven Webapp</name>

<!--这里是继承Parent的pom文件 -->
<parent>
    <groupId>edu.fudan</groupId>
    <artifactId>App-Parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>../App-Parent/pom.xml</relativePath>
</parent>
<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>edu.fudan</groupId>
        <artifactId>App-Service</artifactId>
    </dependency>
</dependencies>
<!-- 配置cargo自动部署到tomcat下面 -->
<build>
    <finalName>app</finalName>
    <plugins>
        <plugin>
            <groupId>org.codehaus.cargo</groupId>
            <artifactId>cargo-maven2-plugin</artifactId>
            <version>1.2.3</version>
            <configuration>
                <container>
                    <containerId>tomcat7x</containerId>
                    <home>D:/Tomcat7.0</home>
                </container>
                <configuration>
                    <type>existing</type>
                    <home>D:/Tomcat7.0</home>
                </configuration>
            </configuration>
            <executions>
                <execution>
                    <id>cargo-run</id>
                    <phase>install</phase>
                    <goals>
                        <goal>run</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
</project>

这样的好处是:既可以在Parent中进行所有模块和依赖的版本的统一控 制,而且利用<dependencyManagement>子模块可以有选择行的继承,而不需要全部继承。
3 接下来就可以install,通过cargo自动部署到tomcat上
运行结果如下
install结果
运行结果

2019-05-01 15:19:27 lingyiwin 阅读数 1878

IDEA 使用Maven 项目继承Springboot 使用启动器spring-boot-starter-web

创建的项目为什么没有webapp目录?

如何创建webapp和以往项目一样呢?  可以参考一下步骤



 

 

注意有些版本可能没有webapp\WEB-INF  需要的点击+号的时候手动添加

上图中的webapp目录 是手动添加的

2020-04-03 19:37:04 coralime 阅读数 76

最近应用maven来改写之前的传统web工程,遇到一些小问题,好在这些问题都被解决了。但是遇到的时候真的很让人抓狂,因为之前的web项目从来没遇到过这种问题,很奇怪。果然想偷懒想省事总是要付出代价的。=]

为了以后用maven能省事,现在将这些问题记录在这里,把该踩的坑全部填平了,以后就一路狂奔吧。


/webapp下新建了一个indicators.jsp,引入了一些JS、CSS文件

    <!--JQuery-->
    <script type="text/javascript" charset="UTF-8" src="scripts/jquery-3.3.1.js"></script>
    <!--DataTable-->
    <script type="text/javascript" charset="UTF-8" src="scripts/jquery.dataTables.min.js"></script>
    <script type="text/javascript" charset="UTF-8" src="scripts/dataTables.fixedColumns.min.js"></script>
    <!--JQuery WEUI-->
    <script type="text/javascript" charset="UTF-8" src="scripts/jquery-weui.min.js"></script>
    <script type="text/javascript" charset="UTF-8" src="scripts/fastclick.js"></script>

    <!--DataTable CSS-->
    <link rel="stylesheet" type="text/css" href="css/jquery.dataTables.min.css">
    <link rel="stylesheet" type="text/css" href="css/fixedColumns.dataTables.min.css">
    <!--WeUI CSS-->
    <link rel="stylesheet" type="text/css" href="css/weui.css">
    <link rel="stylesheet" type="text/css" href="css/jquery-weui.min.css">
    <!--链接外部样式表-->
    <link rel="stylesheet" type="text/css" href="css/style.css">

直接运行,浏览器端报错

JS文件和CSS文件等静态文件都被拦截了,没有正常加载,原因是在web.xml中把<url-pattern>写成了“/”,默认全部拦截

<servlet>
    <servlet-name>IndicatorServlet</servlet-name>
    <servlet-class>com.indicator.servlet.IndicatorServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>IndicatorServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

解决方案

web.xml中添加JS、CSS等静态资源的过滤代码,注意本地用的是Tomcat服务器,所以<servlet-name>default

<!--不拦截静态资源-->
<!-- tomcat 默认名称default -->
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.png</url-pattern>
</servlet-mapping>

本地测试通过,发布到服务器weblogic,发现发布失败

原因是本地用的Tomcat服务器,默认的<servlet-name>default,但现在服务端是weblogic默认的<servlet-name>就不一样了。

解决方法:把 default 改成 FileServlet 就可以了。

<!-- weblogic 默认名称FileServlet -->
<servlet-mapping>
    <servlet-name>FileServlet</servlet-name>
    <url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>FileServlet</servlet-name>
    <url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>FileServlet</servlet-name>
    <url-pattern>*.png</url-pattern>
</servlet-mapping>

参考资料

将tomcat部署的项目迁移到weblogic部署遇到的问题   https://blog.csdn.net/dyr_1203/article/details/82350425

tomcat迁移到weblogic的几个问题  https://my.oschina.net/shuming/blog/784886

 


--------- 2020-05-26 -- 更新 --------

当有多个Servlet的时候,web.xml需要这样配置

<servlet>
    <servlet-name>StarInfoServlet</servlet-name>
    <servlet-class>com.businesstrip.servlet.StarInfoServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>StarInfoServlet</servlet-name>
    <url-pattern>/StarInfo</url-pattern>
</servlet-mapping>

<servlet>
    <servlet-name>GetEmployeeInfoServlet</servlet-name>
    <servlet-class>com.businesstrip.servlet.GetEmployeeInfoServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>GetEmployeeInfoServlet</servlet-name>
    <url-pattern>/GetEmployeeInfo</url-pattern>
</servlet-mapping>

配置好以后,发现/pages/下所有的.jsp都找不到了,浏览器直接报错404,因为使用了UrlRewrite对方位地址进行改写,我一直怀疑是这个文件的配置的问题,但其实不是。

最终发现只要把“不拦截静态资源”那一段<servlet-mapping>删掉就好了,所以上述那一段解决方式仅仅适用于一个只有一个Servlet的情况,且 <url-pattern>/</url-pattern>。

如果有多个Servlet或者<url-pattern>/name</url-pattern>就不需要单独写不拦截的那一段了。

--------- 2020-06-02 -- 更新 --------

自定义了一个文件夹【resources】专门用来放置.js.css和图片资源,本地测试全部通过。

但是发布到weblogic报错,找不到静态资源,原因是自定义的文件夹和默认resources路径重名了!导致地址加载不正确,报错。好低级的错误,但是为嘛本地测试居然通过了呢...想不通。

2018-05-10 23:33:07 qq_33541575 阅读数 5075

图文详解MyEclipse中新建Maven webapp项目的步骤(很详细)


1. New -> Project... -> Maven Project




Group Id,Artifact Id,和Package(请参考后面的“关键词”),点击“Finish”



创建完成后,文件目录结构如下:


添加代码目录:

注:如果是MyEclipse2015,只需要在Java Build Path -> Libraries 中,把JRE System Library修改为“Workspace default JRE”就可以自动有那些目录了,无需下面的操作。

项目右键 -> Build Path -> New Source Folder...,填写“src/main/java”

(注:MyEclipse2015没有这个菜单,直接这样就行:项目右键 -> New -> Folder ->Folder Name 输入 "src/main/java",然后重复步骤输入“src/test/java”)


添加后,test目录也自动有了:

(如果需要)修改项目所使用的jdk:项目右键 -> Build Path -> Configure Build Path...

最终的项目目录结构如下:


 添加相应的插件,如 maven-compiler-plugin

在pom.xml中

<plugin>

    <groupId>org.apache.maven.plugins</groupId>

   <artifactId>maven-compiler-plugin</artifactId>

   <version>2.3.2</version>

   <configuration>

   <source>1.7</source>

   <target>1.7</target>

   </configuration>

   </plugin>

关键词:

GroupId:一般是公司名或组织名

ArtifactId:一般是project名

Packaging:打包类型,jar/war/rar/ear/pom等,默认是jar

Version:版本号,GroupId+ArtifactId+Packaging+Version构成项目的唯一标识

Snapshot:标识一个正在开发阶段、会经常更新、但尚未发布的版本

 

<dependency management>和<dependencies>的区别:

在父POM中用<dependency management>定义好version, scope, 和exclusions后,可以被子POM中用<dependencies>定义的依赖所继承使用。这样,如果有多个子POM的话,可以确保用同一套version, scope, 和exclusions。

 

Dependency Scope:

compile: 默认的scope。编译、测试、打包全都需要。compile参与依赖传递,就是说,项目A依赖于B(依赖scopecompile),项目C依赖于你的项目A

那么C也就依赖于B

provided: 表示JDK或者容器会在Runtime时提供这些(jar),如servlet api,部署时是不需要它的,因为应用服务器肯定有这些东西。provided的东西在编译和测试时会用到,不参与传递依赖。

runtime: 表示编译时不需要,但测试和运行时需要,最终打包时会包含进去。

test: 只用于测试阶段(测试的编译和测试的运行),典型的就是junitjar

system: provided类似,但要求jar是系统里已有的,不会在repository里找,如rt.jar,tools.jar这些。

import: 简单的说,项目的pom可以继承另一个项目的pom,从而继承了父项目的依赖关系,但是因为之后single inheritance的限制,所以创造了

import,使得你可以导入或者说继承任何一到多个项目的依赖关系。

找包的方法:

1. GOOGLE里输入: maven spring repository

2. 得到:

1. <dependency>

2. <groupId>org.springframework</groupId>

3. <artifactId>spring</artifactId>

4. <version>2.5.5</version>

5. </dependency>

 

Maven下载完jar包后,

1. Stop server

2. Redeploy/Reload application

3. Start server

或在此网站中查找:http://mvnrepository.com

版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/qq_33541575/article/details/80275276



2019-07-15 17:00:40 zane06 阅读数 980

最近开始学习maven,在用idea快速新建web工程的时候无法新建servlet文件,如下所示(右键新建按钮)
找不到servlet新建选项
刚开始找不到原因,不过好在servlet也算是一个普通的Java对象,直接新建一个就好,新建一个之后让他继承HttpServlet,你会发现会爆红,将鼠标点击小灯泡会发现,其实是缺少jar包依赖。如下图所示。
添加maven依赖
点击Add Maven Dependency之后添加HttpServlet(第一个)。
添加httpServlet
之后再导入包即可。
导入class
最后的最后你还会发现,在新建文件的菜单栏中新增了一些文件选项,而此时就会见到servlet的选项。
新增servlet

Maven - 继承和聚合

阅读数 5839