【问题标题】:Problem loading resources from classpath从类路径加载资源的问题
【发布时间】:2011-04-22 19:10:20
【问题描述】:


在本地 tomcat 中运行的 Web 应用程序中,我正在尝试加载位于 tomcat/webapps/myproject/WEB-INF/folder 中的文件夹 /folder 要做到这一点:

InputStream realPath = getClass().getClassLoader().getResourceAsStream("/folder");  

返回null。这段代码应该从类路径加载资源,如果我的文件夹所在的路径没有错的话。
无论如何,我将文件夹移动到不同的路径,例如 tomcat/webapps/myproject/WEB-INF/classes/foldertomcat/webapps/myproject/WEB-INF/lib/folder,结果相同。
我错过了什么?提前致谢。

关于您的所有答案(谢谢),我尽我所能编辑我的问题,结果相同。
一)

 String realSource = getServletContext().getRealPath("/folder");  

B)

InputStream realPath = getClass().getClassLoader().getResourceAsStream("/folder/fileInFolder"); 

C)

ServletContext servletContext = (ServletContext)context.getExternalContext().getContext();
String realSource = servletContext.getRealPath("/folder");

我必须说我的folder 路径是tomcat/webapps/myproject/WEB-INF/classes/folder

【问题讨论】:

    标签: java tomcat path


    【解决方案1】:

    问题是 /WEB-INF 不在 WAR 文件的 CLASSPATH 中。

    /WEB-INF/classes 在 CLASSPATH 中; /WEB-INF/lib 中的所有 JAR 也是如此。

    如果你把你需要的文件放到 /WEB-INF/classes WAR 类加载器应该能够找到它。

    您无法以这种方式读取目录。它必须是一个文件。

    更新:

    不管怎样,我把我的文件夹移到了不​​同​​的地方 路径,例如 tomcat/webapps/myproject/WEB-INF/classes/文件夹 要么 tomcat/webapps/myproject/WEB-INF/lib/文件夹 结果相同。我错过了吗 某物?

    是的,你错过了两件事:

    1. 您的文件夹应该放在一个地方 - 在 /WEB-INF/classes 下
    2. 您无法使用 getResourceAsStream() 访问该文件夹并读取所有内容。它不是那样工作的。这种方式只能读取一个单独的文件。

    【讨论】:

    • 你不能,也不应该。
    • 还有没有其他方法可以获取这个文件夹的路径??除了 ServletConfig.getRealPath() ??我想这样做,因为之前也给我带来了问题。
    • 更好的问题是:你想做什么?我知道您想获取文件夹的路径并阅读内容;有多少文件,用于什么目的?你对这些文件做了什么?
    • 我想将此文件夹路径发送到另一个函数,该函数将处理此文件夹中的每个文件(每次的数量都会不同,可能是 10 个,也可能是 1000 个)。但我不想依赖于我使用的机器,所以我想在我的 tomcat 中拥有这些资源。谢谢
    • 文件夹中有什么?这些文件是如何到达那里的?您是通过 HTTP 请求通过 servlet 触发的吗?还是您希望每天执行的定期工作?如果是后者,我认为网络应用程序不是正确的选择。 Quartz 或 cron 工作会是一个更好的主意。我不确定这是否属于网络服务器。
    【解决方案2】:

    如果你想要你的 webapp 中文件夹的完整路径,以便你可以对它使用文件操作,这里有一种方法。

    注意:myfolder 与我的 webapp 中的 WEB-INF 平行

    String relativeWebPath = "/myfolder";
    String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath);
    

    现在打印出absoluteDiskPath 给我

    D:\apache-tomcat-6.0.20\webapps\mywebapp\myfolder
    

    尝试列出该文件夹中的文件

    File dir = new File(absoluteDiskPath); 
    
    String[] children = dir.list(); 
    if (children != null) 
    { 
    
        for (int i=0; i<children.length; i++) { 
        // Get filename of file or directory 
    
        String filename = children[i]; 
        System.out.println("filename no " + i + filename);
        } 
    }
    

    【讨论】:

    • 谢谢,我之前尝试过这种方式,但是我在初始化 Servlet 时遇到了问题,这就是我决定改变方式的原因。我遇到的问题是在这个演员 Servlet servlet = (Servlet) context.getExternalContext();
    • 你能把 String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath);没有问题??
    • @mujer esponja: 是的,如果你的代码是一个合适的 servlet(即扩展 HTTPServlet)那么你可以直接在 goGet() 方法中使用 getServletConfig() 和 getServletContext() download.oracle.com/docs/cd/E17802_01/webservices/webservices/…
    • 我编辑了我的问题,因为我得到了相同的空结果
    【解决方案3】:

    删除前导斜杠并尝试即

    InputStream realPath = getClass().getClassLoader().getResourceAsStream("folder");  
    

    【讨论】:

    • 我也试过了,结果一样。谢谢
    猜你喜欢
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 2010-12-29
    • 2020-09-02
    • 1970-01-01
    相关资源
    最近更新 更多