在maven插件中设置fork和spawn

时间:2011-05-05 08:56:59

标签: java ant maven-plugin hsqldb spawn

我们正在将构建文件从ant转换为maven插件。我们试图在maven插件中启动/停止数据库(hsqldb)。

我们成功启动了数据库。但我们认为插件在执行插件时会停止数据库。数据库应该在执行后继续运行,但它似乎马上就会停止。

我们的猜测是我们应该使用'fork'和'spawn'属性(它们也在我们的ant的build.xml中),但我们不知道如何在我们的java类中实现它们DatabaseController(从AbstractMojo扩展而来)。

有什么想法吗?

我们正在使用hsqldb,这是我们初始化它的代码:

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

2 个答案:

答案 0 :(得分:0)

您可以做的一件事是,查看现有的maven插件,这些插件可以分析新的java进程。 Maven-surefire-plugin for one,做类似的事情。 Surefire有一个名为forkMode的配置(将在pom.xml中指定),它可以控制分叉。 您可能必须通过插件的source(svn checkout代码)才能弄明白。 我对surefire不太熟悉。但首先,您可以阅读以下课程(#fork( Object testSet, Properties...)!

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

答案 1 :(得分: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();

使用守护程序线程,maven可能会使您的代码在后台运行。 这是假设,但你可以试试。