如何在不使用本地安装的工件的情况下构建

时间:2009-07-23 13:40:48

标签: java maven-2 correctness artifacts

有没有办法强制Maven使用远程工件而不是机器上安装的工件?因为我担心运行时错误而不是编译错误,所以构建服务器无效。

P.S。我知道我可以删除或重命名.m2文件夹,但我敢打赌,有一些更聪明的方法可以做到这一点。也许一些插件或特殊命令参数?

2 个答案:

答案 0 :(得分:7)

没有本地存储库意味着您的类路径几乎完全由远程服务器上的URL组成。我不明白为什么这会被支持,因为执行会很糟糕,任何丢弃的连接都会导致类加载器问题。拥有本地存储库可确保在编译/执行开始之前jar可用。

还要考虑WAR和EAR项目(以及许多使用依赖项插件)依赖于下载jar来完成其包装。如果必须从每个构建的远程存储库中检索这些开销,那将会产生巨大的开销。我很确定中央管理人员不会热衷于处理这种负担。

您需要考虑的其他选择:

  • 如果要在每个构建上强制使用干净的本地存储库,可以使用依赖项插件的purge目标。
  • 如果要保持构建隔离,可以通过传递-Dorg.apache.maven.global-settings = / path / to / global / settings.xml
  • 来使用单独的Maven设置
  • 或者,您可以通过传递-Dmaven.repo.local = / some / repo / path
  • 来基于每个构建覆盖本地存储库
  • 如果您想避免在每个版本上点击远程存储库,请添加< updatePolicy> never< / updatePolicy>到您的远程存储库配置。这意味着如果你在命令行上使用“-U”开关强制它,Maven将只检查更新
  • 如果要使用最新版本的依赖项,可以在版本声明中使用LATEST关键字(而不是版本号),但如果依赖项不兼容,则可能存在风险。
  • 如果要获取依赖项的当前发行版,可以在版本声明中使用RELEASE关键字(而不是版本号)。这就像LATEST,但往往是最新的稳定版本,而不是最新版本。
  • 如果要在某个范围内使用最新版本的依赖项,请使用Maven的版本范围表示法,例如[1.0.0,2.0.0]表示从1.0.0到2.0.0的任何版本

有关LATEST和RELEASE的更多详细信息,请参阅section 9.3.1.3 of the Maven book

如果您使用内部存储库管理器(此处必须提供NexusArtifactory引用),则清除本地存储库的开销将大大减少 - 您只需 增加了本地网络流量负载。

答案 1 :(得分:0)

我认为没有办法满足你的要求。您可以根据SNAPSHOT版本进行调查(但这意味着将上游项目的版本字符串更改为SNAPSHOT版本)。

顺便提一下,最近Java Posse episode (#268)对此进行了详细讨论。我不认为他们最终得到了解决方案,但你可能会在那里得到一些好主意。

我也喜欢Rich Seller's ideas中的一些,我会自己调查一下。