web-dev-qa-db-ja.com

Maven戦争には2つの場所にMETA-INFフォルダーがあります

私はJAASを使用するプロジェクトに取り組んでいますが、残念ながら、Tomcatでは戦争のルートにあるMETA-INFフォルダーにファイルを配置する必要があります。

app.war
  |__META-INF
  |    |___context.xml
 ...

WARのデフォルトのMETA-INFの場所はclassesフォルダーにあるので、それはすでに奇妙だと思います。

app.war
  |__WEB-INF
  |    |__classes
  |         |__META-INF
 ...

そのため、私はMavenを使用しています。これは、src/main/resources/META-INF内のすべてのものが適切な場所にコピーされることを示しています。奇妙なことに、ファイル構造のルートにMETA-INFフォルダーも作成され、2つのMETA-INFフォルダーが残ります。

プロジェクト構造

app
  |__src/main/Java
  |__src/main/resources
  |       |__META-INF
  |             |__context.xml
 ...

mvnパッケージの後

 app
  |__META-INF [1]
  |__WEB-INF
  |     |__classes
  |           |__META-INF [2]
  |                  |__context.xml
 ...

したがって、#2のように、戦争標準でMETA-INFをclassesフォルダーの下に配置する必要があると規定されている場合、なぜmaven warが#1フォルダーを作成するのですか。そして、#2の代わりにそのフォルダにファイルをコピーさせる方法はありますか?

よろしく

17
Grasshopper

だから私はこれを見つけました:

2つのMeta-Infフォルダー-通常の構造?

これは、META-INFフォルダーが2つあることは問題ではないと述べています。私が見つけた少し掘ります:

JARファイル仕様

これはMETA-INFフォルダについて述べています:

JARファイルは基本的に、オプションのMETA-INFディレクトリを含むZipファイルです。 ... META-INFディレクトリが存在する場合は、セキュリティ、バージョン管理、拡張機能、サービスなどのパッケージおよび拡張機能の構成データを格納するために使用されます。

この:

JSR-000315 JavaTMサーブレット3.

これは、セクション10.6で、WARファイル構造について述べています。

このような形式にパッケージ化すると、META-INFディレクトリが存在します。このディレクトリにはJavaアーカイブツール。このディレクトリを直接提供してはなりません。 Webクライアントの要求に応じたコンテナによるコンテンツ。ただし、その内容は、ServletContextのgetResourceおよびgetResourceAsStream呼び出しを介してサーブレットコードに表示されます。また、META-のリソースにアクセスするためのすべての要求INFディレクトリは、SC_NOT_FOUND(404)応答で返される必要があります。

したがって、WAR仕様から、適切な場所はWEB-INF/classes/META-INFです。ただし、warは特別なjarファイルであるため、拡張機能のポイントとして/ META-INFを使用することは理にかなっています。 JPApersistence.xmlファイルとTomcatcontext.xmlファイルでこのような異なる使用法を見ることができます。前者はWEB-INF/classes/META-INFに配置し、後者は/ META-INFに配置する必要があります。

12
Grasshopper