英文:
Why getting error "The absolute uri: [http://tiles.apache.org/tags-tiles] cannot be resolved in either web.xml or the jar files deployed"
问题
我有一个使用Spring MVC、JSP和Apache Tiles构建的Java Web应用程序。
相同的WAR文件在Windows 10和Mac上运行良好。
但是在Ubuntu上(Amazon AWS上的18.04版本),我遇到了一个错误:
org.apache.jasper.JasperException: 无法在web.xml或部署在此应用程序中的jar文件中解析绝对uri:[http://tiles.apache.org/tags-tiles]
我的pom.xml文件中有以下与Tiles相关的依赖项...
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-jsp</artifactId>
<version>3.0.7</version>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-autotag</artifactId>
<version>1.2</version>
<type>pom</type>
</dependency>
生成的WAR文件在WEB-INF/lib文件夹中有以下JAR文件...
tiles-api-3.0.7.jar
tiles-autotag-core-runtime-1.2.jar
tiles-core-3.0.7.jar
tiles-jsp-3.0.7.jar
tiles-request-api-1.0.6.jar
tiles-request-jsp-1.0.6.jar
tiles-request-servlet-1.0.6.jar
tiles-servlet-3.0.7.jar
tiles-template-3.0.7.jar
另外,请注意,/examples
应用程序似乎正常工作。我对Linux不太熟悉...这可能与Ubuntu相关的文件权限有关吗?
更多堆栈跟踪细节,如果有用的话...
org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是org.apache.tiles.request.render.CannotRenderException:包含路径'/WEB-INF/jsp/f_layout.jsp'。
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:986)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:870)
[...]
org.apache.tiles.request.render.CannotRenderException:包含路径'/WEB-INF/jsp/f_layout.jsp'的ServletException。
org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:399)
org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:238)
org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:221)
org.apache.tiles.renderer.DefinitionRenderer.render(DefinitionRenderer.java:59)
[...]
org.apache.jasper.JasperException:无法在web.xml或部署在此应用程序中的jar文件中解析绝对uri:[http://tiles.apache.org/tags-tiles]
org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:55)
org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:293)
org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:80)
org.apache.jasper.compiler.TagLibraryInfoImpl.generateTldResourcePath(TagLibraryInfoImpl.java:251)
org.apache.jasper.compiler.TagLibraryInfoImpl.
org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:431)
org.apache.jasper.compiler.Parser.parseDirective(Parser.java:489)
英文:
I have a Java web application built with Spring MVC, JSPs, and Apache Tiles.
The same WAR file works fine on Windows 10 and Mac.
But on Ubuntu (18.04 on Amazon AWS) I get an error:
org.apache.jasper.JasperException: The absolute uri: [http://tiles.apache.org/tags-tiles] cannot be resolved in either web.xml or the jar files deployed with this application
My pom.xml file has these tiles-related dependencies ...
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-jsp</artifactId>
<version>3.0.7</version>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-autotag</artifactId>
<version>1.2</version>
<type>pom</type>
</dependency>
And the resulting WAR file has the following JAR files in the WEB-INF/lib folder ...
tiles-api-3.0.7.jar
tiles-autotag-core-runtime-1.2.jar
tiles-core-3.0.7.jar
tiles-jsp-3.0.7.jar
tiles-request-api-1.0.6.jar
tiles-request-jsp-1.0.6.jar
tiles-request-servlet-1.0.6.jar
tiles-servlet-3.0.7.jar
tiles-template-3.0.7.jar
Also note, the tomcat /examples
application seems to work fine. I'm pretty new to linux ... could this be an Ubuntu-related file permissions thing?
More stack trace details, in case it's useful ...
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.apache.tiles.request.render.CannotRenderException: ServletException including path '/WEB-INF/jsp/f_layout.jsp'.
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:986)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:870)
[...]
org.apache.tiles.request.render.CannotRenderException: ServletException including path '/WEB-INF/jsp/f_layout.jsp'.
org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:399)
org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:238)
org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:221)
org.apache.tiles.renderer.DefinitionRenderer.render(DefinitionRenderer.java:59)
[...]
org.apache.jasper.JasperException: The absolute uri: [http://tiles.apache.org/tags-tiles] cannot be resolved in either web.xml or the jar files deployed with this application
org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:55)
org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:293)
org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:80)
org.apache.jasper.compiler.TagLibraryInfoImpl.generateTldResourcePath(TagLibraryInfoImpl.java:251)
org.apache.jasper.compiler.TagLibraryInfoImpl.<init>(TagLibraryInfoImpl.java:122)
org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:431)
org.apache.jasper.compiler.Parser.parseDirective(Parser.java:489)
答案1
得分: 2
问题的根本原因是,由于某种原因,Tomcat不再在Tiles库的JAR文件内部寻找TLD文件。有一种方法可以关闭TLD扫描器(<Context processTlds="false" ... />
),但我的并没有被关闭。
我不知道我做了什么导致这个问题开始发生 - 我对Tomcat配置进行了很少的更改。
一个解决办法是手动将TLD文件从Tiles JAR文件内复制出,并将其复制到/WEB-INF文件夹中。这样问题就停止了,但之后我将不得不为项目中的许多其他JAR文件执行此操作。(例如:在为Tiles执行此操作后,SpringSecurity也出现了相同的错误)。
最后,我创建了一个新的Ubuntu 18.04实例,并安装了全新的Java和Tomcat副本,一切正常。
更新:
在调整配置文件后,问题很可能是由/var/lib/tomcat8/conf/catalina.properties
中的这行代码引起的...
tomcat.util.scan.StandardJarScanFilter.jarsToSkip=\
*.jar,\
[...]
... 这导致在扫描过程中跳过了所有的JAR文件。
英文:
The problem turned out to be that for some reason Tomcat was no longer looking for the Tiles library's TLD file inside the Tiles JAR file. There's a way to turn off TLD scanner (<Context processTlds="false" ... />
) but mine wasn't turned off.
I don't know what I did to cause this to start happening -- I made very little changes to the tomcat configuration.
A workaround to stop the problem was to manually copy the TLD file from inside the Tiles JAR file and copy it to the /WEB-INF folder. That made the problem stop, but then I'd have to do this for many other JAR files in my project. (For Example: After doing it for Tiles, I got the same error for SpringSecurity).
In the end, I created a new Ubuntu 18.04 instance and installed fresh copies of Java and Tomcat, and everything worked.
UPDATE:
After fiddling with config files, it's likely the problem I had was caused by this line in /var/lib/tomcat8/conf/catalina.properties
...
tomcat.util.scan.StandardJarScanFilter.jarsToSkip=\
*.jar,\
[...]
... which caused all JAR files to get skipped during scanning.
答案2
得分: 1
相同的方法对我也起作用。我正在使用Spring Boot和Apache Tiles-JSP版本3.0.8进行教程。我使用以下命令提取了此jar文件的内容:
jar xf tiles-jsp-3.0.8.jar
这将jar文件的内容写入了我的目录。我在META-INF目录中找到了tld文件。我将它们复制到了我的WEB-INF目录中,重新部署后错误消失了。
英文:
The same thing worked for me. I'm doing a tutorial using spring boot and apache tiles-jsp version 3.0.8. I extracted the contents of this jar using the following:
jar xf tiles-jsp-3.0.8.jar
This wrote the contents of the jar into my directory. I found the tld files in the META-INF directory. I copied them to my WEB-INF directory, redeployed, and the error went away.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论