如何在Jetty Maven插件中启用CachingWebAppClassLoader?

pha*_*ani 6 java jetty maven maven-jetty-plugin

我正在尝试在开发环境中提高Java Web应用程序的启动性能.它使用jetty-maven-plugin并mvn jetty:run用于启动应用程序.

我按照http://www.eclipse.org/jetty/documentation/9.3.x/jetty-classloading.html上的说明注册了这个新的CachingWebAppClassLoader.

<Configure id="mywebapp" class="org.eclipse.jetty.webapp.WebAppContext">

...

  <Set name="classLoader">
    <New class="org.eclipse.jetty.webapp.CachingWebAppClassLoader">
      <Arg><Ref refid="mywebapp"/></Arg>
    </New>
  </Set>

...
</Configure>
Run Code Online (Sandbox Code Playgroud)

然而,org.eclipse.jetty.webapp.WebAppClassLoader.*继续出现在jvisualvm CPU采样器但不是CachingWebAppClassLoader

我验证了我的类加载器注册至少是通过提供一个无效的类名来发现的ClassNotFoundException.我猜我的类加载器的配置正在消耗但没有被使用或类似的东西.有任何想法吗?

此外,如果您了解可用于提高性能的任何其他类加载器变体,请告诉我.

zep*_*lin 3

jetty-maven-plugin使用专门的 WebAppContext,称为JettyWebAppContext

JettyWebAppContext 扩展 WebAppContext 以专门用于 Maven 环境。

因此,您的 WebAppContext 绑定jetty.xml已创建,但随后未被使用。

一个明显的解决方法是在 jetty.xml 中将WebApplicationContext类设置为,但不幸的是这不起作用org.eclipse.jetty.maven.plugin.JettyWebAppContext

您可以在 jetty.xml 中定义您的资源处理程序,但是您不应该在 jetty.xml 中定义您的 web 应用程序,因为 jetty maven 插件的目的是通过自动部署未组装的 web 应用程序来简化开发。因此,如果您将 webapp 定义从 jetty.xml 中取出,那么一切应该可以正常工作。

另一种可能的解决方法是使用配置元素在您的classLoader默认实例上设置属性,如下所述JettyWebAppContextpom.xmlwebApp

<webApp>         
    <classLoader>org.eclipse.jetty.webapp.CachingWebAppClassLoader</classLoader>
</webApp>  
Run Code Online (Sandbox Code Playgroud)

不幸的是,这也不起作用,因为CachingWebAppClassLoader构造函数需要引用底层WebAppClassLoader.Context,因此它将无法实例化。

我不确定是否有任何其他解决方法(也许使用额外的contextHandler可以做到这一点),但即使您设法使其与缓存类加载器一起工作,这也可能会破坏更改检测和热重新部署,这基本上是背后的核心思想jetty-maven-plugin

该目标在 Maven 项目上就地使用,无需首先将项目组装成 war,从而节省了开发周期的时间。

...

一旦调用,该插件可以配置为连续运行,扫描项目中的更改并在必要时自动执行热重新部署。这使得开发人员可以使用他们选择的 IDE 专注于对项目进行编码更改,并将这些更改立即透明地反映在正在运行的 Web 容器中,从而消除了浪费在重建、重新组装和重新部署上的开发时间。

所以我不确定这是否是一个好主意。