Java 调用类,等待它退出,再次调用

Java 调用类,等待它退出,再次调用,java,securitymanager,systemexit,Java,Securitymanager,Systemexit,我正在开发一个程序,在这个程序中,我想循环几个配置文件,然后用每个文件调用一个类,并将该文件名作为参数,然后等待它完成。目前我正在做: for (int i = 1; i <= 3; i++){ String[] a = new String[1]; a[0] = "data/config" + i + ".xml"; edu.cwru.sepia.Main2.class.getMethod("main", String[].clas

我正在开发一个程序,在这个程序中,我想循环几个配置文件,然后用每个文件调用一个类,并将该文件名作为参数,然后等待它完成。目前我正在做:

    for (int i = 1; i <= 3; i++){
        String[] a = new String[1];
        a[0] = "data/config" + i + ".xml";
        edu.cwru.sepia.Main2.class.getMethod("main", String[].class).invoke(null, (Object)a);
    }

for(int i=1;i我知道两种可能的解决方法:

  • 您可以安装一个
    SecurityManager
    ,在调用此
    main()
    方法之前在其中实现
    checkExit()
    方法。这将防止
    System.exit()
    实际发生
  • 您可以在单独的VM中运行该方法,即使用
    Runtime.exec()
    方法之一启动它

两者都有优点和缺点。如果jar文件与系统属性混在一起,您可能希望使用单独的VM,如果没有,您可能希望使用SecurityManager,因为这样会减少开销。

如果问题确实是
系统。exit()
call在第三方类中,您应该能够按照中的建议解决此问题,该建议提供了以下代码:

  private static class ExitTrappedException extends SecurityException { }

  private static void forbidSystemExitCall() {
    final SecurityManager securityManager = new SecurityManager() {
      public void checkPermission( Permission permission ) {
        if( "exitVM".equals( permission.getName() ) ) {
          throw new ExitTrappedException() ;
        }
      }
    } ;
    System.setSecurityManager( securityManager ) ;
  }

  private static void enableSystemExitCall() {
    System.setSecurityManager( null ) ;
  }

然而,出于您的目的,它可能是一种更好的方法,只针对第三方应用程序,等待它终止。这样,您就不必担心第三方代码会在JVM实例中产生副作用,也不必试图猜测如何消除副作用。

最简单的方法不是f只需从一个shell脚本(或perl/python/ruby脚本)启动Java,然后多次启动VM

您也可以在Java中使用
Runtime.exec
ProcessBuilder.start
执行此操作

调用
System.exit()
时不停止JVM并不容易。但是有一种方法可以做到这一点:使用
System.setSecurityManager
调用安装您自己的
SecurityManager
。然后您可以覆盖
canExit
方法并抛出一个异常(或
Error
)子类。
但是,除非您了解结果,否则这是不可取的,因为它会为整个JVM打开SecurityManager,这可能会产生意外的结果。

在单独的线程中生成该方法。@CaptainMurphy在单独的线程中生成不会阻止对
System.exit()的明显调用
在jar文件中终止JVM-对于所有线程。@christianhujer很公平。如果这个jar坚持要杀死JVM,那么每次调用都必须产生一个新的JVM。在这种情况下,为什么不只是一个bash脚本呢?我宁愿使用Python,你能推荐一个资源来告诉我怎么做吗?我必须确保我运行的任何东西的类路径都包含数据文件夹,这是通过Java中的运行配置实现的。