r3971 - in trunk: . src/main/java/fr/ifremer/isisfish/aspect src/main/java/fr/ifremer/isisfish/simulator/launcher
Author: echatellier Date: 2014-04-18 15:30:39 +0200 (Fri, 18 Apr 2014) New Revision: 3971 Url: http://forge.codelutin.com/projects/isis-fish/repository/revisions/3971 Log: refs #2255: Correction de l'init du classloader aspectj Modified: trunk/pom.xml trunk/src/main/java/fr/ifremer/isisfish/aspect/AspectJWeavingAdaptor.java trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/InProcessSimulatorLauncher.java Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2014-04-18 08:17:52 UTC (rev 3970) +++ trunk/pom.xml 2014-04-18 13:30:39 UTC (rev 3971) @@ -283,21 +283,9 @@ <dependency> <groupId>org.aspectj</groupId> - <artifactId>aspectjrt</artifactId> - <version>1.7.4</version> - </dependency> - <dependency> - <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> - <version>1.7.4</version> + <version>1.8.0</version> </dependency> - <!-- This one seams to be required for RuleAspect to work, but not directly used --> - <dependency> - <groupId>org.aspectj</groupId> - <artifactId>aspectjtools</artifactId> - <version>1.7.4</version> - <scope>runtime</scope> - </dependency> <dependency> <groupId>net.sourceforge</groupId> Modified: trunk/src/main/java/fr/ifremer/isisfish/aspect/AspectJWeavingAdaptor.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/aspect/AspectJWeavingAdaptor.java 2014-04-18 08:17:52 UTC (rev 3970) +++ trunk/src/main/java/fr/ifremer/isisfish/aspect/AspectJWeavingAdaptor.java 2014-04-18 13:30:39 UTC (rev 3971) @@ -73,16 +73,17 @@ */ private void init(ClassLoader loader, List<String> classPath) { try { - //XXX call to private code "abortOnError = true;" + // introspection of : abortOnError = true; Field abortOnErrorField = WeavingAdaptor.class.getDeclaredField("abortOnError"); abortOnErrorField.setAccessible(true); abortOnErrorField.set(this, true); createMessageHandler(); - info("using classpath: " + classPath); + //info("using classpath: " + classPath); //info("using aspectpath: " + aspectPath); + // introspection of : messageHandler Field messageHandlerField = WeavingAdaptor.class.getDeclaredField("messageHandler"); messageHandlerField.setAccessible(true); IMessageHandler messageHandler = (IMessageHandler)messageHandlerField.get(this); @@ -97,13 +98,12 @@ //registerAspectLibraries(aspectPath); //initializeCache(loader, aspectPath, null, getMessageHandler()); - //XXX call to private code "enabled = true;" + // introspection of : enabled = true; Field enabledField = WeavingAdaptor.class.getDeclaredField("enabled"); enabledField.setAccessible(true); enabledField.set(this, true); - // get private field instance - //XXX call to private code "xcutSet = weaver.xcutSet" + // introspection of : xcutSet = weaver.xcutSet Field xcutSetField = BcelWeaver.class.getDeclaredField("xcutSet"); xcutSetField.setAccessible(true); xcutSet = (CrosscuttingMembersSet) xcutSetField.get(weaver); Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/InProcessSimulatorLauncher.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/InProcessSimulatorLauncher.java 2014-04-18 08:17:52 UTC (rev 3970) +++ trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/InProcessSimulatorLauncher.java 2014-04-18 13:30:39 UTC (rev 3971) @@ -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, @@ -286,7 +291,7 @@ AspectJUrlClassLoader loader = new AspectJUrlClassLoader(classpath, IsisFish.class.getClassLoader()); thread.setContextClassLoader(loader); - log.info("Classloader used for simulation: " + loader + " " + log.error("Classloader used for simulation: " + loader + " " + Arrays.toString(loader.getURLs())); return loader; } catch (MalformedURLException eee) { @@ -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); } }
participants (1)
-
echatellier@users.forge.codelutin.com