Java 在maven插件中设置fork和spawn
我们正在将一个构建文件从ant转换为maven插件。我们正在尝试在maven插件中启动/停止数据库(hsqldb) 我们成功地启动了数据库。但是我们认为插件在执行时会停止数据库。数据库应该在执行后继续运行,但似乎马上就停止了 我们猜测应该使用“fork”和“spawn”属性(它们也在ant的build.xml中),但我们不知道如何在DatabaseController(从AbstractMojo扩展而来)的java类中实现它们 有什么想法吗 我们正在使用hsqldb,下面是我们初始化它的代码:Java 在maven插件中设置fork和spawn,java,ant,maven-plugin,hsqldb,spawn,Java,Ant,Maven Plugin,Hsqldb,Spawn,我们正在将一个构建文件从ant转换为maven插件。我们正在尝试在maven插件中启动/停止数据库(hsqldb) 我们成功地启动了数据库。但是我们认为插件在执行时会停止数据库。数据库应该在执行后继续运行,但似乎马上就停止了 我们猜测应该使用“fork”和“spawn”属性(它们也在ant的build.xml中),但我们不知道如何在DatabaseController(从AbstractMojo扩展而来)的java类中实现它们 有什么想法吗 我们正在使用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您可以做的一件事是,查看现有的maven插件,这些插件可以分叉新的java进程。Maven surefire插件,做一些类似的事情。Surefire有一个名为
forkMode
的配置(将在pom.xml中指定),用于控制分叉。
您可能需要通过插件的(svn签出代码)来了解它。
我对surefire不太熟悉。但首先,您可以阅读以下类(#fork(对象测试集,属性…
)
您可以做的一件事是,查看现有的maven插件,这些插件可以对新的java进程进行分叉。maven surefire插件可以做类似的事情。surefire有一个名为
forkMode
的配置(将在pom.xml中指定),它控制分叉。
您可能需要通过插件的(svn签出代码)来了解它。
我对surefire不太熟悉。但首先,您可以阅读以下类(#fork(对象测试集,属性…
)
在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可以让您的代码在后台运行。
这是假设,但你可以试试。在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可以让您的代码在后台运行。
这是一个假设,但你可以试试。好吧,如果你在
hsqlServer.stop()
上得到一个NullPointerException,那么hsqlServer
必须为null,对吗?或者你的意思是hsqlServer.stop()
抛出一个NullPointerException?在这种情况下,请提供堆栈跟踪。NullPointerException已修复,我们现在可以在cmd中运行数据库。问题是:当我们运行插件时,当插件停止时,数据库仍会关闭。我们创建了某种循环以保持数据库活动,然后它完全工作。现在唯一的问题是:我们不能再在cmd中执行任何操作,因为程序被“困”在循环中,我们希望避免这种情况。也许有其他方法可以解决这个问题,但我想不出除了fork和/或spawn之外的其他方法。如果在hsqlServer.stop()中出现NullPointerException
,那么hsqlServer
必须为空,对吗?或者您的意思是hsqlServer.stop()
抛出一个NullPointerException?在这种情况下,请提供堆栈跟踪。NullPointerException已修复,我们现在可以在cmd中运行数据库。问题是:当我们运行插件时,当插件停止时,数据库仍会关闭。我们创建了某种循环以保持数据库活动,然后它完全工作。现在唯一的问题是:我们不能再在cmd中执行任何操作,因为程序“被困”在循环中,我们希望避免这种情况。也许有其他方法可以解决这个问题,但我想不出除了fork和/或spawn之外的其他方法。