MavenがHTTP要求に対してキャッシュを無効にするのはなぜですか?
質問
Mavenがリポジトリからアーティファクトを取得するために使用するHTTP要求のデフォルトのMaven設定には、次のヘッダーが含まれます。
Cache-control: no-cache
Cache-store: no-store
Pragma: no-cache
Expires: 0
Accept-Encoding: gzip
これがそうです 文書化された動作. 。 HTTPのデフォルトのMavenワゴン(つまり、「軽量」クライアント)は、これらのヘッダーを無効にすることを許可していないようです。
デフォルトでMavenがこの方法で構成されるのはなぜですか?実際にバージョンを持っているアーティファクトの場合、それらは決して変わらないはずですよね?
私は、多くの開発者が共通のHTTPプロキシを共有する環境で働いています。この動作は、開発者がキャッシングの恩恵を受けないことを意味します。そして、私たちは持っています dependencyManagement
すべての依存関係で、変更される可能性のあるスナップショットやその他のバージョンを使用しないため、キャッシュは安全であるように思われます。
これらのヘッダーを無効にし、プロキシが応答をキャッシュして返すようにするために、settings.xmlまたはpom.xmlに何を入力できますか?
解決
これは文書化された動作のようです。 HTTPのデフォルトのMavenワゴン(つまり、「軽量」クライアント)は、これらのヘッダーを無効にすることを許可していないようです。
実際、あなた できる を設定します 軽量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が使用するデフォルトリポジトリ用です)。
それが機能しない場合(すべき)、代替手段はに戻ることです httpclientワゴン ドキュメントのように構成します HTTPCLIENT HTTPワゴンの高度な構成.