我有一个使用Jetty作为嵌入式应用服务器的webapp。我还为它设置了一个Main类,当我使用以下命令运行它时启动服务器:
java -jar foo.war
对于这部分,一切都按预期工作。我目前遇到的问题是将其与Jenkins集成。
如果我执行java -jar foo.war
作为批处理命令,服务器启动但构建没有完成 - 它只是一直显示服务器控制台(毕竟它是有道理的,因为一切都是同一个过程的一部分) 。我想我应该生成一个新进程,但如何生成一个新进程并在服务器启动后“通知”主进程?
我需要在应用程序服务器启动后运行我的验收测试(也称为selenium测试)。
Jenkins在Windows Server下运行(不幸的是)。不确定这是否相关,但下面是我用来启动应用程序服务器的代码(稍微简化):
public static void main(String[] args) throws Exception {
Server server = new Server(8082);
server.setHandler(getHandlers(server));
server.setStopAtShutdown(true);
server.start();
server.join();
}
private static HandlerList getHandlers(Server server) {
ProtectionDomain protectionDomain = WebServer.class.getProtectionDomain();
URL location = protectionDomain.getCodeSource().getLocation();
WebAppContext webapp = new WebAppContext(location.toExternalForm(), "/");
HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[] {
webapp
});
return handlers;
}
答案 0 :(得分:1)
server.join();
调用将使当前线程(运行main()
的线程)等到服务器停止。
嵌入单元测试时,也不需要server.setStopAtShutdown(true)
。
请执行以下操作。
@BeforeClass
)server.start();
server.stop();
答案 1 :(得分:0)
我创建了一个小型CLI程序(使用JCommander),它负责启动和停止服务器。举个例子:
java -jar jetty-cli -start -warFile C:\\app.war
java -jar jetty-cli -stop -password shutdownpassword
启动服务器
我生成一个新进程(使用Runtime.getRuntime()
),执行runnable war文件并捕获控制台输出,直到我知道服务器已启动。我不会说我对这种方法很满意(我不喜欢捕获服务器输出以检测服务器何时启动)。无论如何:
//Server
server.addLifeCycleListener(new AbstractLifeCycle.AbstractLifeCycleListener() {
@Override
public void lifeCycleStarted(LifeCycle event) {
System.out.println(STARTED_MESSAGE);
}
});
//CLI
Process warProcess = Runtime.getRuntime().exec("java -jar " + options.getWarFile());
InputStream inputStream = warProcess .getInputStream();
InputStreamReader streamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(streamReader);
String line;
while ((line = bufferedReader .readLine()) != null) {
if (line.contains(STARTED_MESSAGE)) {
System.exit(0);
}
}
停止服务器:
我使用Jetty自己的ShutdownHandler
,它会在有效的POST请求中关闭服务器http://localhost:<port>/shutdown/?token=<shutdowntoken>
。
private Handler createShutdownHandler(Server server) {
return new ShutdownHandler(server, "shutdownpassword");
}
所以我需要做的是对http://localhost:8080/shutdown?token=shutdownpassword
的POST请求。