私のmavenリポジトリーのgroupId javax.servlet
の下に、サーブレット用に2つの別個の成果物があります。単純なサーブレットアプリケーションを構築するためにどれを使用すればよいか混乱していますか?これら2つのアーティファクトの違いは何ですか?
javax.servlet-apiバージョン3.0.1には、servlet-apiバージョン2.5以下(バージョン2.4)に注釈が含まれていないさまざまな注釈クラスを含む注釈フォルダーがあります。
注釈はメタデータを表します。アノテーションを使用する場合、デプロイメント記述子、つまりweb.xmlは必要ありません。たとえば、サーブレットファイルで@WebServlet("/hello")
のようなアノテーションを使用する場合、web.xmlファイルでサーブレットマッピングに言及する必要はありません。
いくつかの便利な注釈は次のとおりです。
@HandlesTypes
@HttpConstraint
@HttpMethodConstraint
@MultipartConfig
@ServletSecurity
@WebFilter
@WebInitParam
@WebListener
@WebServlet
追加する必要があります
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
あなたのプロジェクトに。必要なバージョンは異なる場合があります-それはサーブレットコンテナーに依存します。 Tomcat。
<scope>provided</scope>
ランタイムでは必要ないため、サーブレットコンテナにすでに含まれています。
javax.servlet-api.jarを使用すると、多くの開発者が誤ってservlet-api.jarをWEB-INF/libフォルダーに含めます。 Tomcatや他のアプリサーバーがJARファイルのデプロイ時に問題として認識するため、これにより例外が発生しなくなりました。ただし、これにより、コンテナはjavax/servlet/Servlet.classを含むJARファイルを無視します。
サーブレット3.0の仕様をサポートしていない古いバージョンのアプリケーションサーバーにデプロイする必要がある場合(多分ありそうもないことですが)、古いservlet-apiを使用してください。
3.0仕様では、それをjavax.servlet-apiに移動しました。参照: https://javaee.github.io/servlet-spec/
Java EEがOracleからEclipse Foundation( Jakarta EE )に移動したため、仕様は再び移動しました。可能な場合は、最新の状態にしたい場合は、新しいグループとアーティファクトを使用します:jakarta.servlet:jakarta.servlet-api
gradle ...を使用している場合.
以下のようにcompileOnly
を使用して依存関係を宣言した場合
compileOnly "javax.servlet:javax.servlet-api:3.1.0"
次に、コンパイルエラーが発生します:
error: package javax.servlet.http does not exist
import javax.servlet.http.HttpServletRequest;
^
以下のようにprovidedCompile
を使用すると、ビルドは成功します。
providedCompile "javax.servlet:javax.servlet-api:3.1.0"
providedCompile
依存関係を使用するには、warプラグインを使用する必要があります。
apply plugin: 'war'