java - Class.getResourceAsStream 的说明以及如何在 Tomcat 中为简单的 Java Web 应用程序设置它?

标签 java tomcat classpath

我有一个非常简单的 Java Web 应用程序,已部署到 Tomcat。

在此应用程序中,我有一些代码如下:

package com.mywebapp.hello;

import javax.servlet.http.*;
import java.io.*;

public class PdfTwoServlet extends HttpServlet {

    public void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException {

        httpServletResponse.setContentType("application/pdf");
        InputStream is = PdfTwoServlet.class.getResourceAsStream("/two.pdf");

当我编译代码并将其部署到 tomcat 时,目录结构如下所示:

这位于 C:\Tomcat\webapps\myApplication 下:

enter image description here

所以

PdfTwoServlet.class.getResourceAsStream("/two.pdf");

工作正常,找到了classes文件夹下的文件two.pdf,但我不知道这是如何工作的。

Accessing properties file in a JSF application programmatically BalusC 在这里说:

The Class#getResourceAsStream() can take a path which is relative to the location of the Class which you're using there as starting point. If you use /foo/filename.properties, then it will actually load foo/filename.properties from the classpath root.

我有两个问题:

1) 为什么类路径根目录是WEB-INF\classes文件夹?是在哪里确定的呢? (据我了解,应该是因为代码按照我所说运行正常。)

据此:http://docs.oracle.com/javase/tutorial/essential/environment/paths.html ,我的本地计算机中没有设置类路径。那么也许当我启动 tomcat 时,它会设置类路径?但是部署的 Web 应用程序很少,类路径也很少吗?

2)是否有更好的方法来代替:PdfTwoServlet.class.getResourceAsStream?像 getClassPath().getResourceAsStrem 之类的东西?

编辑:也许更有经验且英语更好的人可以编辑这个问题的标题。我不确定它是否足够好。

最佳答案

对于 1) Servlet 应用程序中的类路径根按照规范是 jar 的 WEB-INF\classes 文件夹,加上该 WAR 的 WEB-INF/lib 中所有 jar 的根。这些位置中的任何内容都将被视为类路径的根。

关于tomcat中的类路径如何工作的问题,当tomcat部署时,它按以下方式设置类路径:每个WAR对应一个单独的类加载器,它可以访问WEB-INF/classes以及WEB-INF中的所有jar/lib。

默认情况下,如果此处没有找到搜索的资源,则会在 tomcat/lib 目录中搜索。如果那里没有找到,就会询问父类加载器,依此类推,解释可以参见 here

如果部署了多个 Web 应用程序,则每个 WAR 都会有自己的类加载器,指向它自己的 WEB-INF/classes 和 WEB-INF/lib jar。

对于 2),没有像 getClasspath() 这样的方法,ServletContext.getResourceAsStream() 是 servlet 应用程序中从 WAR 内部获取资源的建议方法。 WAR 可能会被压缩或分解,这对两者都适用,请参阅 this answer

关于java - Class.getResourceAsStream 的说明以及如何在 Tomcat 中为简单的 Java Web 应用程序设置它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19505646/

相关文章:

java - JMap 转储格式规范

eclipse - 使用 Eclipse 的 WTP Tomcat 服务器调试 servlet 时在 web.xml 中指定相对路径?

spring - 部署示例 Spring Web MVC 项目

java - 如何给二维数组第二个槽 "unlimited space"? java

java - 程序掷骰子的次数(使用数组),并且必须显示掷骰子的次数(除非它不起作用))

java.lang.ClassNotFoundException : jxl. read.biff.BiffException

java - Tomcat 7、Weld、RESTEasy 不扫描 JAR

java - 使用 javax.tool 进行级联内存编译

java - 如何在 java list 类路径中使用正则表达式?

java - 连接Mysql和eclipse