2011-05-05 69 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(); 

随着守护线程,行家可能的事情巫婆你的代码是在后台进行拼命地跑。这是假设,但你可以尝试。