Maven目录分析
通常在安装Maven时,都会设置M2_HOME这个环境变量,M2_HOME指代了Maven的安装目录,下面是目录结构:
bin
boot
lib
LICENSE.txt
NOTICE.txt
README.txt
bin目录是?
1、该目录包含了mvn运行的脚本
2、mvn是基于UNIX平台的shell脚本,mvn.bat是基于Windows平台的bat脚本,命令行输入任何一条mvn命令时,实际上时在调用这些脚本,然后执行Java命令,是的maven的运行需要java的环境
3、该目录还包含了mvnDebug和mvnDebug.bat两个文件,mvnDebug与mvn有什么区别呢?打开文件查看之,两者基本上是一样的,只是mvnDebug多了一条MAVEN_DEBUG_OPTS配置,起作用就是在运行Maven时开启debug,以便调试Maven本身
4、该目录还包含m2.conf文件,这是classworlds的配置文件
5、包含文件mvn、mvn.bat、 mvnDebug 、mvnDebug.bat、m2.conf
调试Maven本身?如何调试?
classworlds是干什么的?
boot目录是?
1、该目录只包含一个文件plexus-classworlds-2.2.3.jar
2、plexus-classwords是一个类加载器框架,相对于默认的java类加载器,它提供了更丰富的语法以方便配置
3、Maven使用该框架加载自己的类库
4、参考http://classworlds.codehaus.org/
conf目录是?
1、该目录包含了一个非常重要的settings.xml
2、修改该文件,就能在机器上全局地定制Maven的行为
3、一般我们会将该文件复制到~/.m2/目录下(~表示当前用户目录),然后修改该文件,在用户范围定制Maven的行为
lib目录是?
1、该目录包含了所有Maven运行时需要的Java的类库
2、Maven本身是分模块开发的,因此用户能看到诸如maven-core-3.0.jar、maven-model-3.0.jar之类的文件
3、此外还包含了第三方依赖,如common-cli-1.2.jar、google-collection-1.0.jar等
对于Maven2来说lib目录有些不同
1、该目录只包含一个如maven-2.2.1-uber.jar的文件
2、原本各为独立JAR文件的Maven模块和第三方类库都被拆解后重新合并到这个jar文件中
3用户可以在这个jar文件中找到Maven内置的超级POM
LICENSE.txt文件是?
记录了Maven使用的软件许可证Apache.License Version 2.0
NOTICE.txt文件是?
记录了Maven包含的第三方软件
README.txt文件是?
包含了Maven的简要介绍,包括安装需求及如何安装简要指令等
非常有用的mvn help:system命令
1、该命令会打印出所有的Java系统属性和环境变量
2、执行该命令Maven会下载maven-help-plugin,包括pom文件和jar文件,这些文件都被下载到了Maven本地仓库中
3、默认情况,可以到~/.m2/repository/org/apache/maven/plugins/maven-help-plugins/目录下找到刚才下载的maven-help-plugin的pom文件和jar文件
~/.m2目录
1、默认情况下,该文件夹下放置了Maven本地仓库.m2/repository
2、所有的Maven构建都被存储到该仓库中,以方便重用
4、默认情况,~/.m2目录下除了repository仓库之外就没有其他目录和文件,不过大多数Maven用户需要复制M2_HOME/conf/settings.xml文件到~/.m2/settings.xml,这是一条最佳实践
设置HTTP代理
有时候你所在的公司基于安全因素考虑,要求你使用通过安全认证的带来访问因特网。这种情况下,你需要为Maven配置HTTP代理,才能让它正常访问外部仓库,以下载所需要的资源
如何设置HTTP代理
1、首先检查代理服务器是否能正常的访问
2、代理服务器的IP可能是218.14.227.197 端口号为3128
编辑~/.m2/setting.xml文件,添加代理配置如下:
<setting>
...
<proxies>
<proxy>
<id>my-proxy</id>
<active>true</active>
<protocol>http</protocol>
<host>218.14.227.197</host>
<port>3128</port>
<!--
<username>XXX</username>
<password>XXX</password>
<nonProxyHosts>repository.mycom.com | *.google.com</nonProxyHosts>
-->
</proxy>
</proxies>
...
</setting>
配置说明:
1、proxies下面可以配置多个proxy元素,如果声明多个proxy元素,则默认情况下第一个被激活的proxy会生效
2、id为my-proxy的代理,active的值为true表示激活该代理,protocol表示使用代理协议为http,最重要的是正确的host和port,如果代理需要认证的话配置username和password,nonPoxyHost元素用来指定哪些主机名不需要代理,可以使用 "|" 符号来分个主机名,可以使用通配符*.google.com
Eclipse非常优秀的IDE
Eclipse是一款非常优秀的IDE,除了基本的语法标亮、代码补齐、XML编辑等基本功能外,最新版本的Eclipse还能很好地支持重构,并且集成JUnit、CVS、Mylyn等各种流行工具,可惜Eclipse默认没有集成对Maven的支持,幸运的是,由Maven之父Jason Van Zyl创立的Sonatype公司建立了m2eclipse项目,这是Eclipse下的一款十分强大的Maven插件,
可以访问http://m2eclipse.sonatype.org/了解更多该项目的信息
安装m2eclipse
1、使用Eclipse Marketplace搜索m2eclipse下载Maven Integration for Eclipse(Luna and newer) 1.5
2、m2eclipse的核心模块就是Maven Integration for Eclipse
3、m2eclipse使用的开源许可证是Eclipse Public License v1.0
4、除了核心组件之外,m2eclipse还提供了一组额外的组件,主要是为了方便与其他工具如Subversion进行集成,这些组件的安装地址为http://m2eclipse.sonatype.org/sites/m2e-extras
简单介绍一下这些组件的用途
重要的:
1、Maven SCM handler for Subclipse (Optional):Subversion是非常流行的版本管理工具
该模块能够帮助我们直接从Subversion服务器签出Maven项目,不过前提是需要首先安装Subclipse (http://subclipse.tigris.org/)
2、Maven SCM Integration (Optional): Eclipse环境中Maven与SCM集成核心的模块。它利用各种SCM工具如SVN实现Maven项目的签出和具体化等操作
不重要的:
3、Maven issue tracking configurator for Mylyn 3.x (Optional):该模块能够帮助我们使用POM中的缺陷跟踪系统信息链接Mylyn至服务器
4、Maven SCM handler for Team/CVS (Optional):该模块帮助我们从CVS服务器签出Maven项目,如果还在使用CVS,就需要安装它
5、Maven Integration for WTP (Optional):使用该模块可以让Eclipse自动读取POM信息并配置WTP项目
6、M2Eclipse Extensions Development Support (Optional): 用来支持扩展m2eclipse,一般用户不会用到
7、Project configurators for commonly used maven plugins (temporary):一个临时的组件,用来支持一些Maven插件与Eclipse的集成,建议安装。
以上的这些模块在http://m2eclipse.sonatype.org/sites/m2e-extras已经找不到了,如果想要安装指定的插件,自己在Eclipse marketplace自己搜索吧
如何在Eclipse中验证某个插件是否正确安装?
1、首先,单击菜单栏中的Help
2、然后选择About Eclipse,在弹出的对话框中,单击Installation Details按钮,会得到一个对话框
3、在Installed Software标签中,检查该模块是否在这个列表中
一个非常常见的错误
在安装Maven的时候,经常会出现一个这样的错误:
09-10-6 上午01时14分49秒:Eclipse is running in a JRE, but a JDK is reuqired
Some Maven plugins may not work when importing projects or updating or updating source folders
这是因为Eclipse默认是运行在JRE上的,而m2eclipse的一些功能要求使用JDK。
解决方法之一:将Eclipse默认运行的JRE改成我们自己安装的JDK
安装NetBeans Maven插件
略
Maven安装的最佳实践
1、设置MAVEN_OPTS环境变量
2、配置用户范围settings.xml
3、不要使用IDE内嵌的Maven
设置MAVEN_OPTS环境变量干什么?
1、运行mvn命令实际上执行的是Java的命令,Java命令可用的参数也可以用在mvn命令
2、通常需要设置MAVEN_OPTS的值为-Xms138m -Xms512m,因为Java默认的最大可用内存往往不能满足Maven运行的需要,比如在项目较大时,使用Maven生成项目站点需要占用大量的内存,如果没有该配置,则很容易得到java.lang.OutOfMemeoryError
注意:尽量不要修改mvn.bat或者mvn这两个Maven执行脚本,如果要升级Maven时不得不再次修改,一来麻烦,二来容易忘记,同理也不要去修改任何Maven安装目录下的文件
settings.xml文件的一些说明
1、Maven用户可以选择配置 M2_HOME/conf/settings.xml或者~/.m2/settings.xml,前者是全局范围的,整台机器上的所有用户都会直接受到该配置的影响,而后者是用户范围的,只有当前用户才会受到该配置的影响
2、推荐使用用户范围的settings.xml,主要是为了避免无意识地影响到系统中的其他用户,如果有切实的需求,需要统一系统中所有用户的setting.xml配置,当然应该使用全局范围的setting.xml
3、配置用户范围的settings.xml文件还便于Maven的升级,直接修改conf目录下的settings.xml会导致Maven升级不便,每次升级到新版本的Maven,都需要复制settings.xml文件,如果使用~/.m2目录下的settings.xml,就不会影响到Maven安装文件,升级时就不需要触动settings.xml文件
为什么不要使用IDE内嵌的Maven?
无论Eclipse还是NetBeans,当集成Maven时,都会安装上一个内嵌的Maven,这个内嵌的Maven通常会比较新,但不一定很稳定,而且往往也会和在命令行使用的Maven不是同一个版本
使用IDE内嵌的Maven会出现两个潜在的问题
1、较新版本的Maven存在很多不稳定因素,容易造成一些难以理解的问题
2、除了IDE,也经常还会使用命令行的Maven,如果版本不一致,容易造成构建行为的不一致,这是我们所不希望看到的。
所以应该在IDE中配置Maven插件时使用与命令行一致的Maven