我正在使用标准Maven目录结构设置的项目,因此我有一个名为“resources”的文件夹,在此我创建了一个名为“fonts”的文件夹,然后在其中放入一个文件。我需要从第三方库中将完整的String
文件路径(位于我的项目结构中的文件位于resources/fonts/somefont.ttf
)传递给我正在使用的对象,如下所示,我已经搜索了一段时间,但是对于正确的方法这一点感到有点困惑。我尝试过如下,但无法找到它。我查看了使用ResourceBundle
,但这似乎涉及制作一个实际的File
对象,当我只需要传递给下面的方法的路径时(没有在前面的实际方法调用)我只是从我的记忆中给出一个例子):
FontFactory.somemethod("resources/fonts/somefont.ttf");
我原以为有一种方法,使用标准Maven目录结构的项目从资源文件夹中获取文件,而不必使用类/包中的完整相对路径。对此有任何建议都非常感谢。
我不想使用硬编码路径,因为在项目上工作的不同开发人员有不同的设置,我想将其作为项目的一部分包含在内,以便他们在签出项目源时直接获得它。
这适用于Web应用程序(Struts 1.3应用程序),当我查看爆炸的WAR文件(我通过Tomcat运行项目)时,文件位于:
<Exploded war dir>/resources/fonts/somefont.ttf
答案 0 :(得分:11)
代码:
import java.io.File;
import org.springframework.core.io.*;
public String getFontFilePath(String classpathRelativePath) {
Resource rsrc = new ClassPathResource(classpathRelativePath);
return rsrc.getFile().getAbsolutePath();
}
在你的情况下,classpathRelativePath就像“/resources/fonts/somefont.ttf”。
答案 1 :(得分:3)
您可以使用下面提到的来获取文件的路径:
String fileName = "/filename.extension"; //use forward slash to recognize your file
String path = this.getClass().getResource(fileName).toString();
使用/将路径传递给您的方法。
答案 2 :(得分:1)
如果您的资源目录位于战争的根目录中,那意味着resources / fonts / somefont.ttf将成为该文件可用的“虚拟路径”。您可以从ServletContext get the "real path" - 绝对文件系统路径。注意(在文档中)这仅在WAR爆炸时才有效。如果您的容器从war文件运行应用程序而不扩展它,则此方法将不起作用。
答案 3 :(得分:1)
URL resource = getServletContext().getResource("/WEB-INF/classes/fonts/somefont.ttf");
String relativePath = resource.getPath();
答案 4 :(得分:0)
你可以在我所拥有的类似路线上查找问题的答案 Loading XML Files during Maven Test run
BobG给出的答案应该有效。虽然您需要记住资源文件的路径是相对于当前类的路径。资源和java源文件都在类路径
中