JasperException - 即使存在标签也找不到文件

Posted

技术标签:

【中文标题】JasperException - 即使存在标签也找不到文件【英文标题】:JasperException - File Not Found even when tag is present 【发布时间】:2018-04-07 01:25:19 【问题描述】:

好的 ***,我会在需要的时候来找你。

我继承了一个带有自定义标签库的项目。该项目在 AEM 中,但问题更多的是直接的 Java 方面的问题,并且我所知道的不是 AEM 特有的问题。 AEM 是基于 OSGI 构建的,因此 可能 是相关的,但同样不太可能成为答案的一部分。

基本上,我只在两台服务器中的一台上遇到异常。它说:

org.apache.sling.api.scripting.ScriptEvaluationException:org.apache.sling.scripting.jsp.jasper.JasperException:找不到文件“/META-INF/tags/helloWorld.tagx”

现在 - 这个helloWorld.tagx 是模板项目中遗留下来的垃圾,但出于某种原因,它是必不可少的。这里有一些问题。

    标签 在正确的位置 (META-INF/tags/helloWorld.tagx),我正在使用 jsptld-maven-plugin 生成对我来说看起来正确的 tld 文件。

插件的配置(以及maven-bundle-plugin):

        <plugin>
            <groupId>com.squeakysand.jsp</groupId>
            <artifactId>jsptld-maven-plugin</artifactId>
            <configuration>
                <shortName>myproject</shortName>
                <processTagFiles>true</processTagFiles>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <extensions>true</extensions>
            <configuration>
                <instructions>
                    <Bundle-Activator>com.rebny.taglib.osgi.Activator</Bundle-Activator>
                    <Include-Resource>
                        META-INF/$project.artifactId-$project.version.tld=$project.build.outputDirectory/META-INF/$project.artifactId-$project.version.tld,
                        maven-resources
                    </Include-Resource>
                    <Sling-Bundle-Resources>
                        /META-INF/tags
                    </Sling-Bundle-Resources>
                </instructions>
            </configuration>
        </plugin> 

以及生成的 tld 文件中的段:

<tag-file>
    <name>helloWorld</name>
    <path>/META-INF/tags/helloWorld.tagx</path>
</tag-file>

所以对我来说它看起来不错,我进行了很多搜索,发现有语法错误等的人,但我不相信这里会出现这种情况,特别是因为它可以在一台服务器上运行。

    奇怪的是标签实际上并没有在任何地方使用,但是删除它并不能解决问题。抛出此错误的 jsp 使用其他标签,但不是这个。在整个项目中实际上没有对这个标签的引用——我认为它可能隐藏了另一个问题。该错误表明它位于 JSP 的第 6 行,但源 JSP 或编译后的 JSP 在第 6 行或文件中都没有任何有趣的内容。同样,即使是已编译的 JSP 也没有引用此标记!

我很乐意提供其他信息。我对此的了解很差,所以我不确定哪些信息是相关的。非常感谢任何帮助或故障排除提示!

完整的堆栈跟踪here

【问题讨论】:

你的两台机器有什么不同?例如相同版本的所有内容、相同的软件等? 完整的堆栈跟踪会有所帮助 您使用的是哪个应用服务器/容器?您能否提供包含在 WEB-INF/lib 中的文件列表? web.xml 中的 TLD 怎么样 - 你能提供 web.xml 吗?顺便说一句:我假设您的构建是简单的 Maven 构建,没有花哨的提取、重新打包。 @MicheleMariotti 添加了完整的堆栈跟踪。 gist.github.com/jamiecounsell/e5f31bfc5b2839ee816c217b0757628f 我认为,或者这是我的假设,它构建在一个地方,并在不同的服务器上执行。某处肯定存在差异-例如不同的JDK或不同版本的AEM。不是很了解,刚看到很多关于问题的报告,从6.1升级到6.3的时候,有些是用6.3.11修复的……反正奇怪的问题。 【参考方案1】:

问题与找不到脚本标记文件有关。 Reference。

这是一个 错误,它指出,如果捆绑包中的 taglib 引用了作为脚本实现的标记 (located in /META-INF/tags) 此脚本未找到,因为它是 搜索的在包含 tld 的包中。它被用作类路径上的资源。

该错误已在 JSP 2.3.2 版本中修复。所以在你的项目中使用这个 JSP 版本。此外,此错误将在 AEM 6.3.1.1 或更高版本中得到修复,

在这里,有一个与此问题相关的有用thread。

【讨论】:

感谢您的回答,但您会看到我已经对该线程发表了评论。不幸的是,该版本的 AEM 直到 11 月下旬才可用,而且太遥远了。【参考方案2】:

您最好的选择是通过Adobe Daycare。他们很擅长给你打补丁。特别是如果您的客户与他们有现有关系,如果他们使用 AEM,他们应该这样做。

【讨论】:

以上是关于JasperException - 即使存在标签也找不到文件的主要内容,如果未能解决你的问题,请参考以下文章

在Intellij Idea中使用JSTL标签库

在Intellij Idea中使用JSTL标签库

即使在页面加载后,Salesforce 闪电自定义标签也不会更新

Azure 发布管道:即使添加了替换镜像标签的步骤,Docker 镜像标签也不会被替换

Django - 一个计数器模板标签,即使使用嵌套的 for 标签也能很好地工作

即使存在,Hibernate 也无法找到命名参数