2011-08-25 122 views
6

我正在使用标准Maven目录结构设置项目,因此我有一个名为“resources”的文件夹,在此文件夹中我创建了一个名为“fonts”的文件夹,然后在其中放入一个文件。我需要在第三方库中传递完整的String文件路径(位于我的项目结构中的文件,位于resources/fonts/somefont.ttf)到我正在使用的对象,如下所示,我已经搜索了一段时间但是对于这样做的正确方法已经变得有点困惑。我试过如下,但无法找到它。我看着使用ResourceBundle,但似乎涉及制作一个实际的File对象,当我只需要路径传递到像下面的方法(不要在我面前实际的方法调用,所以只是从我的例子内存):Java(maven web应用程序),获取资源文件夹中文件的完整文件路径?

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

+0

可能没有什么是错的:)谢谢,我不是那么熟悉'ResourceBundle',所以没有意识到这将工作,谢谢你的提示 – Rick

+0

其实让我发布一些我已经用过的伪代码以下成功 - 不确定在ResourceBundle上,但资源(在春季以外)工作: – BobG

回答

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”。

+0

我实际上并没有使用弹簧这个特定的项目,可能应该已经离开那个关键字出来了,我确实有必要在春天做它,所以我一直在寻找一种方法,可以在struts/spring – Rick

+0

中对代码进行小修改:ClassPathResource rsrc = new ClassPathResource(classpathRelativePath);这样你可以调用方法.getFile() –

+0

@GoranNastov当前的文档显示了一个'Resource#getFile()'调用;你能详细说明吗? http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/io/Resource.html#getFile-- –

0

你可以看一下答案类似的路线,我不得不 Loading XML Files during Maven Test run

通过BobG给出的答案应该工作的问题。尽管您需要记住资源文件的路径与当前类的路径有关。资源和Java源文件都在类路径中

1

如果您的资源目录位于战争的根目录中,那意味着资源/字体/ somefont.ttf将成为该文件可用的“虚拟路径”。您可以从ServletContext中获取get the "real path" - 绝对文件系统路径。注意(在文档中)这只有在WAR爆炸时才起作用。如果您的容器在不扩展的情况下从war文件运行应用程序,则此方法不起作用。

+0

我们确实将它作为爆炸运行,我没有看到很快就会发生变化,所以这应该可行,谢谢提示 – Rick

3

您可以使用下面提及获取文件的路径:

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

使用/传递的路径,你的方法。

1
URL resource = getServletContext().getResource("/WEB-INF/classes/fonts/somefont.ttf"); 
String relativePath = resource.getPath(); 
+0

如果路径无法在URL中表示并获取URL编码,则不起作用。 –

相关问题