Maven进阶宝典

前言:

    团队在开发过程中用的是maven项目,由于对maven的一些打包流程以及相关参数配置不是太了解,因此应大家的需求做一下maven的讲解,为了不误导大家,看了很多相关资料,自己也实验了一下,就把自己觉得对大家有用的东西列出来,做了一些简单的介绍,起到抛砖引玉的作用,希望能对大家能有帮助。

一、什么是maven

  Maven是一个Java语言编写的开源项目管理工具,是Apache软件基金会的顶级项目。主要用于项目构建,依赖管理,项目信息管理。

二、Maven诞生的背景

  Maven这个单词来自于意第绪语(犹太语),意为知识的积累,最初在Jakata Turbine项目中用来简化构建过程。当时有一些项目(有各自Ant build文件),仅有细微的差别,而JAR文件都由CVS来维护。于是希望有一种标准化的方式构建项目,一个清晰的方式定义项目的组成,一个容易的方式发布项目的信息,以及一种简单的方式在多个项目中共享JARs。

三、Maven特点

1. maven不仅是构建工具,它还是依赖管理工具和项目管理工具,提供了中央仓库,能够帮我们自动下载构件。

2.为了解决的依赖的增多,版本不一致,版本冲突,依赖臃肿等问题,它通过一个坐标系统来精确地定位每一个构件(artifact)。

3.还能帮助我们分散在各个角落的项目信息,包括项目描述,开发者列表,版本控制系统,许可证,缺陷管理系统地址。

4.maven还为全世界的java开发者提供了一个免费的中央仓库,在其中几乎可以找到任何的流行开源软件。通过衍生工具(Nexus),我们还能对其进行快速搜索

5.maven对于目录结构有要求,约定优于配置,用户在项目间切换就省去了学习成本。

6.跨平台,是声明式的,没有依赖管理。

四、Maven私服的搭建

  一、为什么搭建Maven私服

  有些公司都不提供外网给项目组人员,因此就不能使用maven访问远程的仓库地址,所以很有必要在局域网里找一台有外网权限的机器,搭建nexus私服,然后开发人员连到这台私服上,这样的话就可以通过这台搭建了nexus私服的电脑访问maven的远程仓库。  

二、Maven仓库

       Maven库:

http://repo2.maven.org/maven2/

Maven依赖查询:

http://mvnrepository.com/

      maven的仓库只有两大类:1.本地仓库 2.远程仓库,在远程仓库中又分成了3种:2.1 中央仓库 2.2 私服 2.3 其它公共库;如图:

       1.本地仓库

        Maven在本地存储构件的地方。

       2. 远程仓库

        2.1 中央仓库

          中央仓库是默认的远程仓库,maven在安装的时候,自带的就是中央仓库的配置。

        2.2 私服

          Maven私服的 个特性:

1.节省自己的外网带宽:减少重复请求造成的外网带宽消耗

2.加速Maven构件:如果项目配置了很多外部远程仓库的时候,构建速度就会大大降低

3.部署第三方构件:有些构件无法从外部仓库获得的时候,我们可以把这些构件部署到内部仓库(私服)中,供内部maven项目使用

4.提高稳定性,增强控制:Internet不稳定的时候,maven构建也会变的不稳定,一些私服软件还提供了其他的功能

5.降低中央仓库的负荷:maven中央仓库被请求的数量是巨大的,配置私服也可以大大降低中央仓库的压力

当前主流的maven私服:

1.Apache的Archiva

2.JFrog的Artifactory

3.Sonatype的Nexus

  

三、搭建Maven私服

详细介绍地址:http://www.cnblogs.com/quanyongan/archive/2013/04/24/3037589.html

       http://blog.csdn.net/clj198606061111/article/details/52200928

在安装安装nexus如果出现这种情况:  

以管理员身份运行cmd.exe即可。

五、Maven安装

  安装教程:http://jingyan.baidu.com/article/4f7d5712a1306c1a21192746.html

六、settings.xml配置

   详细介绍地址:http://blog.csdn.net/u014527058/article/details/50906343

