初学者servlet问题:访问.war中的文件,哪条路径?

Nav*_*eur 1 servlets file war

当我正在使用的第三方库尝试访问文件时,我收到"错误打开...文件...(没有这样的文件或目录)",即使我知道该文件在WAR中.我已经尝试了打包(.war)和"爆炸"(目录)部署,文件肯定在那里.我也尝试过设置完全权限.它是在Unix(Ubuntu)上.文件是war/dict/index.sense,错误是"dict/index.sense(没有这样的文件或目录)".

当它作为来自Eclipse的GWT应用程序在托管模式下运行时,它在我的Windows计算机上运行正常,而不是在我将其传输到Unix机器进行部署时.

我的问题是:有没有人经历过这个和/或我应该考虑相对路径的差异,即在战争中相对文件访问的根路径是什么?

Bal*_*usC 8

在读取资源时,不应该依赖文件IO中的相对路径.工作目录取决于应用程序的启动方式.你完全没有控制权.始终在文件IO中使用绝对路径.

正常的方法是:

  • 将资源放在类路径中或将其路径添加到类路径中.然后您可以通过类加载器获取它,如下所示:

    String classPathLocation = "filename.ext";
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    InputStream input = classLoader.getResourceAsStream(classPathLocation);
    // ...
    
    Run Code Online (Sandbox Code Playgroud)

    请注意类加载器和资源的获取方式.你不应该从当前的类中获取它getClass().getResourceAsStream().在WAR中,可能存在多个类加载器的方法.当前类的类加载器可能不知道所需的资源本身,即上下文.

  • 将资源放在webcontent中(WEB-INF文件夹所在的位置和所有其他公共Web资源).然后你可以获得如下的绝对路径,你可以继续在通常的文件IO代码中使用它:

    String relativeWebPath = "/filename.ext";
    String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath);
    InputStream input = new FileInputStream(absoluteDiskPath);
    // ...
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,这仅在WAR扩展时有效,否则只会返回null.