Index: modules/compatibility/src/test/java/org/apache/ignite/compatibility/testframework/junits/IgniteCompatibilityAbstractTest.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- modules/compatibility/src/test/java/org/apache/ignite/compatibility/testframework/junits/IgniteCompatibilityAbstractTest.java (revision 1d906b330c28a1a4fbb7057a25d96bff3d7646a0) +++ modules/compatibility/src/test/java/org/apache/ignite/compatibility/testframework/junits/IgniteCompatibilityAbstractTest.java (revision ) @@ -36,6 +36,7 @@ import org.apache.ignite.lang.IgniteInClosure; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; import org.apache.ignite.testframework.junits.multijvm.IgniteProcessProxy; +import org.apache.ignite.tools.Java9Bridge; import org.jetbrains.annotations.Nullable; /** @@ -170,7 +171,8 @@ String corePathTemplate = "modules/core/target/classes"; String coreTestsPathTemplate = "modules/core/target/test-classes"; - for (URL url : ldr.getURLs()) { + + for (URL url : Java9Bridge.getUrls(ldr)) { String path = url.getPath(); if (!path.contains(corePathTemplate) && !path.contains(coreTestsPathTemplate)) Index: modules/core/src/main/java/org/apache/ignite/util/Java9Bridge.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- modules/core/src/main/java/org/apache/ignite/util/Java9Bridge.java (revision ) +++ modules/core/src/main/java/org/apache/ignite/util/Java9Bridge.java (revision ) @@ -0,0 +1,111 @@ +package org.apache.ignite.util; + +import org.apache.ignite.IgniteLogger; +import org.apache.ignite.internal.util.IgniteUtils; + + +import java.lang.reflect.Field; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.zip.ZipFile; + + +/** + * Utility method for Java 8/9 interop + */ +public class Java9Bridge { + + private final static boolean JAVA_9 = System.getProperty("java.version").startsWith("9"); + + + /** + * Returns urls for the classloader + * + * @param ldr classloader in which to find urls + * @return list of urls + */ + public static List getUrls(ClassLoader ldr) { + + try { + if (!JAVA_9) { + URLClassLoader cl = (URLClassLoader) ldr; + return new ArrayList<>(Arrays.asList(cl.getURLs())); + + } else { + Field ucpField = Class.forName("jdk.internal.loader.BuiltinClassLoader") + .getDeclaredField("ucp"); + ucpField.setAccessible(true); + + Object ucpObject = ucpField.get(ldr); + URL[] urls = (URL[]) Class.forName("jdk.internal.loader.URLClassPath") + .getMethod("getURLs").invoke(ucpObject); + + return new ArrayList<>(Arrays.asList(urls)); + + } + } catch (Exception e) { + throw new RuntimeException(e); + } + + + } + + /** + * Closes ClassLoader and logs + * @param clsLdr + * @param log + */ + + public static void close(ClassLoader clsLdr, IgniteLogger log) { + if (clsLdr == null) + return; + + Object loaders; + + try { + + Field ucpField = clsLdr.getClass().getDeclaredField("ucp"); + ucpField.setAccessible(true); + + if (!JAVA_9) { + + Object ucpObject=ucpField.get(clsLdr); + Field ldrFld = Class.forName("sun.misc.URLClassPath") + .getDeclaredField("loaders"); + ldrFld.setAccessible(true); + loaders = ldrFld.get(ucpObject); + } else { + + + Field ldrFld = Class.forName("jdk.internal.loader.URLClassPath") + .getField("loaders"); + ldrFld.setAccessible(true); + loaders = ucpField.get(clsLdr); + } + + Iterable ldrs = (Iterable) loaders; + + for (Object ldr : ldrs) + if (ldr.getClass().getName().endsWith("JarLoader")) + try { + Field jarFld = ldr.getClass().getDeclaredField("jar"); + + jarFld.setAccessible(true); + + ZipFile jar = (ZipFile) jarFld.get(ldr); + + jar.close(); + } catch (Exception e) { + IgniteUtils.warn(log, "Failed to close resource: " + e.getMessage()); + } + + } catch (Exception e) { + IgniteUtils.warn(log, "Failed to close resource: " + e.getMessage()); + } + + + } +} Index: modules/urideploy/src/main/java/org/apache/ignite/spi/deployment/uri/GridUriDeploymentFileProcessor.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- modules/urideploy/src/main/java/org/apache/ignite/spi/deployment/uri/GridUriDeploymentFileProcessor.java (revision 1d906b330c28a1a4fbb7057a25d96bff3d7646a0) +++ modules/urideploy/src/main/java/org/apache/ignite/spi/deployment/uri/GridUriDeploymentFileProcessor.java (revision ) @@ -24,7 +24,6 @@ import java.io.InputStream; import java.lang.reflect.Modifier; import java.net.URL; -import java.net.URLClassLoader; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; @@ -38,6 +37,7 @@ import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.spi.IgniteSpiException; +import org.apache.ignite.util.Java9Bridge; import org.jetbrains.annotations.Nullable; import static org.apache.ignite.spi.deployment.uri.UriDeploymentSpi.XML_DESCRIPTOR_PATH; @@ -293,14 +293,12 @@ assert clsLdr != null; assert log != null; - if (clsLdr instanceof URLClassLoader) { - URLClassLoader clsLdr0 = (URLClassLoader)clsLdr; - U.close(clsLdr0, log); + Java9Bridge.close(clsLdr, log); try { - URL url = clsLdr0.getURLs()[0]; + URL url= Java9Bridge.getUrls(clsLdr)[0]; File dir = new File(url.toURI()); U.delete(dir); @@ -314,7 +312,7 @@ catch (Exception e) { U.error(log, "Failed to cleanup unit [clsLdr=" + clsLdr + ']', e); } - } + } /** Index: modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopTestClassLoader.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopTestClassLoader.java (revision 1d906b330c28a1a4fbb7057a25d96bff3d7646a0) +++ modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/HadoopTestClassLoader.java (revision ) @@ -18,8 +18,8 @@ package org.apache.ignite.internal.processors.hadoop; import org.apache.ignite.IgniteException; -import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.X; +import org.apache.ignite.util.Java9Bridge; import java.net.URL; import java.net.URLClassLoader; @@ -32,10 +32,10 @@ */ public class HadoopTestClassLoader extends URLClassLoader { /** Parent class loader. */ - private static final URLClassLoader APP_CLS_LDR = (URLClassLoader)HadoopTestClassLoader.class.getClassLoader(); + private static final ClassLoader APP_CLS_LDR = HadoopTestClassLoader.class.getClassLoader(); /** */ - private static final Collection APP_JARS = F.asList(APP_CLS_LDR.getURLs()); + private static final Collection APP_JARS = Java9Bridge.getUrls(APP_CLS_LDR); /** All participating URLs. */ private static final URL[] URLS; Index: modules/tools/pom.xml IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- modules/tools/pom.xml (revision 1d906b330c28a1a4fbb7057a25d96bff3d7646a0) +++ modules/tools/pom.xml (revision ) @@ -36,8 +36,6 @@ UTF-8 - 1.7 - 1.7 @@ -51,6 +49,11 @@ org.apache.ant ant 1.8.2 + + + org.apache.ignite + ignite-core + 2.4.0-SNAPSHOT Index: modules/codegen/src/main/java/org/apache/ignite/codegen/MessageCodeGenerator.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- modules/codegen/src/main/java/org/apache/ignite/codegen/MessageCodeGenerator.java (revision 1d906b330c28a1a4fbb7057a25d96bff3d7646a0) +++ modules/codegen/src/main/java/org/apache/ignite/codegen/MessageCodeGenerator.java (revision ) @@ -26,7 +26,6 @@ import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.net.URL; -import java.net.URLClassLoader; import java.util.ArrayList; import java.util.BitSet; import java.util.Collection; @@ -48,6 +47,7 @@ import org.apache.ignite.internal.processors.cache.version.GridCacheVersionEx; import org.apache.ignite.internal.util.typedef.internal.SB; import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.util.Java9Bridge; import org.apache.ignite.lang.IgniteUuid; import org.apache.ignite.plugin.extensions.communication.Message; import org.apache.ignite.plugin.extensions.communication.MessageCollectionItemType; @@ -879,9 +879,9 @@ } }); - URLClassLoader ldr = (URLClassLoader)getClass().getClassLoader(); + ClassLoader ldr = getClass().getClassLoader(); - for (URL url : ldr.getURLs()) { + for (URL url : Java9Bridge.getUrls(ldr)) { File file = new File(url.toURI()); int prefixLen = file.getPath().length() + 1;