2011-11-25 11 views
11

Sto provando a vietare la chiamata a System.exit(int); in alcuni barattoli.proibire la chiamata a System.exit

Questi vasi verranno sviluppati da team esterni e caricati dalla nostra applicazione "contenitore".

mio primo riflesso è quello di utilizzare il gestore della sicurezza Java:

-Djava.security.manager-Djava.security.debug=all 

con il file più semplice ${user.home}/.java.policy:

grant {}; 

Anche se non posso più chiamare come System.getProperties() (dal Non ho java.util.PropertyPermission), posso fare un System.exit (0) !!

L'opzione java.security.debug=all ha pronunciato la seguente console:

scl: getPerms ProtectionDomain (file: my-bin-path <no sign certificates>) 
sun.misc.Launcher $ AppClassLoader @ 10385c1 
<no principals> 
java.security.Permissions @ 15b7986 (
(java.lang.RuntimePermission exitVM) 
(java.io.FilePermission \my-bin-path\- read) 
) 

Perché tutte le classi nel mio-bin-path sono java.lang.RuntimePermission exitVM concesso ?????

grazie

+0

Apparentemente 'java.lang.RuntimePermission exitVM' è concesso per impostazione predefinita, forse è necessario negarlo esplicitamente. – Romain

+0

Mi aspetto che l'autorizzazione exitVM sia attiva per impostazione predefinita. Se una parte del codice Java raggiunge la fine della sua esecuzione allora forse ha bisogno di chiamare implicitamente System.exit (0) per dire alla VM che è stata eseguita. – Chris

+0

Suppongo che, se vuoi sapere come spegnerlo, ti consiglio di modificare la domanda per chiederglielo esplicitamente. – Chris

risposta

2

Dal Javadoc di RuntimePermission:

Nota: "exitVM *" L'autorizzazione viene concessa automaticamente a tutto il codice caricato nel percorso classe di applicazione, consentendo in tal modo le applicazioni di interrompere se stessi.

Leggendo questo, sembra che si debba negare esplicitamente questa autorizzazione scrivendo il proprio SecurityManager. (Per un esempio, vedere questa risposta: Prevent System.exit to actually exit the JVM)

+0

Grazie, lo trovi !! – kiki

1

In alternativa è possibile eseguire AOP e intercettare System.exit. Farlo sarebbe: creare il proprio caricatore di classe e utilizzare BPEL per tracciare System.exit e applicare le patch a tali chiamate. Davvero non è un grande sforzo.

3

In base alla segnalazione di bug, http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4286238, il file della politica non ha disabilitato le chiamate System.exit(). Sto eseguendo un'applicazione con Java 1.6 e sto ancora vedendo questo bug nonostante sia stato "risolto". Analogamente all'OP, dispongo di un file di criteri a livello di sistema che non include un'autorizzazione per exitVM. Tuttavia, sono in grado di uscire dall'applicazione senza alcuna eccezione.

La mia comprensione di includere un file dei criteri personalizzato è che tutte le autorizzazioni sono in blacklist tranne quelle incluse nel file delle politiche. Poiché exitVM non è incluso, dovrebbe essere disabilitato (ignorando l'autorizzazione predefinita menzionata da MicSim). Ma questo non è il caso.