如何读取部署在 Tomcat 中的未爆炸战争文件中的资源文件?

Posted

技术标签:

【中文标题】如何读取部署在 Tomcat 中的未爆炸战争文件中的资源文件?【英文标题】:How can I read a resource file in an unexploded war file deployed in Tomcat? 【发布时间】:2012-02-04 11:33:23 【问题描述】:

我正在尝试加载二进制图像文件以在我的服务器端 Java 代码中进行一些处理。我目前正在将我的图像放在我的执行类所在的包中并调用:

Image img = Image.getInstance(this.getClass().getResource("logo.png"));

当我在我的开发机器上运行 Tomcat 时,这工作正常,但是当我部署到运行 Tomcat 的服务器上时,它不会爆炸战争文件,对 getResource 的调用返回 null。

我还尝试将图像移动到我的上下文根目录并像这样访问它:

Image img = Image.getInstance(this.getClass().getResource("/../../logo.png"));

同样,这适用于我的开发箱,但在我将其部署到其他地方时却不行。

有没有更好的方法来访问这个文件?我做错了什么?

谢谢!!

【问题讨论】:

我可能还应该提到我正在使用 Maven 来构建我的网络应用程序。我有一个完整的答案可以解决我的问题,但我不能在我自己的问题上发布 8 小时。 把资源放到你的“src/main/resources”目录下。然后通过以下方式访问它们: this.getClass().getResource("/logo.png");或者:Thread.currentThread().getContextClassLoader().getResource("logo.png"); 【参考方案1】:

你可以把你的图片放在你的类路径的根目录,然后试试这个:

Thread.currentThread().getContextClassLoader()
               .getResource("logo.png");

【讨论】:

+1 - 在类路径的根目录下,WAR 文件中的“WEB-INF/classes”是许多人放置所述资源的地方。虽然他们可以通过使用其中的“images/logo.png”之类的文件夹来组织。【参考方案2】:

如果您使用 Maven 进行构建,您需要确保图像确实被放入存档中。

将资源放在您的src/main/resources 目录中。然后访问它们:

this.getClass().getResource("/logo.png"); 

或:

Thread.currentThread().getContextClassLoader().getResource("logo.png"); 

(上面评论中的代码示例,但把答案放在更明显的地方)

【讨论】:

第一种情况请不要忘记文件名前的'/'

以上是关于如何读取部署在 Tomcat 中的未爆炸战争文件中的资源文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WildFly 10 中将爆炸战争部署为文件夹

如何修改 Jboss 部署战争文件中的文件?

如何使用 maven 中的 tomcat 插件部署多个战争?

如何在 Tomcat7 中部署 Grails 3.0.1 战争文件?

爆炸 WAR 文件的优点/缺点

如何使用詹金斯管道将战争部署到tomcat?