2

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

我们成功启动了数据库。但是我们认为插件在执行插件时会停止数据库。执行后数据库应继续运行,但似乎立即停止。

我们的猜测是我们应该使用 'fork' 和 'spawn' 属性(它们也在来自 ant 的 build.xml 中),但我们不知道如何在 DatabaseController 的 java 类中实现它们(其中扩展自 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();

亲切的问候,

杰伦

4

2 回答 2

0

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

./maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ForkStarter.java
于 2011-08-04T15:06:03.133 回答
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 可以让您的代码在后台运行。猜的,不过你可以试试。

于 2012-01-18T14:20:12.620 回答