Java(Maven Web应用程序):如何获取资源文件夹中文件的完整路径?

6
我正在处理一个使用标准Maven目录结构设置的项目,因此我有一个名为“资源”的文件夹,并在其中创建了一个名为“字体”的文件夹,然后将文件放入该文件夹中。 我需要将完整的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

1
从ResourceBundle获取File对象,然后使用File.getAbsolutePath()传递给FontFactory.somemethod()有什么问题吗?(请记住,如果WAR在部署时未展开,则无法保证获取到File对象。) - BobG
可能没有什么问题 :) 谢谢,我对 ResourceBundle 不是很熟悉,所以没有意识到这会起作用,感谢提示。 - Rick
实际上,让我向您展示一些我曾经成功使用的伪代码 - 不确定ResourceBundle是否可用,但Spring中的Resource可以使用: - BobG
1
谢谢,明天我再回到我的IDE时会尝试这个。 - Rick
4个回答

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" 的东西。

我实际上并没有在这个特定项目中使用 Spring,也许不应该将那个关键字留下来。虽然有时候我确实需要在 Spring 中完成这个任务,所以我正在寻找一种既能在 Struts,又能在 Spring 中使用的方法。 - Rick
代码的小修正:ClassPathResource rsrc = new ClassPathResource(classpathRelativePath); 这样你就可以调用方法.getFile()。 - Goran Nastov
@GoranNastov 目前的文档显示了一个 Resource#getFile() 调用; 你能详细说明一下吗?http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/io/Resource.html#getFile-- - Dave Newton
@DaveNewton 感谢您的评论。我可能使用的是旧版本或不同的界面。我进行了测试,我的更新已经更正。 - Goran Nastov

3

您可以使用以下方法获取文件路径:

String fileName = "/filename.extension"; //use forward slash to recognize your file
String path = this.getClass().getResource(fileName).toString();

使用/传递到您的方法的路径。


1

如果您的资源目录位于war包的根目录下,那么resources/fonts/somefont.ttf将是一个“虚拟路径”,该文件可在其中使用。您可以从ServletContext中获取“真实路径”——绝对文件系统路径。请注意(在文档中),这仅适用于WAR已被解压缩的情况。如果您的容器在不展开WAR文件的情况下运行应用程序,则此方法将无法工作。


我们运行它时会将其解压,并且我认为这种情况不会很快改变,因此这应该有效。感谢你的提示。 - Rick

0

你可以查看我提到的类似问题的答案,链接如下:在Maven测试运行期间加载XML文件

BobG给出的答案应该是可行的。但需要记住,资源文件的路径是相对于当前类路径的路径。资源文件和Java源文件都在类路径中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接