maven多模块介绍及搭建

对于概念的一些理解
Maven的作用

管理模块之间的依赖:根据业务需求,系统会划分很多模块,这些模块彼此之间存在着依赖关系。比如系统管理模块依赖着文件上传模块,来实现用户头像上传的功能。maven通过配置模块之间的pom依赖

生命周期管理:在web应用中,我们常要进行编译、打包、测试这些环节。在maven的世界里,将这些过程定义为生命周期。maven将这些复杂的过程进行了封装,使用者只需要简单的用鼠标点几下就可以完成项目的构建工作

强大的插件:举一个很常用的插件tomcat7-maven-plugin,在老老年间,我们发布应用的方式是,将web应用打包成war->手动拷贝到tomcat的webapp目录下->启动tomcat。现在有了Maven以上过程我们只需要点击一下鼠标即可完成。是不是很方便?

仓库式管理:曾经为了找一个jar包费劲周折,曾经因为jar包冲突、版本产生莫名其妙的问题困扰我们好久。Maven提供的公用仓库http://mvnrepository.com/,只要输入jar包的坐标即可查找到想要的资源,将模块的坐标加入到自己的pom中就可以快乐的使用了,真的觉得很方便。同时由于依赖的概念,与其相关的jar包也会引入到项目环境中,并且不会产生版本的问题

Nexus作用

节省流量:Nexus作为私有库部署在局域网内部,比如10个人协同开发,开发人员A需要一个log4j的jar来实现系统日志功能,A将log4j的坐标添加到自己模块的pom文件中,maven会向公共仓库发送请求,下载log4j的jar包。下载的过程中,Nexus也偷偷的保存了一份log4j在私有的仓库。那么以后再有开发人员需要log4j的时候,请求是直接发送到Nexus上请求资源的。就不需要访问外网了,否则每个人都需要访问公共Maven库下载资源。这样节省了流量,同时内网的网速一般也比公网快。也提高了工作效率

协同开发:多人协同开发,A开发系统管理、B开发考勤模块。考勤模块依赖了系统管理的员工接口,那么B需要手动拷贝A打包的jar到自己的工程中。当A改动了系统管理的接口,B完全不知情,等出现问题了还需要联调,很麻烦!有了Nexus A就可以将系统管理打包发布到Nexus的私有仓库中,B添加系统管理的坐标即可完成依赖,以后A再有改动,只要发布到Nexus上就可以了。减少了沟通成本

如何使用Maven管理以上的结构呢?
首先要弄清楚Maven的两个重要的概念,依赖和继承。举例说明:

场景:

1、有A、B、C三个模块是用Maven进行管理的,它们之间的关系:C依赖B、B依赖A

2、有D、E、F三个模块是用Maven进行管理的。它们之间的关系:F继承自E,也就是F的parent是E。E依赖D

结果:

依赖:对于场景1,由于依赖的传递性,C模块中,除了能使用B的接口外,同时也能使用A的接口。但是在C模块中,无法继承到B模块的一些POM配置(比如定义的版本信息,中定义构建信息等)

继承:对于场景2,F是能够继承到E的Pom的配置的,比如对E对D的依赖,在F中是能够使用D中定义的接口的。还有其他的Pom配置,比如、、

回到主题,对于上述的模块结构,如果使用maven管理应该考虑的问题有哪些呢?

1、随着项目的进展,模块的数量不断增长。maven对于模块的管理包含着版本的概念,只有正确的管理版本,才不至于在工作中造成版本的混乱。

是否应该有一个地方统一对版本进行管理?

2、对于所有的模块,是都需要发布到nexus上进行管理的,那么是否代表着,没一个模块都要配置来对发布过程进行管理呢?如果nexus服务器ip换了怎么办?每个模块去修改?

应该有一个地方统一管理整个项目的发布配置

3、对于依赖的管理,通过模块结构图可以想象,模块之间的依赖是很复杂的,比如很多模块都依赖于log4j,是否每个模块都要使用一次Log4j\

具体配置
root模块的pom.xml配置:

复制代码

<?xml version="1.0" encoding="UTF-8"?>


4.0.0

<groupId>com.wt.common</groupId>
<artifactId>root</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>root</name>

<developers>
    <developer>
        <name>lichking</name>
        <email>lichking2017@aliyun.com</email>
    </developer>
</developers>

<properties>
    <project.build.sourceEncoding>1.8</project.build.sourceEncoding>
    <version.j2ee>1.0-SNAPSHOT</version.j2ee>
</properties>

