code: public void run() {
          try {
              String archiveName = "testApp-" + (++appCount) + ".war";
              try {
                  WebArchive app = ShrinkWrap.create(WebArchive.class, archiveName);
                  for (Class<?> clazz : classes) {
                      app = app.addClass(clazz);
                  }
  
                  RemoteFile logFile = server.getDefaultLogFile();
                  server.setMarkToEndOfLog(logFile);
  
                  ShrinkHelper.exportArtifact(app, "tmp/apps");
                  server.copyFileToLibertyServerRoot("tmp/apps", "dropins", archiveName);
  
                  for (String stringToFind : stringsToFind) {
                      String logLine = server.waitForStringInLogUsingMark(stringToFind + "|" + APP_START_CODE + "|" + APP_FAIL_CODE);
                      assertThat(logLine, Matchers.containsPattern(stringToFind));
                  }
              } finally {
                  server.deleteFileFromLibertyServerRoot("dropins/" + archiveName);
              }
          } catch (Exception e) {
              throw new RuntimeException(e);
          }
      }
docs: Run the validation
  <p>
  This consists of the following steps
  <ul>
  <li>Build the app archive from the classes given using {@link #withClass(Class)}</li>
  <li>Deploy the app to the server passed to {@link #validateAppOn(LibertyServer)}</li>
  <li>if {@link #failsWith(String)} was called, validate that any expected messages are found in the log and that the app fails to start</li>
  <li>if {@link #succeedsWith(String)} was called, validate that any expected messages are found in the log and that the app starts successfully</li>
  <li>if {@link #succeeds()} was called, validate that the app starts successfully</li>
  <li>Remove the app from the server</li>
  </ul>