• Maven多模块项目搭建


    要: Maven多模块项目搭建,可以通过合理的模块拆分,实现代码复用,便于维护管理,可以根据需要配置指定的模块。

    __kindeditor_temp_url__   http://git.oschina.net/alexgaoyh/MutiModule-parent

         最近一直在思考如何能够更好的重用代码。减少重复劳动,之前有一篇文章通过导入JAR包的形式,可以重用部分形如util类的方法,但是这样的话,管理起来jar包,特别是协同工作,多项目情况下,管理JAR会出现某些版本不统一的情况, 刚好最近在看Maven相关的资料,突然发现使用Maven是一个很好地方法。

        1: 本地通过创建Nexus私服仓库,可以将相关的项目打包jar上传到第三方仓库里面进行依赖,每次版本迭代,直接从Nexus私服仓库里面取出来最新的jar包即可。同时如果存在多项目依赖相同的jar包,亦可以创建仓库进行区别对待,很好也很简单的方法,这里不过多进行介绍。

        2: Maven的多模块项目,感觉多模块项目,很适合一些较大的项目,能够很细化的拆分模块,比如说一个Web站点,默认会有很多模块  ”验证码相关模块“”邮件相关模块“ ”登陆检验模块“……,很多的这些模块,其实是可以拆分为多个模块,这样就可以便于维护。

        本文主要介绍 Maven模块项目:

        创建一个Maven Project 选择 maven-archetype-quickstart 

    项目创建完成之后,修改buildPath相关(src/main/java src/main/resources……); JDK ……

    项目右键--》New--》Maven Module--》输入 MutiModule-captcha(验证码相关模块)--》选择maven-archetype-quickstart

    PS: 如果报错 The parent project must have a packaging type of POM

    是将pom.xml 中的  <packaging>jar</packaging> 改成  <packaging>pom</packaging>

    创建成功之后如下图:

    其中 captcha 项目里面包含了验证码的相关操作,并且功能已经实现,项目右键成功通过junit测试。

    20150409  更新:

    设想如下图所示:

    MutiModule-captcha项目里面定义的bean(captchaService),通过jar依赖的方式到MutiModule-service里面,就可以在service项目里面应用到captcha项目的bean,做更高一级的封装操作。

    期间遇到不少奇葩的问题,这里做一下记录:

        我使用的是maven3, 项目执行 mvn deploy 的时候,Snapshot(快照)形式的项目打包后会自动增加时间戳的部分, maven3 deploy jar snapshot  uniqueVersion 时间戳 : 查询相关资料发现: 

    Non-unique Snapshot Deployments

    The setting <uniqueVersion>false</uniqueVersion> for a distribution repository has no effect in version 3.x, snapshot artifacts will always be deployed using a timestamped version.

    Unique Snapshot Versions and Classifiers

    As described in MNG-4452, Maven 3 now supports deploying artifacts with different classifiers from a different build or source and having them properly resolved.

    This may impact Maven 2 or other clients that use the repository metadata to determine the version, since the version of the POM would be out of sync with the latest version of some artifacts. While this behavior matches the result of attempting to do the same in Maven 2, please be aware that you will not be able to successfully make subsequent deployments from Maven 3 if you have Maven 2 clients accessing the repository.

    Additionally, some repository managers and versions of Maven prior to 2.0.10 may not cope with the additional XML elements in the metadata file. If this is the case in your environment, you can disable the additional information by setting the maven.metadata.legacy system property to true when running Maven.

     大概意思就是,Snapshot类型的项目,会在发布jar的时候,自动增加一个时间戳的功能,Maven2的话,是有uniqueVersion可以操作的,但是Maven3是不支持这种做法了, 发现这个问题之后,直接把Snapshot 改为了 release ,简单有效,这样发布的版本就不带后面的时间戳了,项目依赖的话,也不用纠结后面时间戳的不同造成经常改动pom.xml 的配置了。

    -----------------

    Maven deploy Return code is : 400

    默认将jar部署到Relases仓库的时候,会出现这个错误,原因是Release仓库默认将Deployment Policy ‘disable’ 修改一下就可以了。

    此时在对MutiModule-service进行单元测试的时候,可能会出现问题,例如找不到对应的MutiModule-captcha的jar文件,这里按照之前的流程,可以将对应的jar上传到本地Nexus私服里面,配置Maven部署构件至Nexus  


    增加配置到pom.xml  


    <!-- 使用maven 部署构件至Nexus -->
    <distributionManagement>  
            <repository>  
                <id>releases</id>  
                <name>Local Nexus Repository</name>  
                <url>http://127.0.0.1:8081/nexus/content/repositories/releases/</url>  
            </repository>  
            <snapshotRepository>  
                <id>Snapshots</id>  
                <name>Local Nexus Repository</name>  
                <url>http://127.0.0.1:8081/nexus/content/repositories/snapshots</url>  
            </snapshotRepository>  
        </distributionManagement>  

    修改Maven conf settings.xml 文件 增加 server配置


    <servers><server>  
        <id>releases</id>  
        <username>admin</username>  
        <password>123admin</password>  
        </server>  
        <server>  
        <id>Snapshots</id>  
        <username>admin</username>  
        <password>123admin</password>  
        </server>   
     </servers>  
     
     url地址要指向Nexus中的实际地址,repository的id与settings.xml中的文件中servers中节点一样。 
     
     这样对MutiModule-captcha 执行 mvn install 

    命令执行顺序

    mvn clean install/deploy 的执行顺序的话, 比如parent service captcha 三个项目,maven 根据自己的Reactor机制决定哪个模块应该先执行,这里service模块依赖于captcha,那么会在captcha先执行 mvn clean install 之后在service执行(由于captcha已经执行,安装到本地Repository中,便能找到依赖的模块)

    但是总体的执行顺序为 parent captcha service,原因在于parent是其他两个模块的父模块,都对他存在依赖关系,但是captcha又被service依赖,所以在captcha执行,最后在service上面执行。

    https://cwiki.apache.org/confluence/display/MAVEN/Maven+3.x+Compatibility+Notes#Maven3.xCompatibilityNotes-UniqueSnapshotVersionsandClassifiers

    http://stackoverflow.com/questions/4275466/how-do-you-deal-with-maven-3-timestamped-snapshots-efficiently

  • 相关阅读:
    取目标描述
    DCLF RCVF SNDF SNDRCVF等用法
    CL过程监控JOB的错误消息
    取用户配置文件属性
    SNDBRKMSG 例子
    信息操作
    文件下载解决中文乱码
    table行的上移下移 上下移动
    常用表操作Sql语句
    sql删除重复行
  • 原文地址:https://www.cnblogs.com/telwanggs/p/6419874.html
Copyright © 2020-2023  润新知