<!--构建设置-->
<build>
    <outputDirectory>${basedir}/target/${project.build.finalName}/WEB-INF/classes</outputDirectory>
    <plugins>
        <!--设置编译的jdk版本还有编码格式-->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
                <encoding>UTF-8</encoding>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <!--设置资源文件读取编码格式-->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>3.0.2</version>
            <configuration>
                <encoding>${project.build.sourceEncoding}</encoding>
            </configuration>
        </plugin>

        <!--源码打包-->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <version>2.4</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>jar-no-fork</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

<!--配置发布信息-->
<distributionManagement>
    <repository>
        <id>releases</id>
        <url>http://192.168.0.110:8081/repository/maven-releases/</url>
    </repository>
    <snapshotRepository>
        <id>snapshots</id>
        <url>http://192.168.0.110:8081/repository/maven-snapshots/</url>
    </snapshotRepository>
</distributionManagement>
复制代码

version模块的pom.xml配置

复制代码

<?xml version="1.0" encoding="UTF-8"?>



root
com.wt.common
1.0-SNAPSHOT
…/root/pom.xml

4.0.0

<groupId>com.wt.common</groupId>
<artifactId>version</artifactId>
<packaging>pom</packaging>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <version.spring>5.0.2.RELEASE</version.spring>
    <version.com.google.code.gson>2.8.2</version.com.google.code.gson>
    <version.commons-lang3>3.7</version.commons-lang3>
    <version.druid>1.1.9</version.druid>
    <version.mybatis>3.4.6</version.mybatis>
    <version.mybatis-spring>1.3.2</version.mybatis-spring>
    <version.mybatis-generator>1.0SNAPSHOT</version.mybatis-generator>
    <version.core>1.0-SNAPSHOT</version.core>
    <version.mysql.driver>6.0.6</version.mysql.driver>
    <version.gson>2.8.2</version.gson>
    <version.junit>4.12</version.junit>
    <version.testng>6.14.3</version.testng>
    <slf4j.version>1.7.25</slf4j.version>
    <log4j.version>2.8.2</log4j.version>
</properties>
复制代码

j2ee模块的配置:

复制代码

<?xml version="1.0" encoding="UTF-8"?>



version
com.wt.common
1.0-SNAPSHOT
…/version/pom.xml

4.0.0

<groupId>com.wt.common</groupId>
<artifactId>j2ee</artifactId>
<packaging>pom</packaging>
<name>j2ee</name>