七、Maven工程的创建

   省略,这些在网上一搜一大堆,这里就不再啰嗦了。

   知识驿站(具体了解地址:http://blog.csdn.net/cnhk1225/article/details/51189467):

      maven中的仓库分为两种,snapshot快照仓库和release发布仓库。snapshot快照仓库用于保存开发过程中的不稳定版本,release正式仓库则是用来保存稳定的发行版本。定义一个组件/模块为快照版本,只需要在pom文件中在该模块的版本号后加上-SNAPSHOT即可(注意这里必须是大写)

八、pom.xml的配置

  一、插件配置详解地址:

      http://www.cnblogs.com/dennyzhangdd/p/5831112.html

      

  二、Jetty插件运行Maven Web工程

      详细介绍地址:https://my.oschina.net/cokolin/blog/409164

 1 <?xml version="1.0"?>
 2 <plugin>
 3     <groupId>org.mortbay.jetty</groupId>
 4     <artifactId>jetty-maven-plugin</artifactId>
 5     <version>8.1.16.v20140903</version>
 6     <configuration>
 7         <scanIntervalSeconds>5</scanIntervalSeconds>
 8         <webApp>
 9             <contextPath>/ucf-company</contextPath>
10         </webApp>
11         <connectors>
12             <connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector">
13                 <port>9080</port>
14             </connector>
15             <connector implementation="org.eclipse.jetty.server.ssl.SslSelectChannelConnector">
16                 <port>9443</port>
17                 <password>changeit</password>
18             </connector>
19             <!-- 这两个connector的配置要改为: -->
20             <connector implementation="org.eclipse.jetty.server.bio.SocketConnector">
21                 <port>8080</port>
22             </connector>
23             <connector implementation="org.eclipse.jetty.server.ssl.SslSocketConnector">
24                 <port>8443</port>
25                 <password>changeit</password>
26             </connector>
27         </connectors>
28     </configuration>
29 </plugin>

  三、Maven混淆代码

      Maven的proguard插件只能混淆jar包。如果要混淆Web项目则将Web混淆的工程jar的classes替换打的war包的classes文件夹即可。

 

      研究过程出现的问题:

          如果没有<injar></injar>会报如下错误信息:       

1 [ERROR] Failed to execute goal com.github.wvengen:proguard-maven-plugin:2.0.7:proguard (default) on project ucf-company: Obfuscation failed (result=1) -> [Help 1]
2 [ERROR]
3 [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
4 [ERROR] Re-run Maven using the -X switch to enable full debug logging.
5 [ERROR]
6 [ERROR] For more information about the errors and possible solutions, please read the following articles:
7 [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

      具体实现参照地址:

      http://www.cnblogs.com/yanduanduan/p/5340060.html

      http://blog.csdn.net/wltj920/article/details/48970869

  四、Maven打包时动态替换properties资源文件中的配置值:

 1 <profiles>
 2     <!-- 开发/测试环境,默认激活 -->
 3     <profile>
 4         <id>dev</id>
 5         <properties>
 6             <env>dev</env>
 7         </properties>
 8         <activation>
 9             <activeByDefault>true</activeByDefault>
10             <!--默认启用的是dev环境配置-->
11         </activation>
12     </profile>
13     <!-- 生产环境 -->
14     <profile>
15         <id>prod</id>
16         <properties>
17             <env>prod</env>
18         </properties>
19     </profile>
20     <!-- qa环境 -->
21     <profile>
22         <id>qa</id>
23         <properties>
24             <env>qa</env>
25         </properties>
26     </profile>
27 </profiles>
28 <build>
29     <filters>
30         <!-- 指定使用的 filter -->
31         <filter>src/main/resources/filter/${env}.properties</filter>
32     </filters>
33     <resources>
34         <resource>
35             <!-- 配置需要被替换的资源文件路径, db.properties 应该在 src/main/resource 目录下 -->
36             <directory>src/main/resources</directory>
37             <filtering>true</filtering>
38             <!-- 是否使用过滤器 -->
39         </resource>
40     </resources>
41 </build>

九、Maven配置多模块项目

    用项目层次的划分替代包层次的划分能给我们带来如下好处:

    1. 方便重用,如果你有一个新的swing项目需要用到app-dao和app-service,添加对它们的依赖即可,你不再需要去依赖一个WAR。而有些模块,如app-util,完全可以渐渐进化成公司的一份基础工具类库,供所有项目使用。这是模块化最重要的一个目的。
    2. 由于你现在划分了模块,每个模块的配置都在各自的pom.xml里,不用再到一个混乱的纷繁复杂的总的POM中寻找自己的配置。
    3. 如果你只是在app-dao上工作,你不再需要build整个项目,只要在app-dao目录运行mvn命令进行build即可,这样可以节省时间,尤其是当项目越来越复杂,build越来越耗时后。
    4. 某些模块,如app-util被所有人依赖,但你不想给所有人修改,现在你完全可以从这个项目结构出来,做成另外一个项目,svn只给特定的人访问,但仍提供jar给别人使用。
    5. 多模块的Maven项目结构支持一些Maven的更有趣的特性(如DepencencyManagement),这留作以后讨论。

      一个简单的Maven模块结构是这样的:

      ---- app-parent

|-- pom.xml (pom)

|

|-- app-util

|        |-- pom.xml (jar)

|

|-- app-dao

|        |-- pom.xml (jar)

|

|-- app-service

|        |-- pom.xml (jar)

|

|-- app-web

|-- pom.xml (war)

创建Maven多模块项目参照地址:http://www.cnblogs.com/huboking/p/4351921.html

十、Maven常用命令

mvn  help:system 自动在本用户下创建   ~/.m2/repository
mvn clean compile     清理编译
mvn clean test  清理测试
mvn clean package 清理打包
mvn clean install  清理将打包好的jar存入 本地仓库  注意是本地仓库
mvn archetype:generate 使用Archetype生成项目骨架
mvn clean deploy  根据pom中的配置信息将项目发布到远程仓库中

十一、Maven常见错误排查

一.Maven工程出现红差解决方法:

进行maven clean、update,然后进行工程clean、tomcat clean,如果还没有去掉则说明是工程代码有问题,不属于工程环境的问题。

二.Maven工程出现感叹号解决方法:

产生原因:
因为一些maven管理的jar没能正确下载。

先查看buildpath,找问题的jar包,之后再一个个解决

对这些有问题的jar,是因为当前的maven仓库无法找到,所以可以通过如下方法添加能找到相应jar的maven仓库:

1.在google中直接搜索相应jar,比如:jmxri-1.2.1.jar

2.在搜索结果中找到有这个jar的maven仓库,并加入到setting.xml中。

3.重新对项目进行 右键 - maven - update dependencies。

十二、cargo远程部署项目到tomcat

tomcat-users.xml,至少要添加manager,manager-gui,manager-script,manager-jmx,manager-status,添加权限

<tomcat-users>
   <role rolename="tomcat"/>
   <role rolename="role1"/>
   <role rolename="manager"/>
   <role rolename="admin"/>
   <role rolename="manager-gui"/>
   <role rolename="manager-script"/>
   <role rolename="manager-jmx"/>
  <role rolename="manager-status"/>

   <!--admin角色没有的要注意添上-->
   <user username="tomcat" password="tomcat" roles="tomcat"/>
   <user username="admin" password="admin" roles="admin,manager,tomcat,manager-gui,manager-script,manager-jmx,manager-status"/>
   <!--你用哪个用户做管理员,则需要分配相应的角色,我给admin用户分配了admin和manager连个角色-->
 </tomcat-users>

注意:当解压的项目已存在时,会部署不成功,需要在context.xml中再Context标签中加入antiResourceLocking="true" 就可以了。

新版无需修改maven的settings.xml文件,网上很多误导别人的

mvn cargo:redeploy

<!-- 远程部署 ,tomcat必须启动-->      

            <plugin>
                <groupId>org.codehaus.cargo</groupId>
                <artifactId>cargo-maven2-plugin</artifactId>
                <version>1.4.9</version>
                <configuration>
                    <container>
                        <containerId>tomcat7x</containerId>
                        <type>remote</type>
                    </container>
                    <configuration>
                        <type>runtime</type>
                        <properties>
                            <cargo.remote.uri>http://${tomcat.host}:${tomcat.port}/manager/text</cargo.remote.uri>
                            <cargo.remote.username>${tomcat.username}</cargo.remote.username>
                            <cargo.remote.password>${tomcat.password}</cargo.remote.password>
                        </properties>
                    </configuration>
                </configuration>
            </plugin>
时间: 2024-10-29 19:10:41

Maven进阶宝典的相关文章

用起来超爽的Maven——进阶篇

以后随着使用的maven的频率增加,此文件会越来越大,也是为什么需要把默认C:\Users\Administrator\.m2\repository目录改变为D:/OpenSources/repository(1,C盘空间不足2,系统出现问题,重装本地仓库被覆盖) 一.Eclipse Maven插件安装: 下载最新JAVAEE版本的Eclipse,默认已经内置maven插件 下载地址: http://www.eclipse.org/downloads/packages/eclipse-ide-j

Maven 进阶

一.Maven 版本管理 Maven 的推荐版本号约定为:主版本号.次版本号.增量版本号-<里程碑版本> 开发中的版本要以 -SNAPSHOT 结尾,因为这种快照版本是支持 jar 包被覆盖的,那么,开发时候的 Maven 命令应该使用 mvn clean package -U (强制拉一次) 快照版本可以升级为正式版本的条件: 所以自动化测试应对全部通过 项目没有配置任何快照版本的依赖 项目没有配置任何快照版本的插件 项目所包含的代码已经全部提交到版本控制系统中 二.Maven 生命周期和常

【连载】Maven系列(三) 进阶

相关文章: 1.<用起来超爽的Maven--入门篇> 2.<用起来超爽的Maven--进阶篇> 一.Maven坐标: Maven世界拥有大量须要构建jar文件,我们须要找一个用来唯一标识一个构建jar文件的统一规范.那么拥有了统一规范,就能够把查找工作交给电脑来完毕,从而自己主动下载jar文件到本地仓库. Maven坐标是通过一些元素定义的,它们是groupId,artifactId,version,packaging,class-sifer groupId:定义当前Maven项目

【连载】Maven系列(四)——配置私服

相关文章 1.<用起来超爽的Maven--入门篇> 2.<用起来超爽的Maven--进阶篇> 3.<Maven系列(三)   进阶> 一.为什么需要私服 有些公司并不提供外网给程序员,因此不能使用maven访问远程的仓库地址,所以很有必要在局域网里找一台有外网权限的机器:搭建nexus私服,然后程序员连到这台私服上,这样的话就可以通过这台搭建了nexus私服的电脑访问maven的远程仓库. 二.配置步骤 第一步:下载nexus-2.6.4-02.war包,然后拷贝到to

常用SQL_官方文档使用

SQL语句基础理论 SQL是操作和检索关系型数据库的标准语言,标准SQL语句可用于操作关系型数据库. 5大主要类型: ①DQL(Data Query Language,数据查询语言)语句,主要由于select关键字完成,查询语句是SQL语句中最复杂,功能最丰富的语句. ②DML(Data Munipulation Language,数据操作语言)语句,DML语句修改后数据将保持较好的一致性:操作表的语句,如增插insert.更新update.删除delete等: ③DDL(Data Defini

计算机程序员书籍推荐

推荐计算机类必读书籍:第一阶段:<C语言程序与设计><Java通识><C++进阶宝典><Swift入门与实践>第二阶段:<教你怎么不生气><佛经><老子><沉默的愤怒>第三阶段:<颈椎病康复指南><腰椎间盘突出日常护理><心脏病的预防与防治><高血压降压宝典><强迫症的自我恢复><精神病症状学>第四阶段:<活着>

Html 之菜单导航

网页菜单 网页菜单是一个网页的重要部分,它提供了用户可以对网站所有页面的导航,也是可能是内容的分类,例如淘宝  衣服 鞋子 水果 电脑 等等之类,也可以是 类似于游戏宣传网页一样子,酷炫的js特效 flash特效 等等. 菜单是很重要的部分 那么菜单的设计和布局,也需要熟知道,那么我们找个某网的菜单,来仿照做一 个简单的web网页间跳转 导航. 需要用的一些标记: <a> 标记,它就是一个超链接标记 HTML超链接 <img>标记,显示图片使用的标记  HTML图片 一些 css

R语言中文社区历史文章整理(类型篇)

R语言中文社区历史文章整理(类型篇) R包: R语言交互式绘制杭州市地图:leafletCN包简介 clickpaste包介绍 igraph包快速上手 jiebaR,从入门到喜欢 Catterplots包,让你绘制不一样的图 今天再来谈谈REmap包 ggplot2你需要知道的都在这... R访问数据库管理系统(通过RODBC包和RMySQL包两种方式) NLP--自然语言处理(三)text2vec包 Rattle:数据挖掘的界面化操作 借助caret包实现特征选择的工作 R语言的高质量图形渲染

2018年最新Python书单

Python这个"无所不在"的编程语言,学会它,薪资高到没朋友.2018年初这些Python新书值得关注,正要踏入Python学堂的,一定要收藏.号外,异步社区招募书评人,如果你意向加入,在微信后台回复"书评",即可加入我们,免费读新书.下面来一起看看有哪些Python新书吧.<Python程序设计(第3版)>Python之父作序推荐 Python编程入门经典编辑推荐: 广泛使用计算机图形学--本书提供一个简单的图形软件包graphics.py作为示例.