Author: echatellier Date: 2014-05-15 18:08:30 +0200 (Thu, 15 May 2014) New Revision: 3983 Url: http://forge.codelutin.com/projects/isis-fish/repository/revisions/3983 Log: refs #2255: Readd full classloader modification for aspectj Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/InProcessSimulatorLauncher.java Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/InProcessSimulatorLauncher.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/InProcessSimulatorLauncher.java 2014-05-15 15:31:29 UTC (rev 3982) +++ trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/InProcessSimulatorLauncher.java 2014-05-15 16:08:30 UTC (rev 3983) @@ -34,6 +34,7 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; +import java.util.Enumeration; import java.util.List; import org.apache.commons.io.FileUtils; @@ -70,6 +71,7 @@ import fr.ifremer.isisfish.simulator.Simulator; import fr.ifremer.isisfish.types.Month; import fr.ifremer.isisfish.types.TimeStep; +import fr.ifremer.isisfish.util.CompileHelper; /** * Fait une simulation dans la meme jvm. @@ -278,6 +280,9 @@ * @return le classe loader modifié */ protected AspectJUrlClassLoader changeClassLoader(Thread thread, File directory) { + /* + FIXME echatellier 20140419 : normalement c'est ce code original qui est bon + il fonctionne sur eclipse, mais pas en java -jar ... try { URL[] classpath = new URL[] { directory.toURI().toURL(), // poussin 20080821 : il semble ne plus trouve les formules, @@ -294,6 +299,37 @@ // impossible car on creer l'url a partir d'un File ce qui ne pose // noralement pas de probleme throw new IsisFishRuntimeException(t("isisfish.error.change.classloader", directory), eee); + }*/ + + // FIXME echatellier 20140419 : pour que aspectj fonctionne, on lui construit un urlclassloader + // complet avec toutes les urls + try { + List<URL> urls = new ArrayList<>(); + for (Enumeration<?> e = CompileHelper.class.getClassLoader() + .getResources("META-INF/MANIFEST.MF"); e.hasMoreElements();) { + URL url = (URL) e.nextElement(); + if (log.isDebugEnabled()) { + log.debug("Found manifest : " + url); + } + if ((url != null) && url.getFile().startsWith("file:/")) { + String jarPath = url.getPath().substring(0, + url.getPath().indexOf("!")); + urls.add(new URL(jarPath)); + } + } + urls.add(directory.toURI().toURL()); + urls.add(IsisFish.config.getCompileDirectory().toURI().toURL()); + AspectJUrlClassLoader loader = new AspectJUrlClassLoader(urls.toArray(new URL[urls.size()]), + IsisFish.class.getClassLoader()); + thread.setContextClassLoader(loader); + log.error("Classloader used for simulation: " + loader + " " + + Arrays.toString(loader.getURLs())); + return loader; + } catch (Exception eee) { + // on leve un runtime, car normalement cette erreur est pratiquement + // impossible car on creer l'url a partir d'un File ce qui ne pose + // noralement pas de probleme + throw new IsisFishRuntimeException(t("isisfish.error.change.classloader", directory), eee); } }