Spring 使用 Jetty 启动:禁用 o.a.tomcat.util.scan.StandardJarScanner
Spring Boot with Jetty: disable o.a.tomcat.util.scan.StandardJarScanner
我使用 Spring Boot with 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
这些警告中有虚假的 jar。为什么 tomcat 扫描配置文件中不存在的任何内容并且运行的是 Jetty?是否需要扫描,例如JSP/JSTL?可以禁用吗?我无法使用 ,因为应用程序中没有可用的 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,因此这意味着 webInfIncludeJarPattern
和 containerIncludeJarPattern
配置不会产生影响。
这里最好的建议是在构建时用 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
,您可以指定要扫描的特定 jars。 (我不知道这个属性是否支持globs,或者相对引用)
我使用 Spring Boot with 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
这些警告中有虚假的 jar。为什么 tomcat 扫描配置文件中不存在的任何内容并且运行的是 Jetty?是否需要扫描,例如JSP/JSTL?可以禁用吗?我无法使用
编辑: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,因此这意味着 webInfIncludeJarPattern
和 containerIncludeJarPattern
配置不会产生影响。
这里最好的建议是在构建时用 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
,您可以指定要扫描的特定 jars。 (我不知道这个属性是否支持globs,或者相对引用)