2

有什么方法可以强制 Maven 使用远程工件而不是安装在您机器上的那些?因为我担心运行时错误而不是编译错误,所以构建服务器不是有效选项。

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

4

2 回答 2

7

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

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

您可以考虑一些替代方案:

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

有关 LATEST 和 RELEASE 的更多详细信息,请参阅Maven book 的第 9.3.1.3 节

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

于 2009-07-23T13:49:00.953 回答
0

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

顺便说一句,这在最近的Java Posse 集 (#268)中有详细讨论。我不认为他们最终得到了解决方案,但你可能会在那里得到一些好主意。

我也喜欢Rich Seller 的一些想法,我会自己研究。

于 2009-07-23T15:02:01.873 回答