问题现象:
在写对外接口的时候,出现一个异常现象。bean加载抛出空指针。开始的时候,
不知道异常从哪里抛出。现有的代码是没有的。后来发现出现在第三方类中,决定使用debug调试。发现把依赖包的源码下载下来以后,可以很方便的进入到依赖的jar包中进行debug,发现对源码的debug是一个阅读源码很方便的方式。
【回答】是有关系的,如果setting.xml中不做任何的配置,默认会去指定的maven中央仓库获取jar包和源代码。但是如果在setting.xml中配置了私服地址,会根据地址登录私服获取,由于公司的私服是内网,切换到外围链接不上,肯定是下载不了源码的。
setting.xml 文件中内容:
<localRepository>/path/to/local/repo</localRepository>
<interactiveMode>true</interactiveMode>
<pluginGroups>
</pluginGroups>
<proxies>
<proxy>
<id>optional</id>
<active>true</active>
<protocol>http</protocol>
<username>proxyuser</username>
<password>proxypass</password>
<host>proxy.host.net</host>
<port>80</port>
<nonProxyHosts>local.net|some.host.com</nonProxyHosts>
</proxy>
</proxies>
<servers>
<server>
<id>nexus-releases</id>
<username>paic_deploy</username>
<password>paic_deploy_123</password>
</server>
<server>
<id>nexus-snapshots</id>
<username>paic_deploy</username>
<password>paic_deploy_123</password>
</server>
</servers>
<mirrors>
<mirror>
<id>nexus</id>
<mirrorOf>central</mirrorOf>
<name>Pingan Nexus Repository</name>
<url>http://maven.paic.com.cn/repository/maven-public</url>
</mirror>
</mirrors>
<profiles>
</profiles>
<servers></servers>
servers 指登录远程服务器的基本信息,配置了 username 和 password。注意: nexus-releases 是发布版本,nexus-snapshots是快照版本。(镜像仓库中怎么出现了发布版本和快照版本,区别在哪里? 使用场景是什么?)
<mirrors>
<mirror>
<id>nexus</id>
<mirrorOf>central</mirrorOf>
<name>Pingan Nexus Repository</name>
<url>http://maven.paic.com.cn/repository/maven-public</url>
</mirror>
</mirrors>
镜像仓库用于定义一系列的远程仓库的镜像。我们可以在pom中定义一个下载工件的时候所使用的远程仓库。但是有时候这个远程仓库会比较忙,所以这个时候人们就想着给它创建镜像以缓解远程仓库的压力,也就是说会把对远程仓库的请求转换到对其镜像地址的请求。每个远程仓库都会有一个id,这样我们就可以创建自己的mirror来关联到该仓库,那么以后需要从远程仓库下载工件的时候Maven就可以从我们定义好的mirror站点来下载,这可以很好的缓解我们远程仓库的压力。在我们定义的mirror中每个远程仓库都只能有一个mirror与它关联,也就是说你不能同时配置多个mirror的mirrorOf指向同一个repositoryId。
maven 的 基本知识
本地仓库 :
在每个开发者本地的一个仓库,在setting.xml文件中配置的路径。第一次运行maven的时候,会在本地创建一个仓库,并且直接把远程的jar包下载到本地。下次配置的时候,如果本地存在jar包,就直接从本地获取。
远程仓库 :
maven工程中,只有本地仓库和远程仓库之说。一个普通只能有一个本地仓库,但是可以配置多个远程仓库。
中央仓库 :
中央仓库属于远程仓库中的一种,是maven核心自带的远程仓库。它包含了大部分的开源构件,在默认配置下,当本地仓库没有maven需要的构建时候,它就会尝试从远程的中央仓库下载。
私服 :
私服是特殊的一种远程仓库,为了节省时间和带宽。在局域网内假设的一个私有的仓库服务器,用来代理所有外部的远程仓库。内部的项目或者jar包,还能部署到私服上供其他的项目下载。 也可以降低中央仓库的负荷。
其它公共库
除了中央库和私服,还有很多其他的远程仓库,常见的有java.net.maven 库 和 JBoss Maven 库等。
maven中插件功能的实现
Maven引入本地包,这个包不存在远程仓库中
<dependency>
<groupId>com.pingan.UnionSM2</groupId>
<artifactId>UnionSM2</artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${project.baseddir}/lib/UnionSM2.jar</systemPath>
</dependency>
其中 scope 是用来限制依赖的作用范围,如果配置scope为system表示以外部jar包的形式来引入这个jar,maven不会到内部仓库中去查找它的存在。
systemPath 这个标签表示外部jar包的路径。${project.baseddir}表示所在工程的根目录。一般在工程下创建一个lib包,然后把依赖jar放入在lib包中。
这样就可以maven引入本地包了。