`
oywl2008
  • 浏览: 1051225 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

maven2:compile,testing,run,deploy,and more

 
阅读更多

最近在做maven plugin自定义开发方面的研究,顺带把maven相对较系统的回顾了一遍,这个系列的笔记算是一些对maven2.0在软件开发各个生命周期中的使用小结吧。

所谓“万事开头难”,开发一个java application一开始最难的部分就是开始,如此多的逻辑概念的堆积,java代码,资源文件,应用依赖.jar应该如何组织存放?unit testing应该在什么时候执行?项目应该如何build?documented?tested?deployed?

很多工具可以提供项目的build,比如众所周知的ant。这边不做具体说明和对比,我只罗列出maven能给我们带来什么,官方网站给出的benefits list如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->The benefits of Maven 2.0 are numerous, as it does more than merely build your projects. If you are just starting a new Java project
and you need to get started fast, Maven 2.0 will have you up an running in minutes.
The following are some of the advantages of Maven 2.0:
Standardized project layout and project structure generator. 
Standardized dependency-management mechanism. 
Multiple project support. 
Instant downloads of new plugins and features as the developer needs them. 
Website generation for up-to-date project information. 
Integration with source control: CVS and Subversion.

maven带来了标准工程组织结构,标准工程发布管理机制,多重项目支持(模块化规划工程),插件的自主开发接口及可插拔安装,website生成及实时项目信息同步更新,通过与与svn或cvs的集成实现代码版本控制。下面开始介绍maven的使用介绍。

Getting Started:

假设现在开始一个java application的开发,我们可以应用maven来快速构建应用的程序结构,而不需要按以往的习惯在ide中手动进行层级创建,(maven的安装不做介绍)在命令窗口输入命令:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->1 mvn archetype:create -DgroupId=com.as -DartifactId=my-app

 

执行,你会发现maven已经为我们创建了名称为my-app的项目,其中项目结构如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 1 my-app
 2 |----src
 3 |----main
 4 |------java
 5 |--------com
 6 |----------as
 7 |----test
 8 |------java
 9 |--------com
10 |----------as

 

这个结构包含了两个资源目录树:java application code和unit test code。在工程根目录下maven创建了pom.xml文件,是项目的最基本部分(the meat and potatoes )。 pom.xml是一系列的操作集合,用来告诉maven怎么build项目和引入项目build所需要的外部依赖及执行其他特殊操作。默认的,maven会加载junit依赖,来鼓励开发人员对程序代码测试实现。

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 3 
 4 <modelVersion>4.0.0</modelVersion>
 5    <groupId>com.as</groupId>
 6    <artifactId>my-app</artifactId>
 7    <packaging>jar</packaging>
 8    <version>1.0-SNAPSHOT</version>
 9    <name>Maven Quick Start Archetype</name>
10    <url>http://maven.apache.org</url>
11 <dependencies>
12     <dependency>
13         <groupId>junit</groupId>
14         <artifactId>junit</artifactId>
15         <version>3.8.1</version>
16         <scope>test</scope>
17     </dependency>
18 </dependencies>
19 </project>

 

之前的操作已经创建了一个新的项目,并按maven提供的标准程序结构组织各个层次的代码存放目录。还是在命令窗口,切入到工程目录,以下罗列出maven的基本操作命令及说明:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->1 mvn test: 运行应用的所有单元测试。
2 mvn package: 创建打包应用的.jar文件.(pom.xml文件配置为packaging操作为jar操作)
3 mvn install: 安装工程生成jar文件到maven仓库,以提供其他应用依赖应用。
4 mvn site: 生成项目信息网站。
5 mvn clean: 清除应用编译存放目录。
6 mvn eclipse:eclipse: 将应用功能转化为eclipse可以直接导入的工程。

 

现在我们来创建一个基于java语言的web应用,在命令窗口输入:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->1 mvn archetype:create -DgroupId=com.as -DartifactId=my-webapp -DarchetypeArtifactId=maven-archetype-webapp
生成的项目目录结构如下:
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->my-webapp
|----src
|------main
|----resources
|----webapp
|----WEB-INF

 

和之前创建的项目有所不同的是创建一些将被打包到war中的资源目录,并且pom.xml文件中,packaging操作被指定为war而不是之前的jar。而且我们不用去担心在打包成war的时候如何将所有依赖拷贝到WEB-INF/lib目录下,maven会自动的处理这一切。另外,通过修改pom.xml中的build元素的finalName元素值,可以修改打包的war的名称。

Dependency Management :

之前的创建操作,让我们快速拥有了程序架构,那么回过头来关心下maven是如何来管理应用所用到的依赖。应用添加一个依赖是通过在pom.xml中新增dependencies元素的子元素dependency来实现。maven在下次build的时候会读取新增的dependency信息并从远程或本地仓库中下载并加载到工程的build path.比如我们要新增个依赖:quartz ,那么我们只需要在dependencies中增加如下格式的依赖定义:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->1 <dependency>
2   <groupId>quartz</groupId>
3   <artifactId>quartz</artifactId>
4   <version>1.5.1</version>
5   <scope>compile</scope>
6 </dependency>

 

可以不用去关心quartz本身会再用到什么依赖,maven会自动把依赖所用的所有依赖都一起下载到你的本地仓库,并配置到你的工程build path。另外,在之前的junit依赖中,maven设置了其scope为test,那么意味着,maven只会在test phase中加载junit这个依赖。下面罗列出依赖的scope在各个阶段的定义:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->1 compile: 默认值,说明依赖资源必须存在于各个build阶段或任务。
2 test: 只在test阶段加载。
3 runtime: 依赖资源只在运行时加载。
4 provided: 依赖在运行时加载,但是不会出现在打出的包里。类似你要把某个依赖当作jdk的一个部分或者application server classpath.

Configuring Repositories:

项目中的每个开发人员各自定义项目依赖仓库,貌似不是很方便且有点繁琐,为此,maven提供了在同个pom.xml文件中同时定义多个依赖仓库的功能。在下面的pom.xml文件配置片段中,设置了两个依赖仓库配置,默认的仓库依赖路径为Ibiblio,另外添加了个镜像仓库路径作为备选,比如设置为本地局域网内的某个服务器地址,详细配置如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><repositories>
    <repository>
        <id>Ibiblio</id>
        <name>Ibiblio</name>
        <url>http://www.ibiblio.org/maven/</url>
    </repository>
    <repository>
        <id>intranet</id>
        <name>intranet mirror</name>
        <url>http://192.168.1.120/maven2</url>
    </repository>
</repositories>

 

Building Multiple Projects using a Parent pom.xml:

当一个项目分成多个模块子项目进行开发规划的时候,maven提供了通过parent pom.xml文件来进行多样工程配置绑定。 maven的依赖检查机制将分析检查各个子项目所用到的依赖并按互相依赖的顺序build各个子项目。下面举个例子来说明:

parent pom.xml:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 1 <project>
 2     <modelVersion>4.0.0</modelVersion>
 3     <groupId>com.as</groupId>
 4     <version>1.0-SNAPSHOT</version>
 5     <artifactId>my-app</artifactId>
 6     <packaging>pom</packaging>
 7     <modules>
 8       <module>Common</module>
 9       <module>Utilities</module>
10       <module>Application</module>
11       <module>WebApplication</module>
12     </modules>
13 </project>

 

在这里,假设WebApplication需要确定是否包含了其他三个子项目的所有依赖,所以,把其他三个子项目按依赖的形式进行配置到WebApplication中;并且Utilities依赖于Common, Application依赖于Common,Utilities。即体现开发中遇到的各个子模块项目存在相互依赖的情况。接下来,对各个子项目的pom.xml进行配置如下:

Utilities:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><dependencies>
  
<dependency>
    
<groupId>com.as</groupId>
    
<artifactId>Common</artifactId>
    
<version>1.0-SNAPSHOT</version>
  
</dependency>
</dependencies>

 

Application:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><dependencies>
  
<dependency>
    
<groupId>com.as</groupId>
    
<artifactId>Common</artifactId>
    
<version>1.0-SNAPSHOT</version>
  
</dependency>
  
<dependency>
     
<groupId>com.as</groupId>
     
<artifactId>Utilities</artifactId>
     
<version>1.0-SNAPSHOT</version>
   
</dependency>
</dependencies>

 

WebApplication:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><dependencies>
    <dependency>
        <groupId>com.as</groupId>
        <artifactId>Common</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>com.as</groupId>
        <artifactId>Utilities</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>com.as</groupId>
        <artifactId>Application</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>

 

这样,只需要在parent pom.xml中添加各个模块项目的配置,来说明它们是当前build的一部分。

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><parent>
    <groupId>com.as</groupId>
    <artifactId>my-app</artifactId>
    <version>1.0-SNAPSHOT</version>
</parent>

 

Common, Utilities, Application, 和WebApplication目录于parent pom.xml文件存在于同个目录下。在parent pom.xml同级目录下执行maven package命令的时候,各个子模块项目就会按顺序进行build任务了。

Plugins and Reports:

maven2.0提供了方便的plugin注册入口。有点遗憾的是,很多maven1.x 的plugin不能在maven2.0上运行,不过,现在maven2.0的plugin已经很丰富了,所以,这个问题也就不再是问题了。下面是配置jdk 5的编译参数的plugin配置:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>1.5</source>
            <target>1.5</target>
        </configuration>
    </plugin>
</plugins>

 

另外一个使用比较频繁的maven plugin就是maven reporting plugin了,当执行mvn site命令时,这个plugin将发挥它的作用,配置使用如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><reporting>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-project-info-reports-plugin</artifactId>
        </plugin>
    </plugins>
</reporting>

Maven Plugin Matrix(http://docs.codehaus.org/display/MAVEN/Maven+Plugin+Matrix) ,可以搜索到相关plugin可以在说明版本的maven上使用的详细信息。

Maven and Eclipse:

如果你按之前的说明操作,创建了一个新的项目,生成了项目的程序目录结构,你只要在项目的根目录路径下,在命令窗口中执行mvn eclipse:eclipse,就能把当前项目转化为在eclipse ide中可以import到workspace的项目了,这样,在eclipse ide中,就可以很方便的进行进一步的代码实现了。

Conclusion:

maven2.0提供了很多有用且高效的功能,特别是提供程序标准目录结构,这样,在开发的时候就不但可以很方便的把一个项目移动到另个项目,而且可以不用太关心程序目录结构和项目编译说明,maven已经提供了标准 :)

实际应用中,maven也提供了各种build system的自定义扩展,maven可以方便的进行 run nightly,deploy,并分布发送通知信息,从文档方面来说,maven提供了实时的项目信息site生成,每次build完毕,配置自动进行 site信息和项目实际开发进程更新同步.

maven2.0带来的可升级的build配置,方面使用,项目管理,在今后,更多的maven给出的build技术方面的标准的采用,意味着更多的效率,更多的方便。

更详细的信息可以在maven的官方网站得到。

推荐学习maven的书籍: better builds with maven (虽然个人感觉文笔不怎么样,但是,算是市面上唯一比较全面的maven使用介绍比较全的书吧)

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明.

 

 

Link:  http://www.blogjava.net/alex0927/archive/2008/07/04/212639.html

 

 

 

 

 

分享到:
评论

相关推荐

    2000-2021年中国科技统计年鉴(分省年度)面板数据集-最新更新.zip

    2000-2021年中国科技统计年鉴(分省年度)面板数据集-最新更新.zip

    PPT保护工具PDFeditor专业版-精心整理.zip

    PPT保护工具PDFeditor专业版-精心整理.zip

    Spring Boot Docker 项目:含项目构建、镜像创建、应用部署及相关配置文件,容器化部署.zip

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。

    考研英语真题及详解-精心整理.zip

    考研英语真题及详解-精心整理.zip

    Jupyter_AI 人工智慧開發入門.zip

    Jupyter-Notebook

    全国电子地图行政区划道路水系数据-最新shp.zip

    全国电子地图行政区划道路水系数据-最新shp.zip

    Spring Cloud Function RCE 漏洞的 POC 项目,含漏洞利用及相关测试内容.zip

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。

    地级市进出口贸易及外资利用数据(297城)-最新.zip

    地级市进出口贸易及外资利用数据(297城)-最新.zip

    HengCe-18900-2024-2030中国皮革制品市场现状研究分析与发展前景预测报告-样本.docx

    HengCe-18900-2024-2030中国皮革制品市场现状研究分析与发展前景预测报告-样本.docx

    java制作的小游戏,作为巩固java知识之用.zip

    猪脚饭超好吃 java制作的小游戏,作为巩固java知识之用.zip

    基于python的大麦网自动抢票工具的设计与实现(1) - 副本.zip

    【基于Python的大麦网自动抢票工具的设计与实现】 随着互联网技术的发展,网络购票已经成为人们生活中不可或缺的一部分。尤其是在文化娱乐领域,如音乐会、演唱会、戏剧等活动中,热门演出的门票往往在开售后瞬间就被抢购一空。为了解决这个问题,本论文探讨了一种基于Python的自动抢票工具的设计与实现,旨在提高购票的成功率,减轻用户手动抢票的压力。 Python作为一种高级编程语言,因其简洁明了的语法和丰富的第三方库,成为了开发自动化工具的理想选择。Python的特性使得开发过程高效且易于维护。本论文深入介绍了Python语言的基础知识,包括数据类型、控制结构、函数以及模块化编程思想,这些都是构建抢票工具的基础。 自动化工具在现代社会中广泛应用,尤其在网络爬虫、自动化测试等领域。在抢票工具的设计中,主要利用了自动化工具的模拟用户行为、数据解析和定时任务等功能。本论文详细阐述了如何使用Python中的Selenium库来模拟浏览器操作,通过识别网页元素、触发事件,实现对大麦网购票流程的自动化控制。同时,还讨论了BeautifulSoup和requests库在抓取和解析网页数据中的应用。 大麦网作为国内知名的票务平台,其网站结构和购票流程对于抢票工具的实现至关重要。论文中介绍了大麦网的基本情况,包括其业务模式、用户界面特点以及购票流程,为工具的设计提供了实际背景。 在系统需求分析部分,功能需求主要集中在自动登录、监控余票、自动下单和异常处理等方面。抢票工具需要能够自动填充用户信息,实时监控目标演出的票务状态,并在有票时立即下单。此外,为了应对可能出现的网络延迟或服务器错误,工具还需要具备一定的错误恢复能力。性能需求则关注工具的响应速度和稳定性,要求在大量用户同时使用时仍能保持高效运行。 在系统设计阶段,论文详细描述了整体架构,包括前端用户界面、后端逻辑处理以及与大麦网交互的部分。在实现过程中,采用了多线程技术以提高并发性,确保在抢票关键环节的快速响应。此外,还引入了异常处理机制,以应对网络故障或程序错误。 测试与优化是确保抢票工具质量的关键步骤。论文中提到了不同场景下的测试策略,如压力测试、功能测试和性能测试,以验证工具的有效性和稳定性。同时,通过对抢票算法的不断优化,提高工具的成功率。 论文讨论了该工具可能带来的社会影响,包括对消费者体验的改善、对黄牛现象的抑制以及可能引发的公平性问题。此外,还提出了未来的研究方向,如增加多平台支持、优化抢票策略以及考虑云服务的集成,以进一步提升抢票工具的实用性。 本论文全面介绍了基于Python的大麦网自动抢票工具的设计与实现,从理论到实践,从需求分析到系统优化,为读者提供了一个完整的开发案例,对于学习Python编程、自动化工具设计以及理解网络购票市场的运作具有重要的参考价值。

    校园驿站全天候辅助取货管理系统 SSM毕业设计 附带论文.zip

    校园驿站全天候辅助取货管理系统 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B

    1970年至2010年美国所有乳制品的供应和利用情况

    1970年至2010年美国所有乳制品的供应和利用情况

    java-leetcode题解之Possible Bipartition.java

    java基础 java_leetcode题解之Possible Bipartition.java

    基于Java开发的阿里巴巴数据库事业部druid连接池设计源码

    该开源项目为阿里巴巴数据库事业部精心打造的druid连接池设计源码,包含4689个文件,涵盖4069个Java源文件、297个SQL脚本、102个文本文件以及其他多种文件类型。druid连接池以其独特的监控功能,旨在为数据库连接管理提供高效、可靠的解决方案。项目文件类型丰富,包括HTML、JavaScript、CSS和Shell脚本等,适用于多种开发需求。

    Jupyter_一个不会自学的人是没有前途的.zip

    Jupyter-Notebook

    金融风险管理计算手册(CoVaR)最新版.zip

    金融风险管理计算手册(CoVaR)最新版.zip

    网上选课系统 SSM毕业设计 附带论文.zip

    网上选课系统 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B

    腾讯word2vec模型缩小版.zip

    Jupyter-Notebook

    Jupyter_推荐系统入门教程在线阅读地址.zip

    Jupyter-Notebook

Global site tag (gtag.js) - Google Analytics