我们正在使用Maven进行大型构建过程(> 100个模块).我们一直将外部依赖项存储在源代码控制中,并使用它来更新本地仓库.
但是,我们已准备好升级到可以缓存中心的本地仓库,这样我们就不必主动下载所有第三方(但我们仍然可以从本地仓库中获取).此外,我们希望从每晚构建中发布我们的内部构建工件,以便开发人员不必构建世界.
我们正在考虑Nexus和Artifactory.优先选择其中一个的原因是什么?我们应该考虑其他人吗?
我正在试图弄清楚如何组织许多(大约50多个)maven2项目,以便他们可以部署到一个中央nexus存储库.在使用mvn deploy
目标时,需要在distributionManagement标记中指定目标,如下所示:
<distributionManagement>
<repository>
<id>nexus-site</id>
<url>http://central_nexus/server</url>
</repository>
</distributionManagement>
Run Code Online (Sandbox Code Playgroud)
现在,我不希望每个pom.xml(50+以上)一遍又一遍地包含这个块.我的第一个虽然是settings.xml
文件,但似乎不可能(按设计)在那里定义它.那么,第一个问题是,为什么会这样呢?如果有可能我可以在maven2发行版的settings.xml中指定它,它可以分发给所有开发人员.
我发现唯一可行的解决方案是创建一个组织范围的master-pom项目,它确实包含这些设置,并使所有其他pom.xml依赖于这个master-pom via <parent>
标签.但这在多模块构建中看起来很奇怪:
- master configuration POM (pm)
- Project 1 parent pom (p1 with module 1 and module 2 as modules)
- Project 1 module pom (with pm as parent)
- Project 2 module pom (with pm as parent)
Run Code Online (Sandbox Code Playgroud)
通常我在所有文档中都读到模块poms应该使用父pom,而不是一些不同的pom.但在阅读了关于继承诉聚合的maven网站之后,我们写道它确实是可能的.
我发现的一个问题是maven网站生成,这似乎有这个设置的问题(模块如果没有直接的反向引用就无法正确链接)
那么,这是一种有效的方法吗?问题的任何其他更明显,更简单的解决方案?
现在maven-3确实放弃了对<uniqueVersion> false </ uniqueVersion>的快照伪像的支持,似乎你真的需要使用带时间戳的SNAPSHOTS.特别是在内部使用maven 3的m2eclipse似乎受其影响,当SNAPSHOTS不是唯一时,更新快照不起作用.
以前将最佳快照设置为uniqueVersion = false 似乎是最佳做法
现在,切换到带时间戳的版本似乎没什么大问题,毕竟它们是由中央nexus存储库管理的,它可以在常规的intervalls中删除旧的快照.
问题是本地开发人员工作站.他们的本地存储库通过独特的快照很快变得非常大.
如何处理这个问题?
现在我看到了以下可能的解决方案:
保持本地存储库填满硬盘空间的最佳方法是什么?
更新:
为了验证beaviour并提供更多信息,我设置了一个小的nexus服务器,构建两个项目(a和b)并尝试:
A:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>de.glauche</groupId>
<artifactId>a</artifactId>
<version>0.0.1-SNAPSHOT</version>
<distributionManagement>
<snapshotRepository>
<id>nexus</id>
<name>nexus</name>
<url>http://server:8081/nexus/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
</project>
Run Code Online (Sandbox Code Playgroud)
b:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>de.glauche</groupId>
<artifactId>b</artifactId>
<version>0.0.1-SNAPSHOT</version>
<distributionManagement>
<snapshotRepository>
<id>nexus</id>
<name>nexus</name>
<url>http://server:8081/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
<repositories>
<repository>
<id>nexus</id>
<name>nexus</name>
<snapshots>
<enabled>true</enabled>
</snapshots>
<url>http://server:8081/nexus/content/repositories/snapshots/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>de.glauche</groupId>
<artifactId>a</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency> …
Run Code Online (Sandbox Code Playgroud) 我很难让maven-release-plugin与我们的CVS存储库一起工作.希望我遗漏了一些明显的东西,或者再也没有人使用CVS/pserver和Maven2/3了?
第一个问题是scm URL:
maven CVS提供程序声明有效的scm URL如下所示:
scm:cvs<delimiter>pserver<delimiter>[username[<delimiter>password]@]servername[<delimiter>port]<delimiter>path_to_repository<delimiter>module_name
Run Code Online (Sandbox Code Playgroud)
所以,我正在努力
<scm>
<connection>scm:cvs:pserver:cvssserver:/home/cvs/repository/projecta:ejbprojectA</connection>
</scm>
Run Code Online (Sandbox Code Playgroud)
这应该是一个有效的cvs scm url.对于release-plugin,我将直接在relase插件配置中将用户名设置在本地settings.xml中.发布插件可以正常工作,但这会导致构建maven站点时出错:
[INFO] Username isn't defined.
[INFO] ------------------------------------------------------------------------
[INFO] Trace
java.lang.IllegalArgumentException: Username isn't defined.
at org.apache.maven.scm.provider.cvslib.repository.CvsScmProviderRepository.getCvsRootForCvsPass(CvsScmProviderRepository.java:113)
Run Code Online (Sandbox Code Playgroud)
这似乎是scm插件中的一个三岁的bug:http://jira.codehaus.org/browse/SCM-350
添加用户名变量以满足网站插件也不起作用,因为这会触发maven-release-plugin中的另一个(4岁)错误:http://jira.codehaus.org/browse/MRELEASE-128
如果我使用固定的用户名,我可以得到它以某种方式工作,但这不是真的令人满意.
第二个问题是平面项目结构,maven发布插件似乎无法与它们一起使用CVS,似乎有一些SVN的修复,但这些更改完全打破了平坦的cvs结构(项目模块旁边的主pom模块)
所以,最大的问题是,是否有其他人使用带有cvs的maven-release-plugin?你的设置如何?你是如何处理这些问题的?你是否使用平面项目结构(在eclipse中使用它更方便......)?
我们正在使用m2eclipse 0.12.1和nexus oss 1.9.0.1存储库.今天,在nexus服务器停机期间,一些用户确实在m2eclipse中使用了"更新依赖项",这确实导致项目配置损坏(几乎所有依赖项都找不到工件)
问题是,在nexus服务器恢复联机后,更新依赖仍然无效,似乎没有尝试到达服务器.唯一有效的蛮力溶解是删除本地存储库.然后成功下载了所有依赖项.
因此,似乎本地元数据已损坏,或者告诉m2eclipse不要再次查看服务器.如何强制m2eclipse下载依赖项?或者如何告诉m2eclipse再次启用nexus服务器?
java ×4
maven-2 ×3
maven-3 ×2
nexus ×2
artifactory ×1
cvs ×1
deployment ×1
m2eclipse ×1
maven ×1