如果已经选择maven作为构建工具,当网络速度很慢或者受到限制,或者像我这样工作的地方就不能上网的,就需要建立一个maven的私服了。我的目的是把外网下载来的整个repository复制到工机器上,然后公开给内网的同事下载。
Maven的私服有Apache的Archiva,JFrog的Artifactory和Sonatype的Nexus,这是选择了Nexus,版本1.9.2.3。
地址google。安装包分为bundle和war两种。bundle自带jetty容器,直接点击脚本nexus.bat运行或者Installnexus安装服务。nexus.bat按CTRL-C停止。War要自己部署。
Bundle解压后有nexus-webapp-*.*.*和sonatypework两个目录。webapp下是运行文件,bat要到nexus-oss-webapp-1.9.2.3\bin\jsw\windows-x86-32找(XP的)。work目录没有时,nexus也会自动创建,里面是数据文件,包括配置、日志和仓库相关文件。运行参数配置在的webapp的/conf/plexus.properties中,application-port设置端口。
打开http://{host}:{port}/nexus之后,默认访问是匿名用户,可以查询以来,查看仓库。Nexus是全面的权限控制功能,要管理,初始用默认admin/admin123登录。
admin登录可以看到更多的操作。点击左边导航的Repositories,右边出现nexus初始建好的仓库。
a. 索引: 开始我们什么都搜不到,是因为搜索需要索引,默认仓库索引的下载enable是false。点击选择仓库,比如"Maven Central"在下面configuration标签页,"Download Remote Indexes”选择true,save,然后右键点击"Maven Central",选择"Update Index"。Nexus会开始下载索引,这个任务可以在做导航区Administration下的Scheduled Tasks下看到。Scheduled Tasks可以配置定时任务,比如定时更新索引,仓库同步,清理等。索引下载需要一点时间,Maven Central的索引有300M+。下载完之后,因该可以搜到常见的jar包了。
b. 搜索:搜索可以按关键字搜索。搜索结果标签页的"Keyword Search"有个向下的三角,点击有下拉选项的,可以选择GAV按groupId、artifactId和version坐标搜索。而且是搜索是支持通配符的。结果下面右边有MavenInformation,下面一段xml方便直接拷贝到pom中。
c. 添加仓库:
仓库分有类型。hosted宿主仓库,本地仓库;proxy代理仓库,代理远程;group,仓库组,管理用;virtual这里不介绍,是为了服务maven1仓库格式的。
仓库属性。仓库格式有maven1和maven2,现在一般是maven2,maven1就不介绍了。属性 policy,表示仓库是Release(就是稳定版本)发布版本,还是Snapshot快照(不稳定,处在开发修改中的)版本。 policy的影响是,开发时我们依赖他人库,当然是希望是稳定的,没问题的,那只需要连到release库,一经下载,就不用再去下载了。当协作开发,依赖了正在开发的,它要声明自己是snapshot,我们要配置更新频率策略,比如一天下载一次。
创建hosted宿主仓库。仓库标签页,Add-->Hosted Repository,看到一个配置页面,属性名字意思清楚,我就不一个一个说。Provider就是仓库格式,现在都是用maven2,Storage Location不要填,默认会是在work目录下。Publish URL是要不要公开到http上供浏览。TTL是设置当一个依赖找不到时,缓存这个找不到结果的时间。这段时间内就不去真搜索,直接返回找不到,为了提高性能减少鸭梨。我见了一个叫local-centre。
创建远程代理proxy仓库。相同的属性就不说了."Download Remote Indexes"下载远程仓库提供的索引,不是每个库都提供。Remote Storage Location是要被代理的仓库地址。我在试验Jira,就填了https://m2proxy.atlassian.com/repository/public/,悲剧的是它不提供索引,但这不意味着下载不到。"Checksum Policy",检验失败后策略。如果有安全密码,Authentication配置上。"Artifact Max Age",表示依赖项的过期重新下载时间。如果是release的,可以设置为-1,下载后就不再下载了。如果是snapshot快照,默认1440分钟,也就是一天更新一次。有个有用的远程仓库是jboss的,http://repository.jboss.org/nexus/content/groups/public-jboss/,而且是提供索引的,有将近400M。
创建仓库组group。选择把哪些仓库加过来时注意排列的顺序就搜索的顺序,把常用可靠的放前面。不过是可以用鼠标上下拖动设置的。
这才是我真正要做到的。相关的内容是从nexus命令工具https://docs.sonatype.com/display/SPRTNXOSS/Nexus+Command+Line+Tools找到的。非常简单,就是把repository下的内容整个拷贝到sonatype-work\nexus\storage下的你目标仓库中。我hosted宿主仓库建了个local-centre,就放在下面。如果你是直接拷贝maven默认的repository,不要把cache文件夹也拷过去~ 然后去页面那右键点击Rebuild Metadata,重建元数据。包含它的组,也都去update index,更新索引。我的一拷贝过去,刷新下就有了,不过还是右键点击了下。这是你就可以在搜索那去验证,搜索一个只有本地库有的。
上面还提供一个分离仓库release和snapshot的工具,简单好用。
我们常需要部署一些不能在公开仓库得到的依赖,比如oracle-jdbc, javaee.jar。或者我们协作开发。TeamA把开发的放到nexus,供TeamB使用,而且是每日构建(通常要为每个项目分配独立仓库),现在大家都敏捷了嘛。
a. 通过maven部署 : 日常开发可以这么部署。这需要在工程的pom文件中配置distributionManagement。示例如下:
代码段01:
Nexus默认匿名用户是只读的。所以还需要在maven的settings.xml中servers节点下配置认证信息(id要与上面相同):
代码段02:
b. 手动部署:在宿主仓库下面最右边的标签页,有个Artifact Upload,可以在此手动上传依赖包。显示定义maven坐标GAV,可以选择导入pom文件,或者手工输入。下面就选择要上传的文件了。
a. Maven的settings.xml的配置 除了代码02权限验证信息,还有一些相关配置。部署Nexus当然是要连接它去用,所以要配置repository,这要用maven的profile机制。在profiles的一级节点下:
代码段03:
要激活使用这个profile(上面的已经是默认激活的),需要再加个一级节点:
代码段04:
如果想让maven只使用我们的私服,需要及一级节点mirrors下面加上:
代码段05:
b. project的pom.xml
重要的就是代码段01了。如果只有当前project使用我们的Nexus私服,可以直接添加代码段03中的<repositories>这一部分,通常都不会这样。
没些权限管理和定时任务了,页面操作就够用了一般。权限管理也是基于user-role模式,预定义了一些use和role。作为helloworld级别的就这么多了。书看了许晓宾的《Maven实战》,还是本好书,觉得是广告的忽略。
其他一些注意的:
最好用标准的jre,不要用java7还,否则可能出"not have a no-args constructor”之类的异常。如果用安装包安装java7,可能会发现该了java
_home也还没用,那就去把system32下面的java.exe删掉。
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder",请看http://nomandia.iteye.com/blog/402826
[WARNING] Using platform encoding 请看http://blog.csdn.net/youshini/article/details/6514925
一下纯属牢骚:
m2e插件干嘛不提供zip包下载啊,不是完全公开的网络,根本就下载不下来。自己家里下载好了,把整个eclipse拷去用,一个clean,build命令又要去网上下maven插件,又得回去下。
Jira才知道被很多开源社区用了。可是用maven又不解决m2e兼容问题,用SDK常这样那样问题。文档多,但结构组织不好,不好找,不易清楚。