<dependencies>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>7.0</version>
        <scope>compile</scope>
    </dependency>

    <!--通过传递依赖,已经将spring-core、context、aop、beans模块加入到了依赖树中-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${version.spring}</version>
    </dependency>
    <!-- spring事物模块 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>${version.spring}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>${version.spring}</version>
    </dependency>
    <!--apache工具包-->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>${version.commons-lang3}</version>
    </dependency>
    <!--前后端通过json通信-->
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>${version.com.google.code.gson}</version>
    </dependency>
    <!--数据库连接池-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>${version.druid}</version>
    </dependency>
    <!--mysql数据库连接驱动-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${version.mysql.driver}</version>
    </dependency>
    <!-- controller向客户端返回数据的时候,表述形式为JSON时,需要的依赖(google的gson工具) -->
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>${version.gson}</version>
    </dependency>
    <!--mybatis依赖begin-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>${version.mybatis}</version>
    </dependency>
    <!--mybatis与spring整合-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>${version.mybatis-spring}</version>
    </dependency>
    <!--&lt;!&ndash;mybatis 代码生成器&ndash;&gt;-->
    <!--<dependency>-->
    <!--<groupId>org.mybatis.generator</groupId>-->
    <!--<artifactId>mybatis-generator-core</artifactId>-->
    <!--<version>${version.mybatis-generator}</version>-->
    <!--</dependency>-->
    <!--框架依赖-->
    <dependency>
        <groupId>com.wt.common</groupId>
        <artifactId>core</artifactId>
        <version>${version.core}</version>
    </dependency>
    <!--日志处理-->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${slf4j.version}</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
        <version>${slf4j.version}</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>${log4j.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>${log4j.version}</version>
    </dependency>
    <!--用于与sfl4j保持桥接-->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <version>${log4j.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-web</artifactId>
        <version>${log4j.version}</version>
        <scope>runtime</scope>
    </dependency>

    <!--测试框架-->
    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>${version.testng}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>${version.junit}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${version.spring}</version>
        <scope>test</scope>
    </dependency>
</dependencies>

<!--<build>-->
<!--<plugins>-->
<!--<plugin>-->
<!--<groupId>org.mybatis.generator</groupId>-->
<!--<artifactId>mybatis-generator-maven-plugin</artifactId>-->
<!--<version>${version.mybatis-generator}</version>-->
<!--</plugin>-->
<!--</plugins>-->
<!--</build>-->
复制代码 moduleVersion模块的配置

复制代码

<?xml version="1.0" encoding="UTF-8"?>



j2ee
com.wt.common
1.0-SNAPSHOT
…/j2ee/pom.xml

4.0.0

<groupId>com.wt.common</groupId>
<artifactId>moduleVersion</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>

<properties>
    <version.security>1.0-SNAPSHOT</version.security>
    <version.upload>1.0-SNAPSHOT</version.upload>
    <version.core>1.0-SNAPSHOT</version.core>
</properties>
复制代码

modalGather模块的配置

复制代码

<?xml version="1.0" encoding="UTF-8"?>



moduleVersion
com.wt.common
1.0-SNAPSHOT
…/moduleVersion/pom.xml

4.0.0

<groupId>com.wt.common</groupId>
<artifactId>modalGather</artifactId>
<packaging>pom</packaging>


<dependencies>
    <dependency>
        <groupId>com.wt.common</groupId>
        <artifactId>security</artifactId>
        <version>${version.security}</version>
    </dependency>

    <dependency>
        <groupId>com.wt.common</groupId>
        <artifactId>upload</artifactId>
        <version>${version.upload}</version>
    </dependency>

    <dependency>
        <groupId>com.wt.common</groupId>
        <artifactId>core</artifactId>
        <version>${version.core}</version>
    </dependency>
</dependencies>
复制代码

以上就是个人的一些见解

其他
关于Maven与nexus的结合使用,搞清楚几点就可以:

1、在项目中配置模块的发布路径,如上文提到的root的配置

其中的和是固定写法,分别对应snapshot版本和release版本

是要注意的,一定要与你本地的setting中的中的id对应上,Maven才能通过id对应的用户名和密码连接到nexus

2、中的内容是哪来的?

它对应着nexus仓库中的配置,见下图nexus中的红箭头,点击一下就可以拷贝对应的地址了

复制代码


releases
http://192.168.0.110:8081/repository/maven-releases/


snapshots
http://192.168.0.110:8081/repository/maven-snapshots/


复制代码
以下是本机settings.xml配置

复制代码

<?xml version="1.0" encoding="UTF-8"?>




nexus
admin
admin123


snapshots
admin
admin123


tomcat8
admin
admin

nexus * http://192.168.0.110:8081/repository/maven-public/ nexus nexus Nexus http://192.168.0.110:8081/repository/maven-public/ truealways truealways nexus Nexus http://192.168.0.110:8081/repository/maven-public/ truealways truealways nexus 如有不明白之处,请留言!!!!
1.[今日课程内容总览] Maven--***** 介绍 优点 用maven创建一个项目, 用maven创建一个ssm项目,每一层的代码分开,把一个项目拆解成多个项目 2.[今日包含笔记] maven介绍: Eclise: 缺点: Jar包: 版本管理,解决jar包冲突:删除老的jar包,保留新的jar包 不同的项目,jar包要复制一份;Users Library 羡慕yum的好处,安装软件,自动下载,自动验证,自动安装,自动测试;镜像网站 Jar包的依赖: 致命的缺点:现象: 每一个项目都有前台(广大网民)和后台(管理员看的),后台的功能远远的大于>前台的功能;迭代升级;每次升级都要重启tomcat;将tomcat做很多个备份(10个),为了nginx转发;前台:访问比较大,管理员访问量比较小; 问题: 每次升级,10个tomcat都升级一次 后台的升级频繁要比前台频繁;升级10次,9次改的是后台的代码,只有一次是前台的代码 解决方案: 是将前台(广大网民看的页面)的代码和后台(管理员)的代码要分开,将原来的一个项目分别放到两个web项目;一个web项目一个tomcat;好处:更新的时候如果更新后台(管理员),只需要重启后台的tomcat(服务); 折成两个项目以后的缺点:Service以下的代码重复; 将Service层以下的代码放到一个新创建的java项目中,在部署的时候将Service(java项目)打成一个jar包,分别放到两个web服务中;编译的时候让web项目依赖与Service(java项目)_source folder;配置麻烦,项目与项目之间的依赖头脑得相当清晰 这个缺点Maven解决了; 请听今天的内容 拆分前:图一 拆分后是图二 3. 介绍 官网:http://maven.apache.org/download.cgi 目录介绍: Bin:二进制文件 Boot:引导,启动 Conf:配置文件 Lib:jar包 README.txt:读我 3.1.修改配置文件的内容 路径:%MAVEN_HOME%\conf\settings.xml 配置文件代码: d:/repo alimaven aliyun maven http://maven.aliyun.com/nexus/content/groups/public/ central 注意: 千万不要将文档中的setting的内容全部替换到maven中的内容,要对比着修改,保留原来的; 只修改本地仓库,和下载镜像(源) 3.2.Eclipse Maven的配置 每打开一个新的工作空间,要配置一下Maven,然后再写代码 3.3.创建Maven项目 右击创建一个maven project Packing:有三种: Jar:java项目, War:web项目 Pom:文件夹,jar和war文件,mavenProject:一个项目,可以放jar和war包,通过pom,一般新创建的maven Project是POM 3.4.创建一个Maven Model 最外面的项目是MavenProject,其它的全部是Maven Model 3.4.1.创建JAR 目录介绍: Mvn-jar |-->Src:源码:java代码 |-->|-->main:代码:除测试以外的代码:junit |-->|-->main|-->java:代码 |-->|-->main|-->resources:配置文件 |-->|-->test:测试的代码,junit |-->|-->test|-->java:代码 |-->|-->test|-->resources:配置文件 |-->Target:编译后的文件 |-->|-->classes:代码编译后的class类 |-->|-->test-classes:测试类编译后的classes 3.4.2.创建WAR 目录介绍: Mvn-war |-->Src:源码:java代码 |-->|-->main:代码:除测试以外的代码:junit |-->|-->main|-->java:代码 |-->|-->main|-->resources:配置文件 |-->|-->main|-->webapp:webContent,一般放jsp,js,css |-->|-->test:测试的代码,junit |-->|-->test|-->java:代码 |-->|-->test|-->resources:配置文件 |-->Target:编译后的文件 |-->|-->classes:代码编译后的class类 |-->|-->test-classes:测试类编译后的classes |-->|-->m2e-wtp:编译后的web服务;war解压后的内容 创建war包以后报以下错误: 因为创建的web项目,webapps少了web-inf,web.xml 解决方案: 在项目上右击,Javaee Tools-->第二个选项 3.5.配置编译环境 将maven的项目重新编译,在项目中右击,可以pom上右击,可以将pom(目录)下面的jar和war重新编译 如果出现以上情况,说明下载的jar包有问题,把这下面的文件删除,重新下载 每创建一个项目,都有pom.xml,所有的配置都在pom.xml中 网址:所有的groupId和artifactId到这个网站中找 http://mvnrepository.com/ Pom.xml:配置文件示例(含的编译环境) 4.0.0 com.bjsxt mvn 0.0.1-SNAPSHOT pom mvn mvn mvn-jar mvn-war org.apache.maven.plugins maven-surefire-plugin true org.apache.maven.plugins maven-compiler-plugin <!-- 3.6.1 --> 1.7 1.7 UTF-8 org.apache.maven.plugins maven-source-plugin true compile jar org.apache.maven.plugins maven-resources-plugin UTF-8 3.6.生命周期 Maven -build:javac;编译 Maven-install:java先编译,后运行 在项目的target中会生成jar包和war包, 在仓库中生成相应的目录,里面的放的是jar包和war包 Maven-clean:会把项目中的class文件和jar包war包删除 Maven-test:运行所的测试类,取决于位置,必须放到src/test下面;在运行的(install)跳过,运行的时候会执行一遍测试类(花的时间长) 4.创建一个标准的ssm项目 项目介绍: Ssm:项目的顶级目录 ssm_common:jar包,放的是原来src_common下面的代码 ssm_service:pom,文件夹,放了api和impl的项目 ssm_service_api:jar包,放的是所有Service的接口 ssm_service_impl:jar包,所有Service的实现类 ssm_service_back:管理员后台的web服务 ssm_service_head:前台的服务 凡是依赖:如果都是java项目,会将依赖的项目打成一个jar包放到classpath中, 如果是web项目,会将依赖的项目打成一个jar包,放到web-inf/lib中 特别的图 创建完以后如下图: 添加依赖 5.搭建ssm 5.1.创建数据库 5.2.创建项目:确定项目可以在tomcat上运行 5.3.添加Spring 添加jar包 添加JAR包 增加版本的常量 在不同的项目中可以使用不同的版本-这种情况不允许 添加配置文件 写测试代码 如下图: 结论: ~将原来的原始的项目,变成maven项目 ~相同的代码,不同的环境,将项目跑起来 5.4.添加Mybatis 将service折成了两个项目:service-api,和service-impl Service-api;放的是Controller层使用到的对象;Service的接口引用,Util,POJO, Service-impl:放的是调用Dao层的对象; 目前来看:我们的web服务都依赖了api服务和impl服务,在将来引用dubbo的时候,web服务只依赖api服务,不依赖Impl
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值