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中的运行配置实现的。