2017-04-05 91 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

相關問題