Tomcat/TomEE将"/localhost"添加到servletContext.getResource("myStaticFile")中

3
我的WAR包在正确的上下文根“/myApp”下在TomEE中部署得很好,因此我可以转到http://localhost:8080/myApp 我有一些静态文件存在于: /myApp/WEB-INF/files
从分解的WAR包中看,这些文件确实存在。我的问题是,在代码中,当我写servletContext.getResource("/WEB-INF/files/MyFile.json")时,我会收到一个文件未找到的错误,因为日志中的实际路径似乎是: /localhost/myApp/WEB-INF/files/MyFile.json 当我将应用程序部署在普通的Tomcat服务器、Google App Engine和WebSphere 7中时,该代码实际上是有效的。但是在TomEE中,我并不是在webapps下部署应用程序,而是在wtpwebapps下部署。我已经搜索了上下文配置,但其中大部分涉及使应用程序具有上下文根“”(将其设置为根应用程序)。
我可以编写一些代码来删除URL的“/ localhost”部分,但是为什么会出现这种情况?
2个回答

2

看起来像是Tomcat内部的jndi URL,格式如下:

jndi:/hostname/contextPath/pathInWebApp

看起来你发现了一个TomEE的bug。


是的,我也注意到URL中添加了“jndi;”部分,但认为这是正常的。您能否详细说明一下为什么这是一个错误,以便我能够理解发生了什么? - Justin
当您调用ServletContext.getResource()时,Tomcat会返回一个URL。Tomcat使用自定义的jndi方案,因为资源实现是针对JNDI API编写的,所以人们可以使用标准API来创建自己的实现。Tomcat附带了WAR和目录的实现。自定义实现从未真正发生过,但基于JNDI的方法一直保持到Tomcat 8被替换。无论如何,Tomcat有一个用于JNDI URL的自定义处理程序,而TomEE似乎没有完全正确地处理它。我不确定原因,但这就是我开始寻找的地方。 - Mark Thomas
顺便说一下,我已经切换到JBoss EAP 6.1(又名JBoss 7.x),但是使用servletContext.getResource(..)无法正常工作。看起来Jboss正在执行“/default-host/myApp/WEB-INF/files/MyFile.json”,与tomEE相同。既然我看到了这种模式,我想知道是否还有其他原因?路径/WEB-INF/files/MyFile.json是我的,其余部分是添加的。由于它是WAR文件,我尝试将其放在classes / WEB-INF中,而不仅仅是基本/WEB-INF(通过Maven构建),但没有成功。 - Justin

1

我曾经遇到过相同的问题,尝试访问位于WEB-INF文件夹内的log4j.properties文件。在我的本地tomcat 8中可以正常工作,但在运行tomcat 7的生产服务器上却出现了FileNotFoundException错误。因此,这并不是TomEE的问题。最终,我做了以下操作使其正常工作:

String filePath = context.getRealPath("/") + "/WEB-INF/config/log4j.properties";

那给了我完整的路径。在我的情况下是

/home/tomcat/tomcat7/webapps/MY-APPLICATION

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