为什么 Maven 禁用 HTTP 请求的缓存?
题
HTTP 请求的默认 Maven 设置(例如 Maven 用于从存储库获取工件的请求)包含以下标头:
Cache-control: no-cache
Cache-store: no-store
Pragma: no-cache
Expires: 0
Accept-Encoding: gzip
这似乎是 记录的行为. 。HTTP 的默认 Maven wagon(即“轻量级”客户端)似乎不允许禁用这些标头。
为什么Maven默认是这样配置的呢?对于实际上有版本的工件,它们不应该改变,对吗?
我工作的环境中,许多开发人员共享一个通用的 HTTP 代理,这种行为意味着开发人员永远无法从缓存中受益。并且,我们有 dependencyManagement
在我们所有的依赖项上,并且不使用快照或其他可能更改的版本,因此看来缓存应该是安全的。
我可以在 settings.xml 或 pom.xml 中添加什么来禁用这些标头并允许我们的代理缓存响应并返回它们?
解决方案
这似乎是有记录的行为。HTTP 的默认 Maven wagon(即“轻量级”客户端)似乎不允许禁用这些标头。
其实,你 能 配置 轻量级 HTTP 货车 客户端使用可用的设置器,例如(Maven 2.0+):
<servers>
<server>
<id>central</id>
<configuration>
<useCache>true</useCache>
</configuration>
</server>
</servers>
或者甚至覆盖或提供额外的 HTTP 标头 (Maven 2.1+):
<server>
<id>central</id>
<configuration>
<httpHeaders>
<property>
<name>User-Agent</name>
<value>Internal-Build-System/1.0</value>
</property>
</httpHeaders>
</configuration>
</server>
布雷特·波特 (Brett Porter) 在《 配置 Maven HTTP 连接.
为什么Maven默认是这样配置的呢?
胡乱猜测:这是一个安全的默认值,可以避免代理配置错误而出现问题(不太确定这是真的)。
我可以在 settings.xml 或 pom.xml 中添加什么来禁用这些标头并允许我们的代理缓存响应并返回它们?
上面的设置进入 settings.xml
(当然,调整 id
如果需要的话, central
用于 Maven 使用的默认存储库)。
如果它不起作用(应该),另一种选择是切换回 HTTP客户端马车 并按照中记录的方式配置它 HttpClient HTTP Wagon 的高级配置.