アプリケーション サーバーは一連のサービスを「そのまま」提供するため、提供されるサービスが必要なものであれば、より簡単に使用できます。アプリケーションをパッケージ化してデプロイするだけで、機能します。さらに、ほとんどのテクノロジはアプリケーション サーバーによってインスタンス化されるため、多くのクラスローダーの問題を回避できます。
アプリケーション サーバーの問題は、アプリケーション サーバーが提供するものと互換性のない特定のフレームワークやサービスなどの特定のバージョンを選択する必要がある場合があることです (実際にはかなり頻繁に)。そのような場合、通常はアプリケーション サーバーをいじる必要があり、場合によっては、実行したいことをアプリケーション サーバーでは実行できないことさえあります。
たとえば、Weblogic 10.x は Java EE 5 アプリケーション サーバーであるため、デフォルトで JSF 1.2 と JPA 1 が提供されます。より新しいものを使用する場合は、追加のライブラリ (JSF 2.0) を手動で展開するか、パッチを適用する必要があります。サーバー (JPA 2.0)。
別の例: Glassfish 3.1 では、Glassfish EL の代わりに Tomcat EL を使用できませんでした。Tomcat EL は varargs メソッドの呼び出しをサポートしていますが、Glassfish EL はサポートしていません。
Java EE アプリケーション サーバーの柔軟性により、多くの人が Tomcat や Jetty などのスタンドアロンのサーブレット コンテナー向けに開発することを好むようになっています。アプリケーションと一緒にパッケージ化することもできます。これは開発中はより快適ですが、コンテナーごとに複数のアプリケーションをデプロイすると問題が発生する可能性があります (リソースの無駄、クラスロードの問題、クラスローダーのリークなど)。
アップデート:
SE 環境 (Tomcat など) で JPA を使用する場合と、Java EE コンテナー内で JPA を使用する場合とでは、いくつかの違いがあります。基本的:
- インスタンスを手動で管理する必要が
EntityManagerFactory
ありEntityManager
ます。
- Tomcat はインジェクションを行わないため、
@PersistenceContext
アノテーションなどは機能しません。
一部のコンテナー (Spring など) は、これらの詳細を非表示にするように構成できるため、Java EE コンテナー内にいるかのように作業できます。
EE 環境ではなく SE 環境で実行する場合の詳細については、JPA 仕様を参照してください。
別のライブラリに関しては、一般的にいくつかの小さな違いがあります。たとえば、JAX-WS では Web アプリケーションのサーブレットとリスナーを登録する必要がありますが、それ以外はすべて同じにする必要があります。通常、スタンドアロンのサーブレット コンテナ内で実行する方法については、ドキュメントを検索できます。