本文参考了http://toozhao.com/2012/07/maven-compile-nexus/以及https://github.com/sonatype/nexus下部的readme,再次对这两篇文章的作者表示感谢,下面进入正文。
要编译Nexus你需要有以下东西:
1. Nexus的源代码
2. Maven 3.0.4或以上版本(注意,如果你想使用M2Eclipse在Eclipse中进行编译,还有一些要注意的地方,文章后面会单独说,这里暂时只说在命令行下编译)
下载好源代码并配置好Maven后,需要把Maven的settings.xml文件替换成http://toozhao.com/2012/07/maven-compile-nexus/这篇文章中的xml文件,也就是如下所示:
<settings>
<profiles>
<profile>
<id>sonatype-forge</id> <!-- 这个id可以随便,但要和下面的activeProfile中的id一致 -->
<repositories>
<repository>
<id>sonatype-forge</id> <!-- 这里id可以随便 -->
<url>https://repository.sonatype.org/content/groups/sonatype-public-grid/</url> <!-- 注意:这个代理的最新地址请从源代码内的README.md文件中获得。如果你自己有私服,那么可以把这个地址加到私服里再用,比如我就用的http://192.168.1.51:8081/nexus/content/groups/myrepository/ -->
<releases>
<enabled>true</enabled>
</releases>
<!-- 这个snapshots节点很重要,因为源代码里引用了很多snapshot版的构件,如果没有这个节点,那么Maven就不会下载这些构件,就会报错 -->
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>sonatype-forge</id> <!-- 这里id可以随便 -->
<url>https://repository.sonatype.org/content/groups/sonatype-public-grid/</url> <!-- 这里地址与上面的url相同即可 -->
<releases>
<enabled>true</enabled>
</releases>
<!-- 这个节点和上面一样,不能删除 -->
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>sonatype-forge</activeProfile>
</activeProfiles>
</settings>
关于settings文件有几点要注意:
1. 如果你的.m2文件夹和maven/conf下都有settings.xml文件,那么强烈建议将这两个settings文件都修改
2. 官网提供的settings.xml文件里有mirrors节点,但是经我测试加入这个节点后会导致编译失败,所以我这里并没有配置mirrors节点
现在就可以编译源代码,建议使用这个命令:mvn clean install -DskipTests -fail-never,这里说明一下:
1. -DskipTests是跳过测试,因为有几个测试方法跑不过去
2. -fail-never是发生错误以后不停止编译,直到整个编译过程结束
如果是第一次编译,那么会下载大量构件,大约需要2个小时(网速不同这个时间会有不同),如果已经下载好了所有构件,那么应该可以在5分钟左右完成编译(不跑测试用例,且时间与机器性能有关)
经过漫长地下载、编译之后,我们会发现nexus-testsuite-support和nexus-test-harness-launcher两个组件会出错,但这两个组件都是跟测试有关的,并不影响使用,无视即可(经过我的测试,这两个模块在Windows可能会出错,但Ubuntu下可以正确编译,看来Java的跨平台还是有些虚)。
最后在nexus-oss-webapp\target下有可以直接解压使用的安装包,在nexus-webapp\target下生成可以用于部署的war包。综上,Sonatype Nexus编译完成。
---------------------------------------------------------------------------我只是一条分隔符---------------------------------------------------------------------------
下面是使用Eclipse并集成M2Eclipse后的编译方法,我是用的是Eclipse 3.6:
1. 按照上面的方法修改settings文件
2. 替换Eclipse的Maven。
尽管Eclipse集成了Maven,但是只是3.0.0,而编译Sonatype Nexus至少需要Maven 3.0.4,所以需要替换,方法如下:Window--Preferences--Maven--Installations,在右边的Add选择下载的Maven
3. 将Sonatype Nexus的源代码导入到Eclipse中。注意,这是Eclipse会自动分析依赖、下载构件,整个过程会异常漫长,甚至会占用大量系统资源,请耐心等待
4. 等Eclipse完成自己的工作后,会发现有很多类找不到,不要担心,这是因为这些类都是编译时动态生成,所以现在会报错
5. 在nexus工程上使用Run as -- Maven build...,在Goals里写上mvn clean install -DskipTests -fail-never,就可以Run了。
关于这两种编译方式,下面是一些明显的对比:
1. Eclipse编译占用资源非常非常高,我给Eclipse配置了1G内存全部用光,而且还占用了大量虚拟内存,导致机器假死,而使用命令行编译仅仅需要300MB左右内存(考虑到Eclipse已经这么占资源,我还是不推荐大家使用MyEclipse编译了);
2. Eclipse下载构件时只会显示downloading xxx.jar,而命令行会显示downloading xxx.jar 12K/3245K,并且这个数字是动态变化的,让人知道程序在正常运行,而Eclipse容易让人感觉程序假死了,尤其是在网速慢或者构件很大时;
3. 即使你给Eclipse配置了3.0.4的Maven,它也经常会提示你的Maven过低,不要理会,这肯定是个bug;
4. Eclipse的错误是红色的,比命令行显眼,但综合考虑我还是强烈建议使用命令行方式编译。