Resources not released

We have an outdated system that has an admim module that allows users to upload jar files. After loading, the jar file is checked and, if it does not comply with internal rules, it is deleted.

The problem is that windows throw an exception saying that the file is "already in use by another process." (when I call Files.delete(tmpJar);). I can’t determine why the file is open. It seems to me that I closed everything.

First, we use perffaces (4.0) to download the file. Pricelists rely on commons-fileupload (1.3.1). It calls the following method:

public void handleFileUpload(FileUploadEvent event) {
   Path tmpJar = null;
   try {
      tmpJar = Files.createFile(Paths.get(event.getFile().getFileName()));
      Files.write(tmpJar, event.getFile().getContents());
   } catch (IOException e) {
      LOGGER.error(e.getMessage(), e);
   }

   if (tmpJar != null) {
      try {
         this.validateJar(tmpJar.toString());
         Files.delete(tmpJar);
      } catch (IOException e) {
         LOGGER.error(e.getMessage(), e);
      }
   }
}

NIO Files.write "" - java. , , validateJar, Files.delete(tmpJar) . , , , ...

Job - , POJO. "jobAnnotation" Job. , .

private List<Job> validateJar(final String jarPath) throws IOException {
   List<Job> jobs = new ArrayList<Job>();

   try (JarFile jarFile = new JarFile(jarPath)) {
      URL[] jars = { new URL("file:" + jarPath) };

      ClassLoader jobClassLoader = URLClassLoader.newInstance(jars, this.getClass().getClassLoader());

      Enumeration<JarEntry> jarEntries = jarFile.entries();
      while (jarEntries.hasMoreElements()) {
         JarEntry jarEntry = jarEntries.nextElement();
         String className = jarEntry.getName();
         Class<?> classToLoad;
         try {
            classToLoad = Class.forName(className, true, jobClassLoader);
         } catch (Exception e1) {
            LOGGER.error(e1.getMessage(), e1);
            continue;
         }

         if (classToLoad.isAnnotationPresent(jobAnnotation)) {
            String vlr = null;
            try {
               Class<?> jobClass = (Class<?>) Class.forName(classToLoad.getCanonicalName(), true, jobClassLoader);
                Annotation annotation = jobClass.getAnnotation(jobAnnotation);
                Method method = annotation.getClass().getMethod("getValue");
                vlr = ((String) method.invoke(annotation, new Object[0]));
            } catch (Exception e1) {
               LOGGER.error(e1.getMessage(), e1);
            }

            Job job = new Job();
            job.setEnabled(true);
            job.setJarfile(jarPath);
            job.setClassName(classToLoad.getName());

            Parameter parameter = new Parameter();
            parameter.setRequired(true);
            parameter.setName("name");
            parameter.setValue(vlr);

            job.addParameter(parameter);
            jobs.add(job);
         }
      }
   } catch (IOException e) {
      throw e;
   }
   return jobs;
}

try-with-resources, try-catch-finally, JarFile, , . , , , , .

, , ( java?).

, , ? ?

, java 1.7.0_71, jboss 7.1.1, windows 7 (64).

+4
3

URLClassLoader close(). close() Jar, URLClassLoader. " ".

+1

File is already being used by another process. , , , . , , .

0

Some virus scanning software takes a long time to scan JAR. Try disabling Virusscanner. Other candidates may be the Windows indexer process or explorer.exe itself. When you find no reason to lock the file, try to delay between checking and deleting. Perhaps you need a loop with several attempts.

0
source

Source: https://habr.com/ru/post/1569441/


All Articles