微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spring Boot 与 Jetty:禁用 o.a.tomcat.util.scan.StandardJarScanner

如何解决Spring Boot 与 Jetty:禁用 o.a.tomcat.util.scan.StandardJarScanner

我将 Spring Boot 与 Jetty 和 JSP/JSTL 结合使用:

        <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <exclusions>
                        <exclusion>
                                <groupId>org.springframework.boot</groupId>
                                <artifactId>spring-boot-starter-tomcat</artifactId>
                        </exclusion>
                </exclusions>
        </dependency>
        <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jetty</artifactId>
                <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>
        <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>apache-jsp</artifactId>
        </dependency>
        <dependency>
           <groupId>org.eclipse.jetty</groupId>
           <artifactId>apache-jstl</artifactId>
        </dependency>

在启动过程中,我收到许多警告,例如:

WARN 18439 --- [           main] o.a.tomcat.util.scan.StandardJarScanner  : Failed to scan [file:/home/user/.m2/repository/.../guava.jar] from classloader hierarchy

这些警告中有虚假的罐子。如果配置文件中没有配置文件并且运行的是 Jetty,为什么 tomcat 会扫描任何内容?是否需要扫描,例如JSP/JSTL?可以禁用吗?我无法使用 this,因为应用程序中没有可用的 Tomcat 库。

编辑:Tomcat (?) 源显然是由 Jasper 调用的,由 Jetty 依次使用。因此,我将其放入 pom.xml 以禁用 Jetty 的 Jar 扫描:

    <plugin>  
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-maven-plugin</artifactId>
        <configuration>
            <webApp>

                <!-- no need to scan anything as we're using servlet 2.5 and moreover,we're not using Servl
                <!-- for more relevant information regarding scanning of classes refer to https://java.net/j
                <webInfIncludeJarPattern>^$</webInfIncludeJarPattern>
                <containerIncludeJarPattern>^$</containerIncludeJarPattern>
                <!--<webInfIncludeJarPattern>.*/spring-[^/]*\.jar$|.*/.*jsp-api-[^/]\.jar$|./.*jsp-[^/]\.jar
            </webApp>
        </configuration>
    </plugin>

但是没有任何效果

解决方法

您的 org.apache.tomcat.util.scan.StandardJarScanner 来自类路径上的 apache-jsp-<ver>.jar

Apache Jasper JSP 在执行 JSPC 步骤时需要扫描您的类路径以查找 TLD。

由于您使用的是 spring-boot,WebAppClassLoader 和 SystemClassLoader 并没有真正的分离,因此它被迫扫描整个类加载器层次结构以找到这些 TLD。

此扫描独立于 Jetty,因此这意味着 webInfIncludeJarPatterncontainerIncludeJarPattern 配置将没有影响。

这里最好的建议是在构建时使用 jspc 预编译您的 JSP,并且让运行时 Jasper JSP 永远不需要启动 JSPC 及其关联的 TLD 扫描。

如果您仍然需要运行时 JSPC,请考虑在服务器启动时设置以下属性,在您的上下文开始初始化之前。

System.setProperty(
  org.apache.tomcat.util.scan.Constants.SKIP_JARS_PROPERTY,"*.jar");

这会告诉 StandardJarScanFilter 跳过所有以 .jar 结尾的文件。

请注意,还有一个 Constants.SCAN_JARS_PROPERTY 可以指定要扫描的特定 jar。 (不知道这个属性是否支持globs,或者相对引用)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。