当我们在Eclipse中创建动态Web项目时,我们可以选择设置Target Runtime。这基本上设置了类路径,以确保我们的项目找到项目运行所需的所有必要的服务器类。然后,当我们通过单击"运行为" - >"运行在服务器"上运行项目时,我们再次获得服务器列表以供选择。我知道我们总是可以选择"在运行项目时始终使用此服务器"。但我的问题是,当您已经选择了目标运行时,向用户提供可供选择的服务器列表再次运行项目的原理是什么。它是否像一个"在与目标运行时不同的服务器上测试您的项目"特征???
答案 0 :(得分:0)
为项目指定服务器运行时环境时,服务器容器JAR将提供给项目的类路径。 IDE也不允许您添加目标运行时服务器不支持的任何项目构面。这意味着目标运行时将确定可能的项目方面。 创建项目后,服务器容器类路径将为项目的类路径做出贡献,因此项目所需的任何JAR以及服务器容器中可用的JAR都可用于您的项目。例如,如果您的项目需要Java Servlet API并且您将Apache Tomcat添加为目标运行时,则Tomcat Catalina - Java Servlet API将在项目类路径上可用,并且此运行时环境提供的所有JAR将用于编译。这意味着您不需要手动将Servlet API JAR添加到项目类路径中,目标运行时将提供它们。 编译之后,一旦包含所有必需的JAR,您就可以在其他服务器上运行项目,不必在目标运行时上运行。 例如,在开发针对Apache Tomcat的Java Web应用程序时,在编译之后,您可以将其部署在另一个servlet容器或应用程序服务器上。
此外,应用程序或Web服务器可能会为您的JRE使用与当前项目版本不同的JDK版本。通过指定目标运行时服务器,可以确保在项目中使用正确的库。
回答上一个问题:Target Runtime将提供Servlet API,以便您可以编译项目。否则,您必须手动添加JAR才能使用Servlet API,例如HttpServlet或HttpServletRequest或HttpServletResponse对象。如果不在类路径上分配JAR,则无法通过这种方式进行编译,因为不会解析依赖关系。关于您的问题,将在运行时使用哪个实现 - 这取决于项目设置。例如,如果您使用maven作为构建工具,则可以在maven中声明依赖性范围:编译范围是默认值,意味着在编译期间应该在项目的类路径中提供依赖项。但是,如果您指定提供的范围 - 这意味着JDK或服务器容器将在运行时提供依赖性。因此,在Servlet API的情况下,如果您指定依赖的范围,如果您在运行时获得Servlet容器提供的Servlet API,即您选择“在服务器上运行”的相同容器
答案 1 :(得分:0)
查看项目库文件夹。您将看到来自运行时服务器的文件夹,如“Apache Tomcat v7.0”。这为您的项目依赖项提供了“javax.servlet”。如果您右键单击您的项目>属性>目标运行时,您可以删除服务器运行时,看看会发生什么。 Apache Tomcat库将消失,您的项目突然缺少依赖项。把它添加回去,错误就会消失。