第三章节介绍setting配置文件,它有两种作用域,
第一种作用域是全局的,它位于MAVEN_HOME/conf/settings.xml
第二种作用域是关联用户的,它位于USER_HOME/.m2/setting.xml
第三种作用域是项目相关的,即项目下的pom.xml。
它的全部配置项如下
<!-- 配置 --> <settings> <localRepository></localRepository> <interactiveMode></interactiveMode> <usePluginRegistry></usePluginRegistry> <offline></offline> <pluginGroups></pluginGroups> <servers></servers> <mirrors></mirrors> <proxies></proxies> <profiles></profiles> <activeProfiles><activeProfiles> </settings>
1、仓库
Maven的仓库有三种,第一种是本地的Maven仓库。第二种是内部搭建的Maven仓库,例如所在的公司使用Nexus搭建了自己使用的Maven库。第三种是比较权威的Maven仓库,例如Maven的中央仓库,阿里的Maven库等。
配置本地版本库的项是:
<localRepository></localRepository>
它的值是本地Maven仓库的路径,默认没有配置,此时默认本地仓库的地址是User_HOME/.m2。
2、服务器
在使用Maven时,项目的依赖会从服务器上下载,依赖分为两种,一种是插件的版本库,一种是Jar包的版本库。
在settings.xml中与服务器相关的配置有三个,分别是servers, mirrors, proxies。
2.1 servers
Servers在配置与服务器建立连接时需要的信息,以及请求的相关参数。
若服务器需要用户名和密码验证(公开的基本上没有):
<server> <id>插件库或依赖库的ID,即repositories--repository下定义的ID</id> <username>用户名</username> <password>密码</password> </server>
若服务器需要其他配置信息
<server> <id></id> <configuration> <httpConfiguration> <get> <readTimeout>100000</readTimeout> <connectionTimeout>100000</connectionTimeout> </get> </httpConfiguration> </configuration> </server>
下面的configuration配置相当于配置请求的相关信息。readTimeout,最大的连接超时时间;connectionTimeout,与服务器建立连接的时间。
若服务器需要SSH安全机制,
<server> <id>插件库或依赖库的ID,即repositories--repository下定义的ID</id> <privateKey>私有key的路径</privateKey> <passphrase></passphrase> </server>
privateKey用于指定秘钥的路径,其实除了id,其他都是由应用场景决定的。
2.2 mirrors
配置服务器的镜像,服务器的镜像是在不同地区搭建的服务器,主要的目的是解决网络的问题。
例如某大型公司,它在美国拥有自己的服务器,但是我们在亚洲,访问到美国的服务器非常慢,所以它决定在亚洲建立一个镜像服务器,例如在香港,或新加坡,此时设置服务器地址为香港或新加坡的镜像,网络状况就会变的非常好。至于镜像服务器与美国的主服务器是如何同步数据的,这不是我们关系的问题。
mirrors的配置项如下:
<mirror> <id>镜像的ID</id> <name>镜像服务器的名称</name> <mirrorOf>镜像服务器的主服务器</mirrorOf> <url>镜像服务器的地址</url> </mirror>
其中id,name,url都很常见。
mirrorOf,它是镜像服务器关联的主服务器。它有三种写法。
- 第一种全部,使用符号*
- 第二种列表,使用repo1, repo2。
- 第三种关键字,使用external:*
<mirror> <id>镜像的ID</id> <name>镜像服务器的名称</name> <mirrorOf>镜像服务器的主服务器</mirrorOf> <url>镜像服务器的地址</url> </mirror>
以镜像的概念去理解,镜像本质是由服务器提供方搭建的,它是有限的,Maven仓库的镜像有四个,USA California,USA North Carolina, United Kingdom,France。在亚洲都是没有镜像的。
若更抽象的去理解,镜像的作用就是说去访问主服务器时网络状况不好,反而去访问镜像服务器。镜像服务器无需配置为上述四个。
假设用户访问XX.jar包,它访问主服务器,发现配置镜像,转而去请求镜像服务器,镜像服务器上存在XX.jar,请求成功。若镜像服务器上不存在XX.jar,它再去请求主服务器。
这里有两个关键点:
- 镜像服务器访问主服务器的速度要优于直接访问主服务器。
- 镜像服务器上存在的资源比率越高,产生的二次请求越少。
总之一点,配置镜像会让你的请求网络状况变好。若我们访问主服务器都很快的时候,根本不需要镜像。
2.3 代理
配置代理服务器,但凡在国内使用过谷歌的都知道代理是怎么回事。
代理的配置项如下:
<proxy> <id>optional</id> <active>true</active> <protocol>代理服务器的协议</protocol> <username>用户名</username> <password>密码</password> <host>代理服务器的IP</host> <port>代理服务器的端口号</port> <nonProxyHosts>无需代理的域名</nonProxyHosts> </proxy>
代理服务器是解除了限制,至于网速快不快说不准。最常见的场景就是在国内无法访问谷歌,添加代理服务器之后就可以访问了。
Maven仓库在国内的话,还是可以访问到的,没有啥限制,主要是网速。所以配置镜像会比代理好点(个人经验)。
3、插件组
pluginGroup全局设置插件的group ID,默认的全局group Id是org.apache.maven.plugins,org.codehaus.mojo。
4、profile
熟悉spring的都知道,spring-core也有profile的概念,它是根据激活的profile加载不同的配置项,最常见的就是测试时激活test,开发时激活dev,发布时激活release。在maven中profile的含义也是相同的。
它的配置项如下:
<profile> <id>env-dev</id> <activation> <property> <name>target-env</name> <value>dev</value> </property> </activation> <properties> <tomcatPath>/path/to/tomcat/instance</tomcatPath> </properties> </profile>
它是将profile Id与配置项关联起来,对配置项有哪些内容没有约束。
5、加密
在配置文件中直接编写敏感信息是不安全的,最常见的就是密码。Maven支持加密。具体的步骤如下:
第一步,设置主密码,它相当于一把钥匙, 可以用它来解密加密后的密码,它自身无法被解密。
mvn -emp your_master_word
第二步,在USER_HOME/.m2目录下创建settingsSecurity.xml文件,其中
<settingsSecurity> <master> your_master_password(after encrypt) </master> </settingsSecurity>
第三步,设置密码,此时的密码可以在setting.xml中使用。
mvn -ep your_password
第四步,若想修改主密码的位置,可以在settingsSecurity.xml下配置relocation
<settingsSecurity> <relocation> 主密码的存放位置 </relocation> </settingsSecurity>
这个配置没啥用,有点自欺欺人的感觉。原著中指只有当路径重定向到你私人的U盘时才会起进一步保护的效果。
6、日志
在MAVEN_HOME/conf/logging/simpleLogger.properties是Maven默认的日志,可以通过修改它,实现自定义Maven的日志。
下面是它的源码:
org.slf4j.simpleLogger.defaultLogLevel=info org.slf4j.simpleLogger.showDateTime=false org.slf4j.simpleLogger.showThreadName=false org.slf4j.simpleLogger.showLogName=false org.slf4j.simpleLogger.logFile=System.out org.slf4j.simpleLogger.cacheOutputStream=true org.slf4j.simpleLogger.levelInBrackets=true org.slf4j.simpleLogger.log.Sisu=info org.slf4j.simpleLogger.warnLevelString=WARNING org.slf4j.simpleLogger.log.org.apache.maven.wagon.providers.http.httpclient=off org.slf4j.simpleLogger.log.org.apache.maven.wagon.providers.http.httpclient.wire=off
这些配置很类似log4j,logback。
- defaultLogLevel:默认的日志级别,info
- showDateTime:每一条日志上显示时间
- showThreadName:每一条日志上显示线程名称
- showLogName:每一条日志上显示logger的名称
- logfile:默认的输出流,System.out,可以重定向到文件中
- cacheOutputStream:缓存输出流,提升性能,设置为true
- levelInBrackets:日志级别显示在方括号中。
其他不经常使用,此处省略。