部署nexus私服

如果已经选择maven作为构建工具,当网络速度很慢或者受到限制,或者像我这样工作的地方就不能上网的,就需要建立一个maven的私服了。我的目的是把外网下载来的整个repository复制到工机器上,然后公开给内网的同事下载。

Maven的私服有Apache的Archiva,JFrog的Artifactory和Sonatype的Nexus,这是选择了Nexus,版本1.9.2.3。

1.下载安装

    地址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设置端口。

2.基本的使用

    打开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。选择把哪些仓库加过来时注意排列的顺序就搜索的顺序,把常用可靠的放前面。不过是可以用鼠标上下拖动设置的。

3. 把本地下载的repository整个发布到nexus

这才是我真正要做到的。相关的内容是从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的工具,简单好用。

4.部署构建到nexus

我们常需要部署一些不能在公开仓库得到的依赖,比如oracle-jdbc, javaee.jar。或者我们协作开发。TeamA把开发的放到nexus,供TeamB使用,而且是每日构建(通常要为每个项目分配独立仓库),现在大家都敏捷了嘛。

    a. 通过maven部署 : 日常开发可以这么部署。这需要在工程的pom文件中配置distributionManagement。示例如下:

       代码段01

view plain
  1.       <distributionManagement>  
  2. <repository>  
  3.     <id>nexus-release</id>  
  4.     <url>http://localhost:8081/nexus/content/groups/releases</url>  
  5. </repository>  
  6. <snapshotRepository>  
  7.     <id>nexus-release</id>  
  8.     <url>http://localhost:8081/nexus/content/groups/snapshots</url>  
  9. </snapshotRepository>  
  10. lt;/distributionManagement>  

    Nexus默认匿名用户是只读的。所以还需要在maven的settings.xml中servers节点下配置认证信息(id要与上面相同):

     代码段02

view plain
  1. <server>  
  2.   <id>nexus-release</id>  
  3.   <username>admin</username>  
  4.   <password>admin123</password>  
  5. </server>  
  6.   
  7. <server>  
  8.   <id>nexus-snapshots</id>  
  9.   <username>admin</username>  
  10.   <password>admin123</password>  
  11. </server>  

    b. 手动部署:在宿主仓库下面最右边的标签页,有个Artifact Upload,可以在此手动上传依赖包。显示定义maven坐标GAV,可以选择导入pom文件,或者手工输入。下面就选择要上传的文件了。

5. Maven相关配置

    a. Maven的settings.xml的配置    除了代码02权限验证信息,还有一些相关配置。部署Nexus当然是要连接它去用,所以要配置repository,这要用maven的profile机制。在profiles的一级节点下:

       代码段03:

view plain
  1. <profile>  
  2.    <id>nexus</id>  
  3.    <activation>  
  4.      <activeByDefault>true</activeByDefault>  
  5.    </activation>  
  6.   
  7.    <repositories>  
  8.      <repository>  
  9.        <id>nexus</id>  
  10.        <url>http://localhost:8081/nexus/content/groups/public</url>  
  11.        <snapshots>  
  12.          <enabled>true</enabled>  
  13.          <updatePolicy>daily</updatePolicy>  
  14.          <checksumPolicy>warn</checksumPolicy>  
  15.        </snapshots>  
  16.        <releases>  
  17.          <enabled>true</enabled>  
  18.          <checksumPolicy>warn</checksumPolicy>  
  19.        </releases>  
  20.      </repository>  
  21.    </repositories>  
  22.   
  23.    <pluginRepositories>  
  24.       <pluginRepository>  
  25.        <id>nexus</id>  
  26.        <url>http://localhost:8081/nexus/content/groups/public</url>  
  27.        <snapshots>  
  28.          <enabled>false</enabled>  
  29.        </snapshots>  
  30.        <releases>  
  31.          <enabled>true</enabled>  
  32.          <checksumPolicy>warn</checksumPolicy>  
  33.        </releases>  
  34.      </pluginRepository>  
  35.    </pluginRepositories>  
  36.      
  37.    <properties>  
  38.      <downloadSources>true</downloadSources>  
  39.      <downloadJavadocs>false</downloadJavadocs>  
  40.    </properties>  
  41. </profile>  

     要激活使用这个profile(上面的已经是默认激活的),需要再加个一级节点:

     代码段04:

view plain
  1. <activeProfiles>  
  2. lt;activeProfile>nexus</activeProfile>  
  3. </activeProfiles>  

    如果想让maven只使用我们的私服,需要及一级节点mirrors下面加上:

   代码段05

view plain
  1. <mirror>  
  2.   <id>nexus</id>  
  3.   <mirrorOf>*</mirrorOf>  
  4.   <name>Human Readable Name for this Mirror.</name>  
  5.   <url>http://localhost:8081/nexus/content/groups/public</url>  
  6. </mirror>  

    b. project的pom.xml   

    重要的就是代码段01了。如果只有当前project使用我们的Nexus私服,可以直接添加代码段03中的<repositories>这一部分,通常都不会这样。

6. 其他

    没些权限管理和定时任务了,页面操作就够用了一般。权限管理也是基于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常这样那样问题。文档多,但结构组织不好,不好找,不易清楚。

你可能感兴趣的:(maven,Authentication,java7,slf4j,Constructor,webapp)