diff --git a/crunch-archetype/src/main/resources/archetype-resources/pom.xml b/crunch-archetype/src/main/resources/archetype-resources/pom.xml
index 6575417..34da675 100644
--- a/crunch-archetype/src/main/resources/archetype-resources/pom.xml
+++ b/crunch-archetype/src/main/resources/archetype-resources/pom.xml
@@ -89,8 +89,8 @@
         <artifactId>maven-compiler-plugin</artifactId>
         <version>2.5.1</version>
         <configuration>
-          <source>1.6</source>
-          <target>1.6</target>
+          <source>1.8</source>
+          <target>1.8</target>
         </configuration>
       </plugin>
       <plugin>
diff --git a/crunch-core/src/it/java/org/apache/crunch/io/parquet/AvroParquetFileSourceTargetIT.java b/crunch-core/src/it/java/org/apache/crunch/io/parquet/AvroParquetFileSourceTargetIT.java
index 1b2b151..3c80a3c 100644
--- a/crunch-core/src/it/java/org/apache/crunch/io/parquet/AvroParquetFileSourceTargetIT.java
+++ b/crunch-core/src/it/java/org/apache/crunch/io/parquet/AvroParquetFileSourceTargetIT.java
@@ -153,7 +153,7 @@
 
     Person person = Iterables.getOnlyElement(ageOnly.materialize());
     assertNull(person.getName());
-    assertEquals(person.getAge(), 42);
+    assertEquals(person.getAge().intValue(), 42);
     assertNull(person.getSiblingnames());
   }
 
diff --git a/crunch-core/src/test/java/org/apache/crunch/types/avro/AvroChildClassloaderTestRunner.java b/crunch-core/src/test/java/org/apache/crunch/types/avro/AvroChildClassloaderTestRunner.java
index a1f93b7..d0016fc 100644
--- a/crunch-core/src/test/java/org/apache/crunch/types/avro/AvroChildClassloaderTestRunner.java
+++ b/crunch-core/src/test/java/org/apache/crunch/types/avro/AvroChildClassloaderTestRunner.java
@@ -17,6 +17,8 @@
  */
 package org.apache.crunch.types.avro;
 
