使用命令行和Eclipse两种方式编译Sonatype Nexus

来源:互联网 发布:java多线程 lock 编辑:程序博客网 时间:2024/05/22 04:05

本文参考了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的错误是红色的,比命令行显眼,但综合考虑我还是强烈建议使用命令行方式编译。