2013-03-11 23 views
0

我需要每次在Jetty服務器中部署war文件之前執行java代碼。我的需要是,每當我部署一場新的戰爭時,我需要運行一個java代碼來清理我的db並在部署之前添加幾條記錄。如何在部署之前執行java程序

我可以在應用程序啓動時編寫它,但在部署發生時它是一次性過程。

任何人都可以建議如何做到這一點。謝謝。

+1

您尚未提及您定位的平臺。例如,如果它是Linux,則可以將WAR包裝爲RPM包。 RPM(和其他軟件包安裝程序)提供了在安裝前後運行腳本的功能。這可能看起來像很多努力,但通常通過易於安裝和維護來回報。 – 2013-03-11 13:35:01

+0

@ MarkO'Connor感謝您的意見馬克。目標是Windows和Linux。通常情況下,我們使用文件夾發行版,並在發生更改時僅替換那裏的WAR文件。 – vels4j 2013-03-11 14:33:04

回答

1

一種方法是從ContextListener調用代碼,但在WAR文件中放置一個標誌,以便在部署新的WAR文件時僅執行一次代碼。

例如,你可以把一個空文件在你的戰爭具有一定的名稱,並在您的ContextListener的代碼,做這樣的事情:

if(file is present){ 
    do something, call DB etc 
    delete(file) 
} 

另一種(也許更清潔?)的方法是把財產的配置屬性與假初始值文件,是這樣的:

initialDeploymentCodeExecuted=false 

然後檢查此屬性,而不是整個文件。如果它是假的,則在執行的代碼中將其更改爲true。

+0

好主意皮埃爾,這已經在我腦海裏了。我正在尋找一種標準方式來完成它,比如在部署生命週期中添加它。看看[這裏](http://wiki.eclipse.org/Jetty/Feature/Deployment_Manager)。 – vels4j 2013-03-11 08:13:46

+0

那麼據我所知,沒有標準的JEE方式去做這件事。一個「WebappLifecycleListener」或類似的東西雖然會很有用。而且我是Tomcat用戶,所以我也不知道任何Jetty特定的方式。祝你好運 ! – 2013-03-11 08:28:04

+0

完成你的方式。 – vels4j 2013-03-14 13:04:27

0

上下文偵聽器怎麼樣?您可以在contextInitialized()方法中添加數據庫清理代碼。

+0

感謝您的回答。每次應用程序啓動時,ServletContext都可以進行初始化。我需要一個在應用部署時運行一次性工作。即使我可以在那裏添加我的代碼,但在應用程序啓動時需要更多時間。 – vels4j 2013-03-11 07:27:56

+0

@ vels4j:所以即使應用程序被重新部署,你也不想運行它? – xyz 2013-03-11 07:30:17

+0

是的。每當部署新的war文件時,我都需要這樣做。 – vels4j 2013-03-11 07:33:39