+import java.io.File;
+import java.lang.management.ManagementFactory;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.util.ArrayList;
@@ -45,11 +47,25 @@
     private static ClassLoader parentClassLoader;
     private static URL[] crunchURLs;
     static {
-      URLClassLoader systemClassLoader = (URLClassLoader) getSystemClassLoader();
+      ClassLoader classLoader = getSystemClassLoader();
+      URL[] urls = null;
+      if (classLoader instanceof URLClassLoader) {
+	 urls = ((URLClassLoader) classLoader).getURLs();
+      } else {
+        String[] pieces = ManagementFactory.getRuntimeMXBean().getClassPath().split(File.pathSeparator);
+        urls = new URL[pieces.length];
+        for (int i = 0; i < pieces.length; i++) {
+          try {
+            urls[i] = new File(pieces[i]).toURI().toURL();
+          } catch (Exception e) {
+            throw new RuntimeException(e);
+          }
+        }
+      }
 
       Collection<URL> crunchURLs = new ArrayList<URL>();
       Collection<URL> otherURLs = new ArrayList<URL>();
-      for (URL url : systemClassLoader.getURLs()) {
+      for (URL url : urls) {
         if (url.getPath().matches("^.*/crunch-?.*/.*$")) {
           crunchURLs.add(url);
         } else {
@@ -58,7 +74,7 @@
       }
 
       TestClassLoader.crunchURLs = crunchURLs.toArray(new URL[crunchURLs.size()]);
-      parentClassLoader = new URLClassLoader(otherURLs.toArray(new URL[otherURLs.size()]), null);
+      parentClassLoader = new URLClassLoader(otherURLs.toArray(new URL[otherURLs.size()]), classLoader);
     }
 
     public TestClassLoader() {
diff --git a/crunch-core/src/test/java/org/apache/crunch/types/avro/AvroModeTest.java b/crunch-core/src/test/java/org/apache/crunch/types/avro/AvroModeTest.java
index fe36520..8df49d3 100644
--- a/crunch-core/src/test/java/org/apache/crunch/types/avro/AvroModeTest.java
+++ b/crunch-core/src/test/java/org/apache/crunch/types/avro/AvroModeTest.java
@@ -23,7 +23,6 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertThat;
-import static org.mockito.Mockito.mock;
 
 import org.apache.avro.Schema;
 import org.apache.avro.generic.GenericData;
@@ -152,30 +151,6 @@
     assertThat(returnedMode.getFactory(), is(instanceOf(FakeReaderWriterFactory.class)));
   }
 
-  @Test
-  public void testRegisterClassLoader() {
-    // First make sure things are in the default situation
-    AvroMode.setSpecificClassLoader(null);
-
-    ClassLoader classLoaderA = mock(ClassLoader.class);
-    ClassLoader classLoaderB = mock(ClassLoader.class);
-
-    // Basic sanity check to ensure that the class loader was really nulled out
-    assertNull(AvroMode.getSpecificClassLoader());
-
-    // Do an internal registration of a class loader. Because there is currently no internal class loader set,
-    // this should set the internal specific class loader
-    AvroMode.registerSpecificClassLoaderInternal(classLoaderA);
-
-    assertEquals(classLoaderA, AvroMode.getSpecificClassLoader());
-
-    // Now we do an internal register of another class loader. Because there already is an internal specific class
-    // loader set, this should have no impact (as opposed to calling setSpecificClassLoader)
-    AvroMode.registerSpecificClassLoaderInternal(classLoaderB);
-
-    assertEquals(classLoaderA, AvroMode.getSpecificClassLoader());
-  }
-
   private static class FakeReaderWriterFactory implements ReaderWriterFactory{
 
     @Override
diff --git a/pom.xml b/pom.xml
index 05a21ad..9b8b526 100644
--- a/pom.xml
+++ b/pom.xml
@@ -85,9 +85,9 @@
     <commons-lang.version>2.6</commons-lang.version>
     <commons-codec.version>1.4</commons-codec.version>
     <commons-cli.version>1.2</commons-cli.version>
-    <avro.version>1.9.1</avro.version>
+    <avro.version>1.8.2</avro.version>
     <hive.version>2.1.0</hive.version>
-    <parquet.version>1.8.1</parquet.version>
+    <parquet.version>1.10.1</parquet.version>
     <javassist.version>3.16.1-GA</javassist.version>
     <jackson.databind.version>2.6.1</jackson.databind.version>
     <protobuf-java.version>2.5.0</protobuf-java.version>
@@ -106,7 +106,7 @@
 
     <kafka.version>1.1.0</kafka.version>
     <scala.base.version>2.12</scala.base.version>
-    <scala.version>2.12.6</scala.version>
+    <scala.version>2.12.10</scala.version>
     <scalatest.version>3.0.1</scalatest.version>
     <spark.version>2.4.0</spark.version>
     <jline.version>2.12.1</jline.version>
@@ -278,7 +278,7 @@
         <exclusions>
           <exclusion>
             <groupId>org.apache.hadoop</groupId>
-            <artifactId>hadoop-core</artifactId>
+            <artifactId>hadoop-client</artifactId>
           </exclusion>
         </exclusions>
       </dependency>
@@ -641,7 +641,7 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-compiler-plugin</artifactId>
-          <version>3.3</version>
+          <version>3.8.1</version>
           <configuration>
             <source>${java.source.version}</source>
             <target>${java.target.version}</target>
@@ -689,7 +689,7 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-assembly-plugin</artifactId>
-          <version>2.5.4</version>
+          <version>3.1.1</version>
         </plugin>
         <plugin>
           <groupId>net.alchim31.maven</groupId>
@@ -701,6 +701,7 @@
           <artifactId>maven-surefire-plugin</artifactId>
           <version>2.22.2</version>
           <configuration>
+            <useSystemClassLoader>false</useSystemClassLoader>
             <argLine>-Xmx2G -Dfile.encoding=UTF-8</argLine>
           </configuration>
         </plugin>
@@ -712,7 +713,7 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-dependency-plugin</artifactId>
-          <version>2.22.2</version>
+          <version>2.10</version>
         </plugin>
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
