今天在一个Maven项目中调用某个包的SNAPSHOT版本,总是提示找不到该jar包,主仓库使用了局域网中的Sonatype Nexus服务器,项目pom.xml相关配置如下:
<project>
<repositories>
<repository>
<id>nexus</id>
<name>Local Nexus Repository</name>
<url>http://192.168.1.200:8080/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.example.tools</groupId>
<artifactId>example-tools</artifactId>
<version>1.0.2-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
配置文件中已经启用了snapshots,但maven在下载example-tools-1.0.2-SNAPSHOT.jar的时候总是出错,提示无法找到该包。
首先我登录Nexus服务器,在Repositories中检查Public Repositories下面Configuration已经将Releases和Snapshots(分别代表本地的正式版服务和测试版服务)放到了仓库中,如下图:
突然想到Maven调用SNAPSHOT版本的时候首先获取maven-metadata.xml文件,然后根据文件中所定义的最后一个SNAPSHOT版本时间戳来决定使用服务器上的具体的哪个jar包,但是在本例中在浏览器中无法直接访问http://192.168.1.200:8080/content/groups/public/com/example/tools/example-tools/1.0.2-SNAPSHOT/maven-metadata.xml,直接显示404错误,按照Sonatype官方文档的指示依次排除各种情况,都没有发现,在最后面加上?describe参数,发现显示的错误是FILE NOT FOUND,但是服务器上这个文件是存在的。后来直接使用snapshots仓库进行访问,即直接访问
http://192.168.1.200:8080/content/repositories/snapshots/com/example/tools/example-tools/1.0.2-SNAPSHOT/maven-metadata.xml是可以直接访问的。
但是为什么在Public Repositories和Public Snapshot Repositories中为什么都不能访问呢?后来在Sonatyp Nexus的讨论组中找到了答案,原来我使用的Nexus是1.4,版本太老了,无法识别Maven 3.x之后的这个metadata格式,因此程序就不在Public Repositories中进行公开了,因此需要将Nexus进行升级了。
按照官方的升级文档,可以从1.x升级到2.7.x,如果想升级到最新的2.11的话就需要再从2.7.x进行升级,但是2.7.x目前也足够使用了,于是决定将现在用的1.4升级到2.7.2。
Nexus2.5之后的版本开始使用JDK7了,所以需要先将服务器上的JDK升级到7.0,然后从http://www.sonatype.org/nexus/archived/下载Nexus 2.7.2的zip包,下载完成之后解压,将压缩包中的nexus-2.7.2-03程序复制原来的nexus server安装根目录下,然后修改nexus-2.7.2-03/conf/nexus.properties文件,新的配置文件比原来的要简洁明了很多,根据需要调整配置文件即可。首先执行原来的nexus服务卸载,然后再执行bin/nexus install安装新的nexus服务,再启动服务就可以了,非常简单,这样原来的仓库文件可以继续使用,而且是完全兼容的,根目录下的文件结构如下:
这里需要说明在Windows 2003下面运行 nexus console 命令之后会出现下面的错误:
wrapper | --> Wrapper Started as Console
wrapper | Launching a JVM...
jvm 1 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
jvm 1 | Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved.
jvm 1 |
jvm 1 | 2016-01-19 16:45:15 INFO [WrapperListener_start_runner] - org.sonatype.nexus.bootstrap.jsw.JswLauncher - Starting with arguments: [./conf/jetty.xml]
jvm 1 | Unable to open process: 拒绝访问。 (0x5)
jvm 1 | 2016-01-19 16:45:15 ERROR [WrapperListener_start_runner] - org.sonatype.nexus.bootstrap.jsw.JswLauncher - Failed to start
jvm 1 | java.lang.NullPointerException: null
jvm 1 | at org.sonatype.nexus.bootstrap.jsw.JswLauncher.doStart(JswLauncher.java:53) ~[nexus-bootstrap-2.7.2-03.jar:2.7.2-03]
jvm 1 | at org.sonatype.nexus.bootstrap.jsw.WrapperListenerSupport.start(WrapperListenerSupport.java:37) ~[nexus-bootstrap-2.7.2-03.jar:2.7.2-03]
jvm 1 | at org.tanukisoftware.wrapper.WrapperManager$12.run(WrapperManager.java:2788) [wrapper-3.2.3.jar:3.2.3]
wrapper | <-- Wrapper Stopped
这应该是java wrapper的一个bug,不需要理会,只要使用nexus install安装成windows服务然后在启动服务即可。