2011-05-05 125 views
2

我們正在將一個buildfile從ant轉換爲maven插件。我們試圖在maven插件中啓動/停止數據庫(hsqldb)。在maven插件中設置fork和spawn

我們成功地啓動了數據庫。但是我們認爲插件執行時插件會停止數據庫。數據庫應該在執行後繼續運行,但似乎馬上停止。我們的猜測是我們應該使用'fork'和'spawn'屬性(它們也位於我們的ant的build.xml中),但我們並不知道如何在我們的java類中實現它們我們的DatabaseController(它從AbstractMojo擴展)。

任何想法?

我們正在使用HSQLDB,THISIS代碼如何初始化:

hsqlServer = new Server(); 

hsqlServer.setLogWriter(null); 
hsqlServer.setSilent(true); 

hsqlServer.setDatabaseName(0, "database"); 
hsqlServer.setDatabasePath(0, "file:data/database"); 

getLog().info("Starting server!"); 
hsqlServer.start(); 

當我們運行該插件後,數據庫啓動時,我們甚至設法創建表並將數據寫入到它。然後插件停止,服務器自動停止。

如果我們運行另一個插件,一個停止服務器,我們總是在這條線得到一個NullPointerException:

hsqlServer.stop(); 

親切的問候,

的Jeroen

+0

那麼,如果你在'hsqlServer.stop()'得到一個NullPointerException,那麼'hsqlServer'必須爲null,對吧?或者你的意思是'hsqlServer.stop()'_throws_一個NullPointerException?在這種情況下,請提供堆棧跟蹤。 – 2011-05-06 13:08:51

+0

nullPointerException已修復,我們現在可以在cmd中運行數據庫。問題是:當我們運行插件時,插件停止時數據庫仍然關閉。我們創建了一些循環來保持數據庫的活躍,並且它完全可以工作。現在唯一的問題是:我們不能在cmd中做任何事情,因爲程序在循環中被「困住」,我們想避免這種情況。也許還有其他一些方法可以解決這個問題,但我想不出除叉子和/或衍生物之外的東西。 – Walle 2011-05-06 14:13:09

回答

0

一兩件事你可以做的是,查看現有的Maven插件來完成新的java進程。 Maven-surefire-plugin for one,做類似的事情。 Surefire具有一個名爲forkMode的配置(將在pom.xml中指定),該配置控制分叉。 您可能需要仔細閱讀插件的source(svn結帳代碼)。 我不太熟悉surefire。但是,作爲開始,您可以閱讀以下課程(#fork(Object testSet, Properties...)!

./maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ForkStarter.java 
0

在maven中執行的任何代碼在另一個進程中分叉。我曾在一些項目領域與流程合作過,但沒有明確的文檔。 你可以把你的代碼,這樣的事情:

Thread.currentThread().setDaemon(true); 
hsqlServer = new Server(); 

hsqlServer.setLogWriter(null); 
hsqlServer.setSilent(true); 

hsqlServer.setDatabaseName(0, "database"); 
hsqlServer.setDatabasePath(0, "file:data/database"); 

getLog().info("Starting server!"); 
hsqlServer.start(); 

隨着守護線程,行家可能的事情巫婆你的代碼是在後臺進行拼命地跑。這是假設,但你可以嘗試。