¿Puede un JAR cargado ser eliminado por el proceso de Java?

Hola tengo el siguiente problema:

Dentro de un proceso de desinstalación, cargo un JAR (jdbc-driver).

URL pDriverJar = jarToDelete.toURI().toURL(); URL[] lURLList = new URL[]{pDriverJar}; URLClassLoader lLoader = new URLClassLoader(lURLList, Thread.currentThread().getContextClassLoader()); Thread.currentThread().setContextClassLoader(lLoader); Class aClass = Class.forName("jdbc.Driver"); // was Oracle: oracle.jdbc.OracleDriver but should not be important if(jarToDelete.delete()){ System.out.println("deleted"); }else { jarToDelete.deleteOnExit(); } 

Después de la terminación de la JVM, el jar sigue existiendo.

Como área de trabajo, he creado un archivo temporal, y he copiado el tarro a ese archivo temporal. Pero ahora el tempfile no se eliminará.

He leído, que si el ClassLoad es GC, se pueden eliminar los tarros cargados.

¿Alguien tiene una idea, cómo eliminar este archivo?

Depende del sistema operativo. Windows no le permitirá eliminar archivos que están en uso, pero Linux lo hará.

Una solución sería iniciar un segundo proceso que espere a que su JVM muera y luego eliminar el archivo, ya que incluso si borra todas las referencias a los cargadores de clases que lo usan, no hay garantía de que lo liberen. No hay forma de forzar la recolección de basura (o incluso la finalización) de un objeto.

Otra solución sería escribir el cargador de clases que carga el Jar. De esa manera, cuando quiera deshacerse de él, puede estar seguro de que el Frasco está cerrado. Si el único objeto que lo abrió fue su cargador de clases, entonces puede estar seguro de que es gratis y debería ser eliminable.

Este problema se solucionó en Java 7; use el método close() en la clase ClassLoader . Para versiones anteriores, hay varias opciones:

  • Escribe un cargador de clases personalizado, por ejemplo, como este

  • Usa la reflexión y cierra todas JarFile instancias de JarFile ; residen en sun.misc.URLClassPath