Выполнение файла JAR в другом приложении Java - PullRequest
2 голосов
/ 11 февраля 2011

Я пытаюсь запустить файл External Jar, фактически не вставляя его в сам файл Jar. Поскольку файл jar должен находиться в той же папке, что и основной файл jar.

Итак, в основном файле jar я хочу выполнить другой исполняемый файл jar, и мне нужно знать, когда заканчивается файл jar И когда вы закрываете основной файл jar, файл jar, запускаемый в файл jar должен быть закрыт,

В настоящее время я делаю это, используя этот код:

public void LaunchLatestBuild()
  {
    try {
      String path = new File(".").getCanonicalPath() + 
        "\\externaljar.jar";
      List commands = new ArrayList();
      commands.add(getJreExecutable().toString());
      commands.add("-Xmx" + this.btd_serverram + "M");
      commands.add("-Xms" + this.btd_serverram + "M");
      commands.add("-jar");
      commands.add(path);

      int returnint = launch(commands); //It just waits and stops the tread here. And my Runtime.getRuntime().addShutdownHook doesn't get triggerd.

      if (returnint != 201) //201 is a custom exit code I 'use' to know when the app needs a restart or not.
      {
        System.out.println("No restart needed! Closing...");
        System.exit(1);
      }
      else
      {
        CloseCraftBukkit();

        Launcher.main(new String[] { "" });
      }
    }
    catch (Exception e)
    {
      System.out.println(e.toString());
      e.printStackTrace();
    }
  }
  public int launch(List<String> cmdarray) throws IOException, InterruptedException
  {
    byte[] buffer = new byte[1024];

    ProcessBuilder processBuilder = new ProcessBuilder(cmdarray);
    processBuilder.redirectErrorStream(true);
    this.CBProcess = processBuilder.start();
    InputStream in = this.CBProcess.getInputStream();
    while (true) {
      int r = in.read(buffer);
      if (r <= 0) {
        break;
      }
      System.out.write(buffer, 0, r);
    }

    return this.CBProcess.exitValue();
  }

Ограничения этого кода:

  • Не закрывает мой externaljar.jar java процесс на выходе из основного применение.
  • Невозможно перенаправить ввод с основной консоли на внешнюю банку.

Это самые важные вещи, которые мне нужны.

Надеюсь, кто-нибудь подскажет, как мне это сделать.

Текущий исходный код доступен по адресу: http://code.google.com/p/bukkit-to-date/

1 Ответ

2 голосов
/ 11 февраля 2011

Почему вы не можете просто установить свой путь к классу так, чтобы он включал второй jar, а затем вы можете просто использовать его как библиотеку?Вы даже можете вызвать метод MainClass.main() вручную, если вы действительно хотите, чтобы он был выполнен, но из той же виртуальной машины и без создания отдельного процесса.

РЕДАКТИРОВАТЬ: Если вы не знаете имяфайл jar при запуске приложения, но вы только выясните это во время выполнения, чтобы вызвать его, создайте URLClassLoader с указанием пути к файлу jar и затем:

URLClassLoader urlClassLoader = new URLClassLoader(
        new File("/path/to/your/jar/file.jar").toURI().toURL() );

ClassLoader cl = Thread.currentThread().getContextClassLoader();
// switch to your custom CL
Thread.currentThread().setContextClassLoader(urlClassLoader);
// do your stuff with the other jar
// ....................
// now switch back to the original CL
Thread.currentThread().setContextClassLoader(cl);

Или просто возьмите ссылку на класс в этом другом фляге и используйте отражение:

Class<?> c = urlClassLoader.loadClass("org.ogher.packag.ClassFromExternalJar");
...