Web项目中的Java文件路径
我需要从一个类访问我的Web项目中的资源文件。 问题是开发时的路径与已部署的路径不同。
例如,如果我想在开发时访问某些css文件,我可以这样做:
File file = new File("src/main/webapp/resources/styles/some.css/");
但是一旦部署它可能不起作用,因为目标文件夹中没有src
或main
目录。 那么如何一致地访问文件呢?
您似乎将CSS文件存储在类路径中,原因有些不明显。 文件夹名称src
是典型的Eclipse项目源文件夹的默认名称。 而且它显然神奇地用作File
构造函数中的相对路径(坏,坏),只确认您在IDE上下文中运行它。
这确实不便携。
你不应该使用File
的构造函数。 如果资源位于类路径中,则需要将其作为类路径中的资源获取。
InputStream input = getClass().getResourceAsStream("/main/webapp/resources/styles/some.css"); // ...
假设当前类在相同的上下文中运行,无论运行时环境如何,这都将起作用。
也可以看看:
- getResourceAsStream()vs FileInputStream
更新 :啊,function要求现在更清楚了。
其实我想从文件中获取lastModified。 是否可以使用InputStream? –
使用getResource()
代替将其作为URL
获取。 然后,您可以打开它上面的连接并请求lastModified
。
URL url = getClass().getResource("/main/webapp/resources/styles/some.css"); long lastModified = url.openConnection().getLastModified(); // ...
如果您要查看的是打开一个位于应用程序浏览器可见部分内的文件,我建议使用ServletContext.getRealPath(…)
从而:
File f = new File(this.getServletContext().getRealPath("relative/path/to/your/file"));
注意:如果您不在servlet中,则可能需要跳过一些额外的环以获取ServletContext
,但它应始终在Web环境中可用。 此解决方案还允许您将.css文件放在用户浏览器可以看到的位置,而将其放在/WEB-INF/
则会隐藏用户的文件。
将外部资源放在项目的WEB-INF
文件夹的子目录中。 例如,将您的css资源放在WEB-INF/styles
,您应该能够以下列方式访问它们:
新文件(“styles / some.css”);
除非您没有使用标准WAR进行部署,否则在这种情况下,您应该解释您的设置。
通常,资源文件与您的类文件一起放在您的战争中。 因此,他们将在类路径上,并可以通过查找
getClass.getResource("/resources/styles/some.css")
或者通过打开文件@ ig0774提到。
如果资源位于WAR中未部署的目录中(假设您需要在不重新部署的情况下进行更改),则可以使用VM arg定义资源的路径。
-Dresource.dir=/src/main/webapp/resources
并通过该变量进行查找以加载它。
在Java Web项目中,标准目录如:
{WEB-ROOT} / /WEB-INF/ /WEB-INF/lib/ /WEB-INF/classes
因此,如果您可以在文件系统动态中获取类文件路径,则可以获取资源文件路径。
你可以通过以下方式获得路径(/ WEB-INF / classes /):
this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath()
所以,接下来……