2017-04-05 73 views
6

我正试图在开发环境中提高Java Web应用程序的启动性能。它使用jetty-maven-plugin和mvn jetty:run用于启动应用程序。如何在Jetty Maven插件中启用CachingWebAppClassLoader?

我按照说明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> 

然而,org.eclipse.jetty.webapp.WebAppClassLoader.*继续jvisualvm CPU采样露面,但不是CachingWebAppClassLoader

我核实,我的类加载器的注册是至少被提供在这种情况下ClassNotFoundException被抛出一个无效的类名称发现。我猜测我的类加载器的配置正在被使用,但没有被使用或类似的东西。有任何想法吗?

此外,如果您知道可用于提高性能的其他类加载器变体,请告诉我们。

+0

'CachingWebAppClassLoader'实际上扩展了'WebAppClassLoader',所以我想你会在jvisualvm中看到'WebAppClassLoader。*',因为它继承了大量的实现。 –

+0

感谢您的回复。不知道我是否同意。如果这是真的,我们应该只看到'java.lang.Object'。如我错了请纠正我。 – phani

回答

3

jetty-maven-plugin使用一个专门的WebAppContext,叫JettyWebAppContext

JettyWebAppContext扩展了WebAppContext专门为Maven的环境。

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

一个明显的解决方法是将您的WebApplicationContext类设置为org.eclipse.jetty.maven.plugin.JettyWebAppContext在你的jetty.xml, 可惜这does not work

您可以定义的jetty.xml你resourcehandler,但你 不应该在jetty.xml中定义您的web应用程序,因为maven插件的目的是通过自动部署 未组装的web应用程序来简化开发。所以,如果你把你的web应用定义从 jetty.xml的事情应该工作。

另一种可能的解决方法将是设置在默认JettyWebAppContext实例classLoader财产在你pom.xml,使用webApp配置元素的描述here

<webApp>   
    <classLoader>org.eclipse.jetty.webapp.CachingWebAppClassLoader</classLoader> 
</webApp> 

不幸的是,这将不会工作,因为构造函数CachingWebAppClassLoader需要参考底层的WebAppClassLoader.Context,所以它将无法实例化。

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

这个目标是在现场用在Maven项目没有首先要求该项目组装成一场战争,在开发过程中节省时间。

...

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

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

+0

感谢您的回复。如果我理解正确,没有办法做到这一点? – phani

+0

@phani是的,正确的,至少不是通过常规的'jetty-maven-plugin'配置手段。 – zeppelin

相关问题