应用程序服务器提供一组“开箱即用”的服务,因此如果提供的服务是您需要的服务,它们会更容易使用。你只需打包和部署你的应用程序,事情就可以工作了。此外,大多数技术都是由应用程序服务器实例化的,因此可以避免很多类加载器问题。
应用服务器的问题在于,有时(实际上经常如此),您需要挑选与应用服务器提供的不兼容的特定框架、服务等的特定版本。在这些情况下,您通常需要摆弄应用程序服务器,并且在某些情况下,您想要做的事情甚至可能无法使用您的应用程序服务器。
例如,Weblogic 10.x 是一个 Java EE 5 应用服务器,所以它默认提供 JSF 1.2 和 JPA 1。如果你想使用更新的东西,你需要手动部署一些额外的库(JSF 2.0),或者补丁服务器(JPA 2.0)。
另一个例子:在 Glassfish 3.1 中,我无法使用 Tomcat EL 而不是 Glassfish EL。Tomcat EL 支持可变参数方法调用,而 Glassfish EL 不支持。
Java EE 应用程序服务器的刚性使得很多人更喜欢为独立的 servlet 容器(如 Tomcat 或 Jetty)开发,在这些容器中除了 Servlet 和 JSP API 之外没有任何开箱即用的东西,但您可以手动将所有内容放入其中。您还可以将其与您的应用程序一起打包,这样在开发时会更舒服,但如果您为每个容器部署多个应用程序,则会给您带来问题(资源浪费、类加载问题、类加载器泄漏……)
更新:
与在 Java EE 容器中使用 JPA 相比,在 SE 环境(例如 Tomcat)中使用 JPA存在一些差异。基本上:
- 您必须手动管理
EntityManagerFactory
和EntityManager
实例。
- Tomcat 不进行注入,因此
@PersistenceContext
注解和类似的注解不起作用。
请注意,某些容器(例如 Spring)可以配置为隐藏这些细节,因此您可以像在 Java EE 容器中一样工作。
阅读JPA 规范,了解在 SE 环境而不是 EE 环境中运行的详细信息。
关于其他库,通常您会发现一些细微差别。例如,JAX-WS 需要为您的 web 应用程序注册一个 servlet 和一个侦听器,但其他任何东西都应该相同。通常,您可以搜索文档以获取有关如何在独立 servlet 容器中运行事物的说明。