如何启动Jetty Embedded作为Jenkins构建的一部分

时间:2013-08-08 17:32:34

标签: java jenkins continuous-integration jetty embedded-jetty

我有一个使用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;
}

2 个答案:

答案 0 :(得分:1)

server.join();调用将使当前线程(运行main()的线程)等到服务器停止。

嵌入单元测试时,也不需要server.setStopAtShutdown(true)

请执行以下操作。

  • 构建服务器(例如使用junit的@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请求。