You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by th...@apache.org on 2019/08/13 22:44:56 UTC

[nifi] branch master updated: NIFI-5176 NiFI builds on Java 11 Added "jigsaw" profile to multiple modules, which auto-activates when building with Java 11 and adds several dependencies: jaxb, activation, and annotation-api. Updated SslContextFactory to return tuple of socket factory with trust manager for issue with okhttp api changes in java 9+ Updated TestGet/PostHTTPGroovy to use default SSL context to get default cipher suites Updated StandardTemplateDAOSpec.groovy, was using a 37-character UUID, shortened to 36 ch [...]

This is an automated email from the ASF dual-hosted git repository.

thenatog pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/master by this push:
     new 33187f8  NIFI-5176 NiFI builds on Java 11 Added "jigsaw" profile to multiple modules, which auto-activates when building with Java 11 and adds several dependencies: jaxb, activation, and annotation-api. Updated SslContextFactory to return tuple of socket factory with trust manager for issue with okhttp api changes in java 9+ Updated TestGet/PostHTTPGroovy to use default SSL context to get default cipher suites Updated StandardTemplateDAOSpec.groovy, was using a 37-character UUID, [...]
33187f8 is described below

commit 33187f8058b0f0a5808059795c5982dac24e5300
Author: Jeff Storck <jt...@gmail.com>
AuthorDate: Fri Nov 30 13:14:31 2018 -0500

    NIFI-5176 NiFI builds on Java 11
    Added "jigsaw" profile to multiple modules, which auto-activates when building with Java 11 and adds several dependencies: jaxb, activation, and annotation-api.
    Updated SslContextFactory to return tuple of socket factory with trust manager for issue with okhttp api changes in java 9+
    Updated TestGet/PostHTTPGroovy to use default SSL context to get default cipher suites
    Updated StandardTemplateDAOSpec.groovy, was using a 37-character UUID, shortened to 36 characters.
    Multiple tests updated to specifically use TLSv1.2, since two-way TLSv1.3 for some component tests fail during the Java 11 build.  Needs more investigation.
    Replaced GString with String concatenation for map key's value in ScriptedReportingTaskGroovyTest to avoid runtime error of casting GString to String when retrieved from a map that is storing the GString
    Removed nifi-toolkit-api plugin configuration of maven-compiler-plugin, it is inherited
    Resolved deprecation errors during Groovy compile for bouncycastle, Extension should be used in place of X509Extension
    Fixed JNAOverridingJUnitRunner's creation of the classpath for the custom classloader created to be able to mock jna classes
    Removed import of IOUtils (from the wrong package) from InferenceSchemaStrategy
    Updated maven-compiler-plugin version to 3.8.1
    TLS (default in Java 11 is TLSv1.3) working for Site-to-Site client tests after upgrading JDK installation to JDK 11.0.3, httpclient5 5.0-beta4, and httpasyncclient 4.1.4
    HttpNotificationService updated to find and use the first found X509TrustManager rather than casting directly from the array of TrustManagers returned from SslContextFactory
      Removed unnecessary throws declaration from getSslSocketFactory method
    Replaced DnsContextFactory.class.getName() with a string to avoid having to export/open the jdk.naming.dns module
    Updated TestGetIgniteCache and TestPutIgniteCache.java to skip tests on Java 11+ (via Assume), and noted the check should be removed once a version of Ignite is released that supports Java 11
    Updated SpringContextProcessor to create proper ClassLoader and uses URLClassloader.getResource() instead of URLClassloader.findResource() in isConfigResolvable.
      Due to the application classloader no longer being a URLClassLoader in Java 9+, the URLClassLoader created in isConfigResolvable no longer has explicit access to the parent's resources as URLs.
      URLClassLoader.getResource() searches the parent classloaders, and must be used instead of URLClassLoader.findResource() which only searches the URLs in the URLClassLoader and does not search the parent classloaders.
    
    NIFI-5176 Moved exclusion of jdk.tools to the jigsaw profile in the POMs of nifi-hbase_1_1_2-client-service and nifi-hbase_2-client-service
    
    NIFI-5176 Updated site-to-site-client's POM to use properties to establish the correct httpclient dependency for when building with Java 11
    
    This closes #3404.
---
 .../notification/http/HttpNotificationService.java |  25 +++--
 nifi-commons/nifi-security-utils/pom.xml           |  33 +++++++
 .../nifi/security/util/SslContextFactory.java      |  95 +++++++++++++++++--
 nifi-commons/nifi-site-to-site-client/pom.xml      |  45 ++++++++-
 nifi-commons/nifi-utils/pom.xml                    |  24 +++++
 .../nifi-beats-processors/pom.xml                  |  25 +++++
 .../nifi-enrich-processors/pom.xml                 |   1 +
 .../apache/nifi/processors/enrich/QueryDNS.java    |   2 +-
 .../nifi-database-utils/pom.xml                    |  24 +++++
 .../nifi-processor-utils/pom.xml                   |  24 +++++
 .../nifi-framework/nifi-authorizer/pom.xml         |  57 +++++++++++
 .../nifi-framework/nifi-client-dto/pom.xml         |  24 +++++
 .../nifi-framework/nifi-file-authorizer/pom.xml    | 104 +++++++++++++++++++++
 .../nifi-framework-cluster-protocol/pom.xml        |  24 +++++
 .../nifi-framework/nifi-framework-cluster/pom.xml  |  24 +++++
 .../nifi-framework/nifi-framework-core-api/pom.xml |  24 +++++
 .../nifi-framework/nifi-framework-core/pom.xml     |  24 +++++
 .../nifi-framework/nifi-web/nifi-web-api/pom.xml   |  24 +++++
 .../web/dao/impl/StandardTemplateDAOSpec.groovy    |  20 ++--
 .../nifi-web/nifi-web-security/pom.xml             |  56 +++++++++++
 .../ocsp/OcspCertificateValidatorGroovyTest.groovy |   6 +-
 .../nifi-grpc-bundle/nifi-grpc-processors/pom.xml  |  18 ++++
 .../nifi-hdfs-processors/pom.xml                   |  25 +++++
 .../ignite/cache/TestGetIgniteCache.java           |  58 ++++++++----
 .../ignite/cache/TestPutIgniteCache.java           |  71 +++++++++-----
 .../nifi-kafka-0-10-processors/pom.xml             |  24 +++++
 .../nifi-kafka-0-11-processors/pom.xml             |  24 +++++
 .../nifi-kafka-0-9-processors/pom.xml              |  24 +++++
 .../nifi-kafka-1-0-processors/pom.xml              |  24 +++++
 .../nifi-kafka-2-0-processors/pom.xml              |  24 +++++
 .../nifi-yandex-processors/pom.xml                 |  24 +++++
 .../nifi-lumberjack-processors/pom.xml             |  25 +++++
 .../script/ScriptedReportingTaskGroovyTest.groovy  |   2 +-
 .../apache/nifi/spring/SpringContextProcessor.java |  12 +--
 .../nifi-jolt-transform-json-ui/pom.xml            |  30 +++++-
 .../nifi-standard-processors/pom.xml               |  22 +++++
 .../processors/standard/TestGetHTTPGroovy.groovy   |   7 +-
 .../processors/standard/TestPostHTTPGroovy.groovy  |   7 +-
 .../nifi/processors/standard/TestListenRELP.java   |   1 +
 .../nifi/processors/standard/TestListenTCP.java    |   7 +-
 .../processors/standard/TestListenTCPRecord.java   |   4 +-
 .../nifi/processors/standard/TestPutTcpSSL.java    |   1 +
 .../nifi-hbase_1_1_2-client-service/pom.xml        |  35 +++++++
 .../nifi-hbase_2-client-service/pom.xml            |  35 +++++++
 .../nifi-update-attribute-model/pom.xml            |  24 +++++
 .../nifi-update-attribute-ui/pom.xml               |  24 +++++
 .../event/log/JNAOverridingJUnitRunner.java        |  21 ++++-
 nifi-toolkit/nifi-toolkit-admin/pom.xml            |  25 +++++
 nifi-toolkit/nifi-toolkit-api/pom.xml              |  16 ++++
 nifi-toolkit/nifi-toolkit-encrypt-config/pom.xml   |   1 -
 .../nifi-toolkit-zookeeper-migrator/pom.xml        |   7 ++
 pom.xml                                            |  57 ++++++++++-
 52 files changed, 1267 insertions(+), 97 deletions(-)

diff --git a/nifi-bootstrap/src/main/java/org/apache/nifi/bootstrap/notification/http/HttpNotificationService.java b/nifi-bootstrap/src/main/java/org/apache/nifi/bootstrap/notification/http/HttpNotificationService.java
index 14d6709..1405625 100644
--- a/nifi-bootstrap/src/main/java/org/apache/nifi/bootstrap/notification/http/HttpNotificationService.java
+++ b/nifi-bootstrap/src/main/java/org/apache/nifi/bootstrap/notification/http/HttpNotificationService.java
@@ -34,14 +34,19 @@ import org.apache.nifi.expression.ExpressionLanguageScope;
 import org.apache.nifi.processor.exception.ProcessException;
 import org.apache.nifi.processor.util.StandardValidators;
 import org.apache.nifi.security.util.SslContextFactory;
+import org.apache.nifi.util.Tuple;
 
 import javax.net.ssl.SSLContext;
 import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Collectors;
 
 public class HttpNotificationService extends AbstractNotificationService {
 
@@ -191,8 +196,12 @@ public class HttpNotificationService extends AbstractNotificationService {
         // check if the keystore is set and add the factory if so
         if (url.toLowerCase().startsWith("https")) {
             try {
-                SSLSocketFactory sslSocketFactory = getSslSocketFactory(context);
-                okHttpClientBuilder.sslSocketFactory(sslSocketFactory);
+                Tuple<SSLSocketFactory, TrustManager[]> sslSocketFactoryWithTrustManagers = getSslSocketFactory(context);
+                // Find the first X509TrustManager
+                List<X509TrustManager> x509TrustManagers = Arrays.stream(sslSocketFactoryWithTrustManagers.getValue())
+                        .filter(trustManager -> trustManager instanceof X509TrustManager)
+                        .map(trustManager -> (X509TrustManager) trustManager).collect(Collectors.toList());
+                okHttpClientBuilder.sslSocketFactory(sslSocketFactoryWithTrustManagers.getKey(), x509TrustManagers.get(0));
             } catch (Exception e) {
                 throw new IllegalStateException(e);
             }
@@ -241,20 +250,20 @@ public class HttpNotificationService extends AbstractNotificationService {
         }
     }
 
-    private static SSLSocketFactory getSslSocketFactory(NotificationInitializationContext context) throws Exception {
+    private static Tuple<SSLSocketFactory, TrustManager[]> getSslSocketFactory(NotificationInitializationContext context) {
 
         final String protocol = context.getProperty(SSL_ALGORITHM).getValue();
         try {
             final PropertyValue keyPasswdProp = context.getProperty(PROP_KEY_PASSWORD);
             final char[] keyPassword = keyPasswdProp.isSet() ? keyPasswdProp.getValue().toCharArray() : null;
 
-            final SSLContext sslContext;
+            final Tuple<SSLContext, TrustManager[]> sslContextWithTrustManagers;
             final String truststoreFile = context.getProperty(PROP_TRUSTSTORE).getValue();
             final String keystoreFile = context.getProperty(PROP_KEYSTORE).getValue();
 
             if (keystoreFile == null) {
                 // If keystore not specified, create SSL Context based only on trust store.
-                sslContext = SslContextFactory.createTrustSslContext(
+                sslContextWithTrustManagers = SslContextFactory.createTrustSslContextWithTrustManagers(
                         context.getProperty(PROP_TRUSTSTORE).getValue(),
                         context.getProperty(PROP_TRUSTSTORE_PASSWORD).getValue().toCharArray(),
                         context.getProperty(PROP_TRUSTSTORE_TYPE).getValue(),
@@ -262,7 +271,7 @@ public class HttpNotificationService extends AbstractNotificationService {
 
             } else if (truststoreFile == null) {
                 // If truststore not specified, create SSL Context based only on key store.
-                sslContext = SslContextFactory.createSslContext(
+                sslContextWithTrustManagers = SslContextFactory.createSslContextWithTrustManagers(
                         context.getProperty(PROP_KEYSTORE).getValue(),
                         context.getProperty(PROP_KEYSTORE_PASSWORD).getValue().toCharArray(),
                         keyPassword,
@@ -270,7 +279,7 @@ public class HttpNotificationService extends AbstractNotificationService {
                         protocol);
 
             } else {
-                sslContext = SslContextFactory.createSslContext(
+                sslContextWithTrustManagers = SslContextFactory.createSslContextWithTrustManagers(
                         context.getProperty(PROP_KEYSTORE).getValue(),
                         context.getProperty(PROP_KEYSTORE_PASSWORD).getValue().toCharArray(),
                         keyPassword,
@@ -282,7 +291,7 @@ public class HttpNotificationService extends AbstractNotificationService {
                         protocol);
             }
 
-            return sslContext.getSocketFactory();
+            return new Tuple<>(sslContextWithTrustManagers.getKey().getSocketFactory(), sslContextWithTrustManagers.getValue());
         } catch (final Exception e) {
             throw new ProcessException(e);
         }
diff --git a/nifi-commons/nifi-security-utils/pom.xml b/nifi-commons/nifi-security-utils/pom.xml
index b587e1c..8807452 100644
--- a/nifi-commons/nifi-security-utils/pom.xml
+++ b/nifi-commons/nifi-security-utils/pom.xml
@@ -106,5 +106,38 @@ because the binary is compiled for Java 8 and we must support Java 7 -->
             </plugin>
         </plugins>
     </build>
+
+    <profiles>
+        <profile>
+            <!-- This profile, activating when compiling on Java versions above 1.8, provides configuration changes to
+                 allow NiFi to be compiled on those JDKs. -->
+            <id>jigsaw</id>
+            <activation>
+                <jdk>(1.8,)</jdk>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>javax.xml.bind</groupId>
+                    <artifactId>jaxb-api</artifactId>
+                    <scope>test</scope>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-core</artifactId>
+                    <scope>test</scope>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-impl</artifactId>
+                    <scope>test</scope>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.activation</groupId>
+                    <artifactId>javax.activation</artifactId>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
+
 </project>
 
diff --git a/nifi-commons/nifi-security-utils/src/main/java/org/apache/nifi/security/util/SslContextFactory.java b/nifi-commons/nifi-security-utils/src/main/java/org/apache/nifi/security/util/SslContextFactory.java
index 42b13e3..8863260 100644
--- a/nifi-commons/nifi-security-utils/src/main/java/org/apache/nifi/security/util/SslContextFactory.java
+++ b/nifi-commons/nifi-security-utils/src/main/java/org/apache/nifi/security/util/SslContextFactory.java
@@ -16,6 +16,8 @@
  */
 package org.apache.nifi.security.util;
 
+import org.apache.nifi.util.Tuple;
+
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -49,7 +51,7 @@ public final class SslContextFactory {
 
     /**
      * Creates a SSLContext instance using the given information. The password for the key is assumed to be the same
-     * as the password for the keystore. If this is not the case, the {@link #createSslContext(String, char[], chart[], String, String, char[], String, ClientAuth, String)}
+     * as the password for the keystore. If this is not the case, the {@link #createSslContext(String, char[], char[], String, String, char[], String, ClientAuth, String)}
      * method should be used instead
      *
      * @param keystore the full path to the keystore
@@ -106,7 +108,36 @@ public final class SslContextFactory {
             final ClientAuth clientAuth, final String protocol)
             throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException,
             UnrecoverableKeyException, KeyManagementException {
+        return createSslContextWithTrustManagers(keystore, keystorePasswd, keyPasswd, keystoreType, truststore,
+                truststorePasswd, truststoreType, clientAuth, protocol).getKey();
+    }
 
+    /**
+     * Creates a SSLContext instance paired with its TrustManager instances using the given information.
+     *
+     * @param keystore the full path to the keystore
+     * @param keystorePasswd the keystore password
+     * @param keystoreType the type of keystore (e.g., PKCS12, JKS)
+     * @param truststore the full path to the truststore
+     * @param truststorePasswd the truststore password
+     * @param truststoreType the type of truststore (e.g., PKCS12, JKS)
+     * @param clientAuth the type of client authentication
+     * @param protocol         the protocol to use for the SSL connection
+     *
+     * @return a {@link Tuple} pairing a SSLContext instance with its TrustManagers
+     * @throws java.security.KeyStoreException if any issues accessing the keystore
+     * @throws java.io.IOException for any problems loading the keystores
+     * @throws java.security.NoSuchAlgorithmException if an algorithm is found to be used but is unknown
+     * @throws java.security.cert.CertificateException if there is an issue with the certificate
+     * @throws java.security.UnrecoverableKeyException if the key is insufficient
+     * @throws java.security.KeyManagementException if unable to manage the key
+     */
+    public static Tuple<SSLContext, TrustManager[]> createSslContextWithTrustManagers(
+            final String keystore, final char[] keystorePasswd, final char[] keyPasswd, final String keystoreType,
+            final String truststore, final char[] truststorePasswd, final String truststoreType,
+            final ClientAuth clientAuth, final String protocol)
+            throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException,
+            UnrecoverableKeyException, KeyManagementException {
         // prepare the keystore
         final KeyStore keyStore = KeyStoreUtils.getKeyStore(keystoreType);
         try (final InputStream keyStoreStream = new FileInputStream(keystore)) {
@@ -138,7 +169,7 @@ public final class SslContextFactory {
             sslContext.getDefaultSSLParameters().setWantClientAuth(false);
         }
 
-        return sslContext;
+        return new Tuple<>(sslContext, trustManagerFactory.getTrustManagers());
 
     }
 
@@ -189,6 +220,29 @@ public final class SslContextFactory {
         final String keystore, final char[] keystorePasswd, final char[] keyPasswd, final String keystoreType, final String protocol)
             throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException,
             UnrecoverableKeyException, KeyManagementException {
+        return createSslContextWithTrustManagers(keystore, keystorePasswd, keyPasswd, keystoreType, protocol).getKey();
+    }
+
+    /**
+     * Creates a SSLContext instance paired with its TrustManager instances using the given information.
+     *
+     * @param keystore the full path to the keystore
+     * @param keystorePasswd the keystore password
+     * @param keystoreType the type of keystore (e.g., PKCS12, JKS)
+     * @param protocol the protocol to use for the SSL connection
+     *
+     * @return a {@link Tuple} pairing a SSLContext instance paired with its TrustManager instances
+     * @throws java.security.KeyStoreException if any issues accessing the keystore
+     * @throws java.io.IOException for any problems loading the keystores
+     * @throws java.security.NoSuchAlgorithmException if an algorithm is found to be used but is unknown
+     * @throws java.security.cert.CertificateException if there is an issue with the certificate
+     * @throws java.security.UnrecoverableKeyException if the key is insufficient
+     * @throws java.security.KeyManagementException if unable to manage the key
+     */
+    public static Tuple<SSLContext, TrustManager[]> createSslContextWithTrustManagers(
+            final String keystore, final char[] keystorePasswd, final char[] keyPasswd, final String keystoreType, final String protocol)
+            throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException,
+            UnrecoverableKeyException, KeyManagementException {
 
         // prepare the keystore
         final KeyStore keyStore = KeyStoreUtils.getKeyStore(keystoreType);
@@ -204,10 +258,10 @@ public final class SslContextFactory {
 
         // initialize the ssl context
         final SSLContext ctx = SSLContext.getInstance(protocol);
-        ctx.init(keyManagerFactory.getKeyManagers(), new TrustManager[0], new SecureRandom());
-
-        return ctx;
+        TrustManager[] trustManagers = new TrustManager[0];
+        ctx.init(keyManagerFactory.getKeyManagers(), trustManagers, new SecureRandom());
 
+        return new Tuple<>(ctx, trustManagers);
     }
 
     /**
@@ -231,6 +285,30 @@ public final class SslContextFactory {
             throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException,
             UnrecoverableKeyException, KeyManagementException {
 
+        return createTrustSslContextWithTrustManagers(truststore, truststorePasswd, truststoreType, protocol).getKey();
+
+    }
+
+    /**
+     * Creates a SSLContext instance paired with its TrustManager instances using the given information.
+     *
+     * @param truststore the full path to the truststore
+     * @param truststorePasswd the truststore password
+     * @param truststoreType the type of truststore (e.g., PKCS12, JKS)
+     * @param protocol the protocol to use for the SSL connection
+     *
+     * @return a {@link Tuple} pairing a SSLContext instance paired with its TrustManager instances
+     * @throws KeyStoreException if any issues accessing the keystore
+     * @throws IOException for any problems loading the keystores
+     * @throws NoSuchAlgorithmException if an algorithm is found to be used but is unknown
+     * @throws CertificateException if there is an issue with the certificate
+     * @throws UnrecoverableKeyException if the key is insufficient
+     * @throws KeyManagementException if unable to manage the key
+     */
+    public static Tuple<SSLContext, TrustManager[]> createTrustSslContextWithTrustManagers(
+            final String truststore, final char[] truststorePasswd, final String truststoreType, final String protocol)
+            throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException,
+            UnrecoverableKeyException, KeyManagementException {
         // prepare the truststore
         final KeyStore trustStore = KeyStoreUtils.getTrustStore(truststoreType);
         try (final InputStream trustStoreStream = new FileInputStream(truststore)) {
@@ -241,10 +319,9 @@ public final class SslContextFactory {
 
         // initialize the ssl context
         final SSLContext ctx = SSLContext.getInstance(protocol);
-        ctx.init(new KeyManager[0], trustManagerFactory.getTrustManagers(), new SecureRandom());
-
-        return ctx;
+        TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
+        ctx.init(new KeyManager[0], trustManagers, new SecureRandom());
 
+        return new Tuple<>(ctx, trustManagers);
     }
-
 }
diff --git a/nifi-commons/nifi-site-to-site-client/pom.xml b/nifi-commons/nifi-site-to-site-client/pom.xml
index 57dc617..38399e5 100644
--- a/nifi-commons/nifi-site-to-site-client/pom.xml
+++ b/nifi-commons/nifi-site-to-site-client/pom.xml
@@ -24,6 +24,12 @@
 
     <artifactId>nifi-site-to-site-client</artifactId>
 
+    <properties>
+        <httpclient.group>org.apache.httpcomponents</httpclient.group>
+        <httpclient.artifact>httpclient</httpclient.artifact>
+        <httpclient.version>4.5.5</httpclient.version>
+    </properties>
+
     <dependencies>
         <dependency>
             <groupId>org.apache.nifi</groupId>
@@ -61,14 +67,14 @@
             <version>1.10.0-SNAPSHOT</version>
         </dependency>
         <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpclient</artifactId>
-            <version>4.5.5</version>
+            <groupId>${httpclient.group}</groupId>
+            <artifactId>${httpclient.artifact}</artifactId>
+            <version>${httpclient.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.httpcomponents</groupId>
             <artifactId>httpasyncclient</artifactId>
-            <version>4.1.3</version>
+            <version>4.1.4</version>
         </dependency>
         <dependency>
             <groupId>com.esotericsoftware.kryo</groupId>
@@ -79,11 +85,13 @@
         <dependency>
             <groupId>org.eclipse.jetty</groupId>
             <artifactId>jetty-server</artifactId>
+            <version>${jetty.version}</version>
             <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>org.eclipse.jetty</groupId>
             <artifactId>jetty-servlet</artifactId>
+            <!--<version>9.4.14.v20181114</version>-->
             <scope>test</scope>
         </dependency>
         <dependency>
@@ -93,4 +101,33 @@
             <scope>test</scope>
         </dependency>
     </dependencies>
+    <profiles>
+        <profile>
+            <!-- This profile, activating when compiling on Java versions above 1.8, provides configuration changes to
+                 allow NiFi to be compiled on those JDKs. -->
+            <id>jigsaw</id>
+            <activation>
+                <jdk>(1.8,)</jdk>
+            </activation>
+            <properties>
+                <httpclient.group>org.apache.httpcomponents.client5</httpclient.group>
+                <httpclient.artifact>httpclient5</httpclient.artifact>
+                <httpclient.version>5.0-beta4</httpclient.version>
+            </properties>
+            <dependencies>
+                <dependency>
+                    <groupId>javax.xml.bind</groupId>
+                    <artifactId>jaxb-api</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-core</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-impl</artifactId>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
 </project>
diff --git a/nifi-commons/nifi-utils/pom.xml b/nifi-commons/nifi-utils/pom.xml
index 82905e5..173d55e 100644
--- a/nifi-commons/nifi-utils/pom.xml
+++ b/nifi-commons/nifi-utils/pom.xml
@@ -41,4 +41,28 @@
             <version>1.10.0-SNAPSHOT</version>
         </dependency>
     </dependencies>
+    <profiles>
+        <profile>
+            <!-- This profile, activating when compiling on Java versions above 1.8, provides configuration changes to
+                 allow NiFi to be compiled on those JDKs. -->
+            <id>jigsaw</id>
+            <activation>
+                <jdk>(1.8,)</jdk>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>javax.xml.bind</groupId>
+                    <artifactId>jaxb-api</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-core</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-impl</artifactId>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
 </project>
diff --git a/nifi-nar-bundles/nifi-beats-bundle/nifi-beats-processors/pom.xml b/nifi-nar-bundles/nifi-beats-bundle/nifi-beats-processors/pom.xml
index a45ca73..3541152 100644
--- a/nifi-nar-bundles/nifi-beats-bundle/nifi-beats-processors/pom.xml
+++ b/nifi-nar-bundles/nifi-beats-bundle/nifi-beats-processors/pom.xml
@@ -67,4 +67,29 @@
             <scope>test</scope>
         </dependency>
     </dependencies>
+
+    <profiles>
+        <profile>
+            <!-- This profile, activating when compiling on Java versions above 1.8, provides configuration changes to
+                 allow NiFi to be compiled on those JDKs. -->
+            <id>jigsaw</id>
+            <activation>
+                <jdk>(1.8,)</jdk>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>javax.xml.bind</groupId>
+                    <artifactId>jaxb-api</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-core</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-impl</artifactId>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
 </project>
diff --git a/nifi-nar-bundles/nifi-enrich-bundle/nifi-enrich-processors/pom.xml b/nifi-nar-bundles/nifi-enrich-bundle/nifi-enrich-processors/pom.xml
index 2df2606..73156c2 100644
--- a/nifi-nar-bundles/nifi-enrich-bundle/nifi-enrich-processors/pom.xml
+++ b/nifi-nar-bundles/nifi-enrich-bundle/nifi-enrich-processors/pom.xml
@@ -23,6 +23,7 @@
 
 
     <artifactId>nifi-enrich-processors</artifactId>
+
     <dependencies>
         <dependency>
             <groupId>org.apache.nifi</groupId>
diff --git a/nifi-nar-bundles/nifi-enrich-bundle/nifi-enrich-processors/src/main/java/org/apache/nifi/processors/enrich/QueryDNS.java b/nifi-nar-bundles/nifi-enrich-bundle/nifi-enrich-processors/src/main/java/org/apache/nifi/processors/enrich/QueryDNS.java
index 362bb2e..f24d72e 100644
--- a/nifi-nar-bundles/nifi-enrich-bundle/nifi-enrich-processors/src/main/java/org/apache/nifi/processors/enrich/QueryDNS.java
+++ b/nifi-nar-bundles/nifi-enrich-bundle/nifi-enrich-processors/src/main/java/org/apache/nifi/processors/enrich/QueryDNS.java
@@ -109,7 +109,7 @@ public class QueryDNS extends AbstractEnrichProcessor {
     private DirContext ictx;
 
     // Assign the default and generally used contextFactory value
-    private String contextFactory = com.sun.jndi.dns.DnsContextFactory.class.getName();;
+    private String contextFactory = "com.sun.jndi.dns.DnsContextFactory";
 
     static {
         List<PropertyDescriptor> props = new ArrayList<>();
diff --git a/nifi-nar-bundles/nifi-extension-utils/nifi-database-utils/pom.xml b/nifi-nar-bundles/nifi-extension-utils/nifi-database-utils/pom.xml
index f4bb6e4..c625007 100644
--- a/nifi-nar-bundles/nifi-extension-utils/nifi-database-utils/pom.xml
+++ b/nifi-nar-bundles/nifi-extension-utils/nifi-database-utils/pom.xml
@@ -98,4 +98,28 @@
             </plugin>
         </plugins>
     </build>
+    <profiles>
+        <profile>
+            <!-- This profile, activating when compiling on Java versions above 1.8, provides configuration changes to
+                 allow NiFi to be compiled on those JDKs. -->
+            <id>jigsaw</id>
+            <activation>
+                <jdk>(1.8,)</jdk>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>javax.xml.bind</groupId>
+                    <artifactId>jaxb-api</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-core</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-impl</artifactId>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
 </project>
diff --git a/nifi-nar-bundles/nifi-extension-utils/nifi-processor-utils/pom.xml b/nifi-nar-bundles/nifi-extension-utils/nifi-processor-utils/pom.xml
index cc89ee1..dbcfa44 100644
--- a/nifi-nar-bundles/nifi-extension-utils/nifi-processor-utils/pom.xml
+++ b/nifi-nar-bundles/nifi-extension-utils/nifi-processor-utils/pom.xml
@@ -79,4 +79,28 @@
             <scope>provided</scope>
         </dependency>
     </dependencies>
+    <profiles>
+        <profile>
+            <!-- This profile, activating when compiling on Java versions above 1.8, provides configuration changes to
+                 allow NiFi to be compiled on those JDKs. -->
+            <id>jigsaw</id>
+            <activation>
+                <jdk>(1.8,)</jdk>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>javax.xml.bind</groupId>
+                    <artifactId>jaxb-api</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-core</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-impl</artifactId>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
 </project>
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-authorizer/pom.xml b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-authorizer/pom.xml
index 48d864e..cf9e66f 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-authorizer/pom.xml
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-authorizer/pom.xml
@@ -58,6 +58,63 @@
         </plugins>
     </build>
 
+    <profiles>
+        <profile>
+            <!-- This profile, activating when compiling on Java versions above 1.8, provides configuration changes to
+                 allow NiFi to be compiled on those JDKs. -->
+            <id>jigsaw</id>
+            <activation>
+                <jdk>(1.8,)</jdk>
+            </activation>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.codehaus.mojo</groupId>
+                        <artifactId>jaxb2-maven-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>current</id>
+                                <configuration>
+                                    <skipXjc>true</skipXjc>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <groupId>org.jvnet.jaxb2.maven2</groupId>
+                        <artifactId>maven-jaxb2-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>current</id>
+                                <goals>
+                                    <goal>generate</goal>
+                                </goals>
+                                <configuration>
+                                    <generatePackage>org.apache.nifi.authorization.generated</generatePackage>
+                                    <schemaDirectory>src/main/xsd</schemaDirectory>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+            <dependencies>
+                <dependency>
+                    <groupId>javax.xml.bind</groupId>
+                    <artifactId>jaxb-api</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-core</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-impl</artifactId>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
+
     <dependencies>
         <dependency>
             <groupId>org.apache.nifi</groupId>
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/pom.xml b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/pom.xml
index 66e487f..3eb904e 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/pom.xml
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/pom.xml
@@ -32,4 +32,28 @@
             <version>${nifi.registry.version}</version>
         </dependency>
     </dependencies>
+    <profiles>
+        <profile>
+            <!-- This profile, activating when compiling on Java versions above 1.8, provides configuration changes to
+                 allow NiFi to be compiled on those JDKs. -->
+            <id>jigsaw</id>
+            <activation>
+                <jdk>(1.8,)</jdk>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>javax.xml.bind</groupId>
+                    <artifactId>jaxb-api</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-core</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-impl</artifactId>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
 </project>
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-file-authorizer/pom.xml b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-file-authorizer/pom.xml
index 11134f4..c23f11e 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-file-authorizer/pom.xml
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-file-authorizer/pom.xml
@@ -87,6 +87,110 @@
             </plugin>            
         </plugins>
     </build>
+    <profiles>
+        <profile>
+            <!-- This profile, activating when compiling on Java versions above 1.8, provides configuration changes to
+                 allow NiFi to be compiled on those JDKs. -->
+            <id>jigsaw</id>
+            <activation>
+                <jdk>(1.8,)</jdk>
+            </activation>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.codehaus.mojo</groupId>
+                        <artifactId>jaxb2-maven-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>authorizations</id>
+                                <configuration>
+                                    <skipXjc>true</skipXjc>
+                                </configuration>
+                            </execution>
+                            <execution>
+                                <id>tenants</id>
+                                <configuration>
+                                    <skipXjc>true</skipXjc>
+                                </configuration>
+                            </execution>
+                            <execution>
+                                <id>users</id>
+                                <configuration>
+                                    <skipXjc>true</skipXjc>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <groupId>org.jvnet.jaxb2.maven2</groupId>
+                        <artifactId>maven-jaxb2-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>authorizations</id>
+                                <goals>
+                                    <goal>generate</goal>
+                                </goals>
+                                <configuration>
+                                    <generatePackage>org.apache.nifi.authorization.file.generated</generatePackage>
+                                    <schemaDirectory>src/main/xsd</schemaDirectory>
+                                    <schemaIncludes>
+                                        <include>authorizations.xsd</include>
+                                    </schemaIncludes>
+                                </configuration>
+                            </execution>
+                            <execution>
+                                <id>tenants</id>
+                                <goals>
+                                    <goal>generate</goal>
+                                </goals>
+                                <configuration>
+                                    <generatePackage>org.apache.nifi.authorization.file.tenants.generated</generatePackage>
+                                    <schemaDirectory>src/main/xsd</schemaDirectory>
+                                    <schemaIncludes>
+                                        <include>tenants.xsd</include>
+                                    </schemaIncludes>
+                                    <removeOldOutput>false</removeOldOutput>
+                                    <forceRegenerate>true</forceRegenerate>
+                                </configuration>
+                            </execution>
+                            <execution>
+                                <id>users</id>
+                                <goals>
+                                    <goal>generate</goal>
+                                </goals>
+                                <configuration>
+                                    <generatePackage>org.apache.nifi.user.generated</generatePackage>
+                                    <schemaDirectory>src/main/xsd</schemaDirectory>
+                                    <schemaIncludes>
+                                        <include>legacy-users.xsd</include>
+                                    </schemaIncludes>
+                                    <removeOldOutput>false</removeOldOutput>
+                                    <forceRegenerate>true</forceRegenerate>
+                                </configuration>
+                            </execution>
+                        </executions>
+                        <configuration>
+                            <generateDirectory>${project.build.directory}/generated-sources/jaxb</generateDirectory>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+            <dependencies>
+                <dependency>
+                    <groupId>javax.xml.bind</groupId>
+                    <artifactId>jaxb-api</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-core</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-impl</artifactId>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
     <dependencies>
         <dependency>
             <groupId>org.apache.nifi</groupId>
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-cluster-protocol/pom.xml b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-cluster-protocol/pom.xml
index ad69a71..894d03d 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-cluster-protocol/pom.xml
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-cluster-protocol/pom.xml
@@ -66,4 +66,28 @@
             <artifactId>spring-context</artifactId>
         </dependency>
     </dependencies>
+    <profiles>
+        <profile>
+            <!-- This profile, activating when compiling on Java versions above 1.8, provides configuration changes to
+                 allow NiFi to be compiled on those JDKs. -->
+            <id>jigsaw</id>
+            <activation>
+                <jdk>(1.8,)</jdk>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>javax.xml.bind</groupId>
+                    <artifactId>jaxb-api</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-core</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-impl</artifactId>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
 </project>
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-cluster/pom.xml b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-cluster/pom.xml
index b1e698d..fe583c7 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-cluster/pom.xml
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-cluster/pom.xml
@@ -188,4 +188,28 @@
             </plugin>
         </plugins>
     </build>
+    <profiles>
+        <profile>
+            <!-- This profile, activating when compiling on Java versions above 1.8, provides configuration changes to
+                 allow NiFi to be compiled on those JDKs. -->
+            <id>jigsaw</id>
+            <activation>
+                <jdk>(1.8,)</jdk>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>javax.xml.bind</groupId>
+                    <artifactId>jaxb-api</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-core</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-impl</artifactId>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
 </project>
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/pom.xml b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/pom.xml
index 6371c7d..44dad52 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/pom.xml
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/pom.xml
@@ -71,4 +71,28 @@ language governing permissions and limitations under the License. -->
             <version>${nifi.registry.version}</version>
         </dependency>
     </dependencies>
+    <profiles>
+        <profile>
+            <!-- This profile, activating when compiling on Java versions above 1.8, provides configuration changes to
+                 allow NiFi to be compiled on those JDKs. -->
+            <id>jigsaw</id>
+            <activation>
+                <jdk>(1.8,)</jdk>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>javax.xml.bind</groupId>
+                    <artifactId>jaxb-api</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-core</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-impl</artifactId>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
 </project>
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/pom.xml b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/pom.xml
index 514d791..a1bff42 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/pom.xml
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/pom.xml
@@ -256,4 +256,28 @@
             </plugin>
         </plugins>
     </build>
+    <profiles>
+        <profile>
+            <!-- This profile, activating when compiling on Java versions above 1.8, provides configuration changes to
+                 allow NiFi to be compiled on those JDKs. -->
+            <id>jigsaw</id>
+            <activation>
+                <jdk>(1.8,)</jdk>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>javax.xml.bind</groupId>
+                    <artifactId>jaxb-api</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-core</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-impl</artifactId>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
 </project>
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/pom.xml b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/pom.xml
index 1b86741..bbe5db0 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/pom.xml
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/pom.xml
@@ -126,6 +126,30 @@
             </plugin>
         </plugins>
     </build>
+    <profiles>
+        <profile>
+            <!-- This profile, activating when compiling on Java versions above 1.8, provides configuration changes to
+                 allow NiFi to be compiled on those JDKs. -->
+            <id>jigsaw</id>
+            <activation>
+                <jdk>(1.8,)</jdk>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>javax.xml.bind</groupId>
+                    <artifactId>jaxb-api</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-core</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-impl</artifactId>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
     <dependencies>
         <!--
             Artifacts that will be on the jetty classpath at runtime either through
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/groovy/org/apache/nifi/web/dao/impl/StandardTemplateDAOSpec.groovy b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/groovy/org/apache/nifi/web/dao/impl/StandardTemplateDAOSpec.groovy
index 605f33c..0ebbaf4 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/groovy/org/apache/nifi/web/dao/impl/StandardTemplateDAOSpec.groovy
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/groovy/org/apache/nifi/web/dao/impl/StandardTemplateDAOSpec.groovy
@@ -115,34 +115,34 @@ class StandardTemplateDAOSpec extends Specification {
         rootGroupId | oldOriginX | oldOriginY | newOriginX | newOriginY | idGenerationSeed | encodingVersion | snippet
         'g1'        | 0.0        | 0.0        | 5.0        | 5.0        | 'AAAA'           | null            | new FlowSnippetDTO()
         'g1'        | 10.0       | 10.0       | 5.0        | 5.0        | 'AAAA'           | '0.7'           | new FlowSnippetDTO(
-                processors: [new ProcessorDTO(id:"c81f6810-0155-1000-0000-c4af042cb1559", name: 'proc1', bundle: new BundleDTO("org.apache.nifi", "standard", "1.0"),
+                processors: [new ProcessorDTO(id:"c81f6810-0155-1000-0000-c4af042cb155", name: 'proc1', bundle: new BundleDTO("org.apache.nifi", "standard", "1.0"),
                         config: new ProcessorConfigDTO(), position: new PositionDTO(x: 10, y: 10))])
         'g1'        | 10.0       | -10.0      | 5.0        | 5.0        | 'AAAA'           | null           | new FlowSnippetDTO(
-                processors: [new ProcessorDTO(id:"c81f6810-0155-1000-0001-c4af042cb1559", name: 'proc2', bundle: new BundleDTO("org.apache.nifi", "standard", "1.0"),
+                processors: [new ProcessorDTO(id:"c81f6810-0155-1000-0001-c4af042cb155", name: 'proc2', bundle: new BundleDTO("org.apache.nifi", "standard", "1.0"),
                         config: new ProcessorConfigDTO(), position: new PositionDTO(x: 10, y: 10))],
                 processGroups: [
-                        new ProcessGroupDTO(id:"c81f6810-0a55-1000-0000-c4af042cb1559",
+                        new ProcessGroupDTO(id:"c81f6810-0a55-1000-0000-c4af042cb155",
                                 name: 'g2',
                                 position: new PositionDTO(x: 105, y: -10),
-                                contents: new FlowSnippetDTO(processors: [new ProcessorDTO(id:"c81f6810-0155-1000-0002-c4af042cb1559", name: 'proc3', bundle: new BundleDTO("org.apache.nifi", "standard", "1.0"),
+                                contents: new FlowSnippetDTO(processors: [new ProcessorDTO(id:"c81f6810-0155-1000-0002-c4af042cb155", name: 'proc3', bundle: new BundleDTO("org.apache.nifi", "standard", "1.0"),
                                         config: new ProcessorConfigDTO(), position: new PositionDTO(x: 50, y: 60))]))])
         'g1'        | 10.0       | -10.0      | 5.0        | 5.0        | 'AAAA'           | '0.7'           | new FlowSnippetDTO(
-                processors: [new ProcessorDTO(id:"c81f6810-0155-1000-0003-c4af042cb1559", name: 'proc2', bundle: new BundleDTO("org.apache.nifi", "standard", "1.0"),
+                processors: [new ProcessorDTO(id:"c81f6810-0155-1000-0003-c4af042cb155", name: 'proc2', bundle: new BundleDTO("org.apache.nifi", "standard", "1.0"),
                         config: new ProcessorConfigDTO(), position: new PositionDTO(x: 10, y: 10))],
                 processGroups: [
-                        new ProcessGroupDTO(id:"c81f6810-0a55-1000-0001-c4af042cb1559",
+                        new ProcessGroupDTO(id:"c81f6810-0a55-1000-0001-c4af042cb155",
                                 name: 'g2',
                                 position: new PositionDTO(x: 105, y: -10),
-                                contents: new FlowSnippetDTO(processors: [new ProcessorDTO(id:"c81f6810-0155-1000-0004-c4af042cb1559", name: 'proc3', bundle: new BundleDTO("org.apache.nifi", "standard", "1.0"),
+                                contents: new FlowSnippetDTO(processors: [new ProcessorDTO(id:"c81f6810-0155-1000-0004-c4af042cb155", name: 'proc3', bundle: new BundleDTO("org.apache.nifi", "standard", "1.0"),
                                         config: new ProcessorConfigDTO(), position: new PositionDTO(x: 50, y: 60))]))])
         'g1'        | 10.0       | -10.0      | 5.0        | 5.0        | 'AAAA'           | '1.0'           | new FlowSnippetDTO(
-                processors: [new ProcessorDTO(id:"c81f6810-0155-1000-0005-c4af042cb1559", name: 'proc2', bundle: new BundleDTO("org.apache.nifi", "standard", "1.0"),
+                processors: [new ProcessorDTO(id:"c81f6810-0155-1000-0005-c4af042cb155", name: 'proc2', bundle: new BundleDTO("org.apache.nifi", "standard", "1.0"),
                         config: new ProcessorConfigDTO(), position: new PositionDTO(x: 10, y: 10))],
                 processGroups: [
-                        new ProcessGroupDTO(id:"c81f6810-0a55-1000-0003-c4af042cb1559",
+                        new ProcessGroupDTO(id:"c81f6810-0a55-1000-0003-c4af042cb155",
                                 name: 'g2',
                                 position: new PositionDTO(x: 105, y: -10),
-                                contents: new FlowSnippetDTO(processors: [new ProcessorDTO(id:"c81f6810-0155-1000-0006-c4af042cb1559", name: 'proc3', bundle: new BundleDTO("org.apache.nifi", "standard", "1.0"),
+                                contents: new FlowSnippetDTO(processors: [new ProcessorDTO(id:"c81f6810-0155-1000-0006-c4af042cb155", name: 'proc3', bundle: new BundleDTO("org.apache.nifi", "standard", "1.0"),
                                         config: new ProcessorConfigDTO(), position: new PositionDTO(x: 50, y: 60))]))])
     }
 
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/pom.xml b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/pom.xml
index 8007a9b..daf6979 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/pom.xml
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/pom.xml
@@ -67,6 +67,62 @@
             </plugin>
         </plugins>
     </build>
+    <profiles>
+        <profile>
+            <!-- This profile, activating when compiling on Java versions above 1.8, provides configuration changes to
+                 allow NiFi to be compiled on those JDKs. -->
+            <id>jigsaw</id>
+            <activation>
+                <jdk>(1.8,)</jdk>
+            </activation>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.codehaus.mojo</groupId>
+                        <artifactId>jaxb2-maven-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>current</id>
+                                <configuration>
+                                    <skipXjc>true</skipXjc>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <groupId>org.jvnet.jaxb2.maven2</groupId>
+                        <artifactId>maven-jaxb2-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>current</id>
+                                <goals>
+                                    <goal>generate</goal>
+                                </goals>
+                                <configuration>
+                                    <generatePackage>org.apache.nifi.authentication.generated</generatePackage>
+                                    <schemaDirectory>src/main/xsd</schemaDirectory>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+            <dependencies>
+                <dependency>
+                    <groupId>javax.xml.bind</groupId>
+                    <artifactId>jaxb-api</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-core</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-impl</artifactId>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
     <dependencies>
         <dependency>
             <groupId>org.apache.nifi</groupId>
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/test/groovy/org/apache/nifi/web/security/x509/ocsp/OcspCertificateValidatorGroovyTest.groovy b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/test/groovy/org/apache/nifi/web/security/x509/ocsp/OcspCertificateValidatorGroovyTest.groovy
index 1a36fe9..52c4476 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/test/groovy/org/apache/nifi/web/security/x509/ocsp/OcspCertificateValidatorGroovyTest.groovy
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/test/groovy/org/apache/nifi/web/security/x509/ocsp/OcspCertificateValidatorGroovyTest.groovy
@@ -25,7 +25,7 @@ import org.bouncycastle.asn1.x509.ExtendedKeyUsage
 import org.bouncycastle.asn1.x509.KeyPurposeId
 import org.bouncycastle.asn1.x509.KeyUsage
 import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo
-import org.bouncycastle.asn1.x509.X509Extension
+import org.bouncycastle.asn1.x509.Extension
 import org.bouncycastle.cert.X509CertificateHolder
 import org.bouncycastle.cert.X509v3CertificateBuilder
 import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter
@@ -162,14 +162,14 @@ public class OcspCertificateValidatorGroovyTest {
 
         // Set certificate extensions
         // (1) digitalSignature extension
-        certBuilder.addExtension(X509Extension.keyUsage, true,
+        certBuilder.addExtension(Extension.keyUsage, true,
                 new KeyUsage(KeyUsage.digitalSignature | KeyUsage.keyEncipherment | KeyUsage.dataEncipherment | KeyUsage.keyAgreement));
 
         // (2) extendedKeyUsage extension
         Vector<KeyPurposeId> ekUsages = new Vector<>();
         ekUsages.add(KeyPurposeId.id_kp_clientAuth);
         ekUsages.add(KeyPurposeId.id_kp_serverAuth);
-        certBuilder.addExtension(X509Extension.extendedKeyUsage, false, new ExtendedKeyUsage(ekUsages));
+        certBuilder.addExtension(Extension.extendedKeyUsage, false, new ExtendedKeyUsage(ekUsages));
 
         // Sign the certificate
         X509CertificateHolder certificateHolder = certBuilder.build(sigGen);
diff --git a/nifi-nar-bundles/nifi-grpc-bundle/nifi-grpc-processors/pom.xml b/nifi-nar-bundles/nifi-grpc-bundle/nifi-grpc-processors/pom.xml
index 249db67..b7da9c8 100644
--- a/nifi-nar-bundles/nifi-grpc-bundle/nifi-grpc-processors/pom.xml
+++ b/nifi-nar-bundles/nifi-grpc-bundle/nifi-grpc-processors/pom.xml
@@ -140,4 +140,22 @@ language governing permissions and limitations under the License. -->
             </plugin>
         </plugins>
     </build>
+
+    <profiles>
+        <profile>
+            <!-- This profile, activating when compiling on Java versions above 1.8, provides configuration changes to
+                 allow NiFi to be compiled on those JDKs. -->
+            <id>jigsaw</id>
+            <activation>
+                <jdk>(1.8,)</jdk>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>javax.annotation</groupId>
+                    <artifactId>javax.annotation-api</artifactId>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
+
 </project>
diff --git a/nifi-nar-bundles/nifi-hadoop-bundle/nifi-hdfs-processors/pom.xml b/nifi-nar-bundles/nifi-hadoop-bundle/nifi-hdfs-processors/pom.xml
index b6cc911..e75cc02 100644
--- a/nifi-nar-bundles/nifi-hadoop-bundle/nifi-hdfs-processors/pom.xml
+++ b/nifi-nar-bundles/nifi-hadoop-bundle/nifi-hdfs-processors/pom.xml
@@ -108,4 +108,29 @@
         </plugins>
     </build>
 
+    <profiles>
+        <profile>
+            <!-- This profile, activating when compiling on Java versions above 1.8, provides configuration changes to
+                 allow NiFi to be compiled on those JDKs. -->
+            <id>jigsaw</id>
+            <activation>
+                <jdk>(1.8,)</jdk>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>javax.xml.bind</groupId>
+                    <artifactId>jaxb-api</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-core</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-impl</artifactId>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
+
 </project>
diff --git a/nifi-nar-bundles/nifi-ignite-bundle/nifi-ignite-processors/src/test/java/org/apache/nifi/processors/ignite/cache/TestGetIgniteCache.java b/nifi-nar-bundles/nifi-ignite-bundle/nifi-ignite-processors/src/test/java/org/apache/nifi/processors/ignite/cache/TestGetIgniteCache.java
index 8692383..a48d9e5 100644
--- a/nifi-nar-bundles/nifi-ignite-bundle/nifi-ignite-processors/src/test/java/org/apache/nifi/processors/ignite/cache/TestGetIgniteCache.java
+++ b/nifi-nar-bundles/nifi-ignite-bundle/nifi-ignite-processors/src/test/java/org/apache/nifi/processors/ignite/cache/TestGetIgniteCache.java
@@ -32,6 +32,7 @@ import org.apache.nifi.util.TestRunners;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Assert;
+import org.junit.Assume;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -45,43 +46,60 @@ public class TestGetIgniteCache {
     private Map<String,String> properties2;
     private static Ignite ignite;
 
+    // Check if the JDK running these tests is pre-Java 11, so that tests can be ignored if JDK is Java 11+
+    // TODO Once a version of Ignite that supports Java 11 is released, this check can be removed.
+    private static boolean preJava11;
+    static {
+        String javaVersion = System.getProperty("java.version");
+        preJava11 = Integer.parseInt(javaVersion.substring(0, javaVersion.indexOf('.'))) < 11;
+    }
+
     @BeforeClass
     public static void setUpClass() {
-        ignite = Ignition.start("test-ignite.xml");
-
+        if (preJava11) {
+            ignite = Ignition.start("test-ignite.xml");
+        }
     }
 
     @AfterClass
     public static void tearDownClass() {
-        ignite.close();
-        Ignition.stop(true);
+        if (preJava11) {
+            ignite.close();
+            Ignition.stop(true);
+        }
     }
 
     @Before
     public void setUp() throws IOException {
-        getIgniteCache = new GetIgniteCache() {
-            @Override
-            protected Ignite getIgnite() {
-                return TestGetIgniteCache.ignite;
-            }
+        if (preJava11) {
+            getIgniteCache = new GetIgniteCache() {
+                @Override
+                protected Ignite getIgnite() {
+                    return TestGetIgniteCache.ignite;
+                }
 
-        };
+            };
 
-        properties1 = new HashMap<String,String>();
-        properties1.put("igniteKey", "key1");
-        properties2 = new HashMap<String,String>();
-        properties2.put("igniteKey", "key2");
+            properties1 = new HashMap<String,String>();
+            properties1.put("igniteKey", "key1");
+            properties2 = new HashMap<String,String>();
+            properties2.put("igniteKey", "key2");
+        }
 
     }
 
     @After
     public void teardown() {
-        getRunner = null;
-        ignite.destroyCache(CACHE_NAME);
+        if (preJava11) {
+            Assume.assumeTrue(preJava11);
+            getRunner = null;
+            ignite.destroyCache(CACHE_NAME);
+        }
     }
 
     @Test
     public void testGetIgniteCacheDefaultConfOneFlowFileWithPlainKey() throws IOException, InterruptedException {
+        Assume.assumeTrue(preJava11);
 
         getRunner = TestRunners.newTestRunner(getIgniteCache);
         getRunner.setProperty(GetIgniteCache.IGNITE_CACHE_ENTRY_KEY, "mykey");
@@ -109,6 +127,7 @@ public class TestGetIgniteCache {
 
     @Test
     public void testGetIgniteCacheNullGetCacheThrowsException() throws IOException, InterruptedException {
+        Assume.assumeTrue(preJava11);
 
         getIgniteCache = new GetIgniteCache() {
             @Override
@@ -147,6 +166,7 @@ public class TestGetIgniteCache {
 
     @Test
     public void testGetIgniteCacheDefaultConfOneFlowFileWithKeyExpression() throws IOException, InterruptedException {
+        Assume.assumeTrue(preJava11);
 
         getRunner = TestRunners.newTestRunner(getIgniteCache);
         getRunner.setProperty(GetIgniteCache.CACHE_NAME, CACHE_NAME);
@@ -175,6 +195,7 @@ public class TestGetIgniteCache {
 
     @Test
     public void testGetIgniteCacheDefaultConfTwoFlowFilesWithExpressionKeys() throws IOException, InterruptedException {
+        Assume.assumeTrue(preJava11);
 
         getRunner = TestRunners.newTestRunner(getIgniteCache);
         getRunner.setProperty(GetIgniteCache.CACHE_NAME, CACHE_NAME);
@@ -214,6 +235,7 @@ public class TestGetIgniteCache {
 
     @Test
     public void testGetIgniteCacheDefaultConfOneFlowFileNoKey() throws IOException, InterruptedException {
+        Assume.assumeTrue(preJava11);
 
         getRunner = TestRunners.newTestRunner(getIgniteCache);
         getRunner.setProperty(GetIgniteCache.IGNITE_CACHE_ENTRY_KEY, "${igniteKey}");
@@ -242,6 +264,7 @@ public class TestGetIgniteCache {
 
     @Test
     public void testGetIgniteCacheDefaultConfTwoFlowFilesNoKey() throws IOException, InterruptedException {
+        Assume.assumeTrue(preJava11);
 
         getRunner = TestRunners.newTestRunner(getIgniteCache);
         getRunner.setProperty(GetIgniteCache.IGNITE_CACHE_ENTRY_KEY, "${igniteKey}");
@@ -273,6 +296,7 @@ public class TestGetIgniteCache {
 
     @Test
     public void testGetIgniteCacheDefaultConfTwoFlowFileFirstNoKey() throws IOException, InterruptedException {
+        Assume.assumeTrue(preJava11);
 
         getRunner = TestRunners.newTestRunner(getIgniteCache);
         getRunner.setProperty(GetIgniteCache.CACHE_NAME, CACHE_NAME);
@@ -306,6 +330,7 @@ public class TestGetIgniteCache {
 
     @Test
     public void testGetIgniteCacheDefaultConfTwoFlowFileSecondNoKey() throws IOException, InterruptedException {
+        Assume.assumeTrue(preJava11);
 
         getRunner = TestRunners.newTestRunner(getIgniteCache);
         getRunner.setProperty(GetIgniteCache.CACHE_NAME, CACHE_NAME);
@@ -341,6 +366,7 @@ public class TestGetIgniteCache {
 
     @Test
     public void testGetIgniteCacheDefaultConfThreeFlowFilesOneOkSecondOkThirdNoExpressionKey() throws IOException, InterruptedException {
+        Assume.assumeTrue(preJava11);
 
         getRunner = TestRunners.newTestRunner(getIgniteCache);
         getRunner.setProperty(GetIgniteCache.CACHE_NAME, CACHE_NAME);
diff --git a/nifi-nar-bundles/nifi-ignite-bundle/nifi-ignite-processors/src/test/java/org/apache/nifi/processors/ignite/cache/TestPutIgniteCache.java b/nifi-nar-bundles/nifi-ignite-bundle/nifi-ignite-processors/src/test/java/org/apache/nifi/processors/ignite/cache/TestPutIgniteCache.java
index 4d7e5c6..21b31c4 100644
--- a/nifi-nar-bundles/nifi-ignite-bundle/nifi-ignite-processors/src/test/java/org/apache/nifi/processors/ignite/cache/TestPutIgniteCache.java
+++ b/nifi-nar-bundles/nifi-ignite-bundle/nifi-ignite-processors/src/test/java/org/apache/nifi/processors/ignite/cache/TestPutIgniteCache.java
@@ -32,6 +32,7 @@ import org.apache.nifi.util.TestRunners;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Assert;
+import org.junit.Assume;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -45,46 +46,63 @@ public class TestPutIgniteCache {
     private Map<String,String> properties2;
     private static Ignite ignite;
 
+    // Check if the JDK running these tests is pre-Java 11, so that tests can be ignored if JDK is Java 11+
+    // TODO Once a version of Ignite that supports Java 11 is released, this check can be removed.
+    private static boolean preJava11;
+    static {
+        String javaVersion = System.getProperty("java.version");
+        preJava11 = Integer.parseInt(javaVersion.substring(0, javaVersion.indexOf('.'))) < 11;
+    }
+
     @BeforeClass
     public static void setUpClass() {
-        List<Ignite> grids = Ignition.allGrids();
-        if ( grids.size() == 1 )
-            ignite = grids.get(0);
-        else
-            ignite = Ignition.start("test-ignite.xml");
+        if (preJava11) {
+            List<Ignite> grids = Ignition.allGrids();
+            if ( grids.size() == 1 )
+                ignite = grids.get(0);
+            else
+                ignite = Ignition.start("test-ignite.xml");
+        }
 
     }
 
     @AfterClass
     public static void tearDownClass() {
-        if ( ignite != null )
-            ignite.close();
-        Ignition.stop(true);
+        if (preJava11) {
+            if ( ignite != null )
+                ignite.close();
+            Ignition.stop(true);
+        }
     }
 
     @Before
     public void setUp() throws IOException {
-        putIgniteCache = new PutIgniteCache() {
-            @Override
-            protected Ignite getIgnite() {
-                return TestPutIgniteCache.ignite;
-            }
-
-        };
-        properties1 = new HashMap<String,String>();
-        properties1.put("igniteKey", "key1");
-        properties2 = new HashMap<String,String>();
-        properties2.put("igniteKey", "key2");
+        if (preJava11) {
+            putIgniteCache = new PutIgniteCache() {
+                @Override
+                protected Ignite getIgnite() {
+                    return TestPutIgniteCache.ignite;
+                }
+
+            };
+            properties1 = new HashMap<String,String>();
+            properties1.put("igniteKey", "key1");
+            properties2 = new HashMap<String,String>();
+            properties2.put("igniteKey", "key2");
+        }
     }
 
     @After
     public void teardown() {
-        runner = null;
-        ignite.destroyCache(CACHE_NAME);
+        if (preJava11) {
+            runner = null;
+            ignite.destroyCache(CACHE_NAME);
+        }
     }
 
     @Test
     public void testPutIgniteCacheOnTriggerDefaultConfigurationOneFlowFileWithPlainKey() throws IOException, InterruptedException {
+        Assume.assumeTrue(preJava11);
 
         runner = TestRunners.newTestRunner(putIgniteCache);
         runner.setProperty(PutIgniteCache.BATCH_SIZE, "5");
@@ -116,6 +134,7 @@ public class TestPutIgniteCache {
 
     @Test
     public void testPutIgniteCacheOnTriggerDefaultConfigurationOneFlowFile() throws IOException, InterruptedException {
+        Assume.assumeTrue(preJava11);
 
         runner = TestRunners.newTestRunner(putIgniteCache);
         runner.setProperty(PutIgniteCache.BATCH_SIZE, "5");
@@ -147,6 +166,7 @@ public class TestPutIgniteCache {
 
     @Test
     public void testPutIgniteCacheOnTriggerDefaultConfigurationTwoFlowFilesAllowOverrideDefaultFalse() throws IOException, InterruptedException {
+        Assume.assumeTrue(preJava11);
 
         runner = TestRunners.newTestRunner(putIgniteCache);
         runner.setProperty(PutIgniteCache.BATCH_SIZE, "5");
@@ -191,6 +211,7 @@ public class TestPutIgniteCache {
 
     @Test
     public void testPutIgniteCacheOnTriggerDefaultConfigurationTwoFlowFilesAllowOverrideTrue() throws IOException, InterruptedException {
+        Assume.assumeTrue(preJava11);
 
         runner = TestRunners.newTestRunner(putIgniteCache);
         runner.setProperty(PutIgniteCache.BATCH_SIZE, "5");
@@ -237,6 +258,7 @@ public class TestPutIgniteCache {
 
     @Test
     public void testPutIgniteCacheOnTriggerDefaultConfigurationOneFlowFileNoKey() throws IOException, InterruptedException {
+        Assume.assumeTrue(preJava11);
 
         runner = TestRunners.newTestRunner(putIgniteCache);
         runner.setProperty(PutIgniteCache.BATCH_SIZE, "5");
@@ -270,6 +292,7 @@ public class TestPutIgniteCache {
 
     @Test
     public void testPutIgniteCacheOnTriggerDefaultConfigurationOneFlowFileNoBytes() throws IOException, InterruptedException {
+        Assume.assumeTrue(preJava11);
 
         runner = TestRunners.newTestRunner(putIgniteCache);
         runner.setProperty(PutIgniteCache.BATCH_SIZE, "5");
@@ -302,6 +325,7 @@ public class TestPutIgniteCache {
 
     @Test
     public void testPutIgniteCacheOnTriggerDefaultConfigurationTwoFlowFiles() throws IOException, InterruptedException {
+        Assume.assumeTrue(preJava11);
 
         runner = TestRunners.newTestRunner(putIgniteCache);
         runner.setProperty(PutIgniteCache.BATCH_SIZE, "5");
@@ -346,6 +370,7 @@ public class TestPutIgniteCache {
 
     @Test
     public void testPutIgniteCacheOnTriggerDefaultConfigurationTwoFlowFilesNoKey() throws IOException, InterruptedException {
+        Assume.assumeTrue(preJava11);
 
         runner = TestRunners.newTestRunner(putIgniteCache);
         runner.setProperty(PutIgniteCache.BATCH_SIZE, "5");
@@ -393,6 +418,7 @@ public class TestPutIgniteCache {
 
     @Test
     public void testPutIgniteCacheOnTriggerDefaultConfigurationTwoFlowFileFirstNoKey() throws IOException, InterruptedException {
+        Assume.assumeTrue(preJava11);
 
         runner = TestRunners.newTestRunner(putIgniteCache);
         runner.setProperty(PutIgniteCache.BATCH_SIZE, "5");
@@ -437,6 +463,7 @@ public class TestPutIgniteCache {
 
     @Test
     public void testPutIgniteCacheOnTriggerDefaultConfigurationTwoFlowFileSecondNoKey() throws IOException, InterruptedException {
+        Assume.assumeTrue(preJava11);
 
         runner = TestRunners.newTestRunner(putIgniteCache);
         runner.setProperty(PutIgniteCache.BATCH_SIZE, "5");
@@ -483,6 +510,7 @@ public class TestPutIgniteCache {
 
     @Test
     public void testPutIgniteCacheOnTriggerDefaultConfigurationTwoFlowFilesOneNoKeyOneNoBytes() throws IOException, InterruptedException {
+        Assume.assumeTrue(preJava11);
 
         runner = TestRunners.newTestRunner(putIgniteCache);
         runner.setProperty(PutIgniteCache.BATCH_SIZE, "5");
@@ -530,6 +558,7 @@ public class TestPutIgniteCache {
 
     @Test
     public void testPutIgniteCacheOnTriggerDefaultConfigurationTwoFlowFilesOneNoKeySecondOkThirdNoBytes() throws IOException, InterruptedException {
+        Assume.assumeTrue(preJava11);
 
         runner = TestRunners.newTestRunner(putIgniteCache);
         runner.setProperty(PutIgniteCache.BATCH_SIZE, "5");
diff --git a/nifi-nar-bundles/nifi-kafka-bundle/nifi-kafka-0-10-processors/pom.xml b/nifi-nar-bundles/nifi-kafka-bundle/nifi-kafka-0-10-processors/pom.xml
index d40d9ec..68fb6c9 100644
--- a/nifi-nar-bundles/nifi-kafka-bundle/nifi-kafka-0-10-processors/pom.xml
+++ b/nifi-nar-bundles/nifi-kafka-bundle/nifi-kafka-0-10-processors/pom.xml
@@ -93,4 +93,28 @@
             <scope>test</scope>
         </dependency>
     </dependencies>
+    <profiles>
+        <profile>
+            <!-- This profile, activating when compiling on Java versions above 1.8, provides configuration changes to
+                 allow NiFi to be compiled on those JDKs. -->
+            <id>jigsaw</id>
+            <activation>
+                <jdk>(1.8,)</jdk>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>javax.xml.bind</groupId>
+                    <artifactId>jaxb-api</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-core</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-impl</artifactId>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
 </project>
diff --git a/nifi-nar-bundles/nifi-kafka-bundle/nifi-kafka-0-11-processors/pom.xml b/nifi-nar-bundles/nifi-kafka-bundle/nifi-kafka-0-11-processors/pom.xml
index d409ccd..50e75bc 100644
--- a/nifi-nar-bundles/nifi-kafka-bundle/nifi-kafka-0-11-processors/pom.xml
+++ b/nifi-nar-bundles/nifi-kafka-bundle/nifi-kafka-0-11-processors/pom.xml
@@ -92,4 +92,28 @@
             <scope>test</scope>
         </dependency>
     </dependencies>
+    <profiles>
+        <profile>
+            <!-- This profile, activating when compiling on Java versions above 1.8, provides configuration changes to
+                 allow NiFi to be compiled on those JDKs. -->
+            <id>jigsaw</id>
+            <activation>
+                <jdk>(1.8,)</jdk>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>javax.xml.bind</groupId>
+                    <artifactId>jaxb-api</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-core</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-impl</artifactId>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
 </project>
diff --git a/nifi-nar-bundles/nifi-kafka-bundle/nifi-kafka-0-9-processors/pom.xml b/nifi-nar-bundles/nifi-kafka-bundle/nifi-kafka-0-9-processors/pom.xml
index 7e124bc..c6e049c 100644
--- a/nifi-nar-bundles/nifi-kafka-bundle/nifi-kafka-0-9-processors/pom.xml
+++ b/nifi-nar-bundles/nifi-kafka-bundle/nifi-kafka-0-9-processors/pom.xml
@@ -80,4 +80,28 @@
             <scope>test</scope>
         </dependency>
     </dependencies>
+    <profiles>
+        <profile>
+            <!-- This profile, activating when compiling on Java versions above 1.8, provides configuration changes to
+                 allow NiFi to be compiled on those JDKs. -->
+            <id>jigsaw</id>
+            <activation>
+                <jdk>(1.8,)</jdk>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>javax.xml.bind</groupId>
+                    <artifactId>jaxb-api</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-core</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-impl</artifactId>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
 </project>
diff --git a/nifi-nar-bundles/nifi-kafka-bundle/nifi-kafka-1-0-processors/pom.xml b/nifi-nar-bundles/nifi-kafka-bundle/nifi-kafka-1-0-processors/pom.xml
index a804fd5..9b9b047 100644
--- a/nifi-nar-bundles/nifi-kafka-bundle/nifi-kafka-1-0-processors/pom.xml
+++ b/nifi-nar-bundles/nifi-kafka-bundle/nifi-kafka-1-0-processors/pom.xml
@@ -93,4 +93,28 @@
             <scope>test</scope>
         </dependency>
     </dependencies>
+    <profiles>
+        <profile>
+            <!-- This profile, activating when compiling on Java versions above 1.8, provides configuration changes to
+                 allow NiFi to be compiled on those JDKs. -->
+            <id>jigsaw</id>
+            <activation>
+                <jdk>(1.8,)</jdk>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>javax.xml.bind</groupId>
+                    <artifactId>jaxb-api</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-core</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-impl</artifactId>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
 </project>
diff --git a/nifi-nar-bundles/nifi-kafka-bundle/nifi-kafka-2-0-processors/pom.xml b/nifi-nar-bundles/nifi-kafka-bundle/nifi-kafka-2-0-processors/pom.xml
index b4f9470..8c934bc 100644
--- a/nifi-nar-bundles/nifi-kafka-bundle/nifi-kafka-2-0-processors/pom.xml
+++ b/nifi-nar-bundles/nifi-kafka-bundle/nifi-kafka-2-0-processors/pom.xml
@@ -98,4 +98,28 @@
             <scope>test</scope>
         </dependency>
     </dependencies>
+    <profiles>
+        <profile>
+            <!-- This profile, activating when compiling on Java versions above 1.8, provides configuration changes to
+                 allow NiFi to be compiled on those JDKs. -->
+            <id>jigsaw</id>
+            <activation>
+                <jdk>(1.8,)</jdk>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>javax.xml.bind</groupId>
+                    <artifactId>jaxb-api</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-core</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-impl</artifactId>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
 </project>
diff --git a/nifi-nar-bundles/nifi-language-translation-bundle/nifi-yandex-processors/pom.xml b/nifi-nar-bundles/nifi-language-translation-bundle/nifi-yandex-processors/pom.xml
index 565cd3d..7bfbdf3 100644
--- a/nifi-nar-bundles/nifi-language-translation-bundle/nifi-yandex-processors/pom.xml
+++ b/nifi-nar-bundles/nifi-language-translation-bundle/nifi-yandex-processors/pom.xml
@@ -66,4 +66,28 @@
             <scope>test</scope>
         </dependency>
     </dependencies>
+    <profiles>
+        <profile>
+            <!-- This profile, activating when compiling on Java versions above 1.8, provides configuration changes to
+                 allow NiFi to be compiled on those JDKs. -->
+            <id>jigsaw</id>
+            <activation>
+                <jdk>(1.8,)</jdk>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>javax.xml.bind</groupId>
+                    <artifactId>jaxb-api</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-core</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-impl</artifactId>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
 </project>
diff --git a/nifi-nar-bundles/nifi-lumberjack-bundle/nifi-lumberjack-processors/pom.xml b/nifi-nar-bundles/nifi-lumberjack-bundle/nifi-lumberjack-processors/pom.xml
index 4c5551d..7974a72 100644
--- a/nifi-nar-bundles/nifi-lumberjack-bundle/nifi-lumberjack-processors/pom.xml
+++ b/nifi-nar-bundles/nifi-lumberjack-bundle/nifi-lumberjack-processors/pom.xml
@@ -67,4 +67,29 @@
             <version>2.2.4</version>
         </dependency>
     </dependencies>
+
+    <profiles>
+        <profile>
+            <!-- This profile, activating when compiling on Java versions above 1.8, provides configuration changes to
+                 allow NiFi to be compiled on those JDKs. -->
+            <id>jigsaw</id>
+            <activation>
+                <jdk>(1.8,)</jdk>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>javax.xml.bind</groupId>
+                    <artifactId>jaxb-api</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-core</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-impl</artifactId>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
 </project>
diff --git a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/groovy/org/apache/nifi/reporting/script/ScriptedReportingTaskGroovyTest.groovy b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/groovy/org/apache/nifi/reporting/script/ScriptedReportingTaskGroovyTest.groovy
index 8ca5377..f9c6876 100644
--- a/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/groovy/org/apache/nifi/reporting/script/ScriptedReportingTaskGroovyTest.groovy
+++ b/nifi-nar-bundles/nifi-scripting-bundle/nifi-scripting-processors/src/test/groovy/org/apache/nifi/reporting/script/ScriptedReportingTaskGroovyTest.groovy
@@ -83,7 +83,7 @@ class ScriptedReportingTaskGroovyTest {
     @Test
     void testProvenanceGroovyScript() {
         def uuid = "10000000-0000-0000-0000-000000000000"
-        def attributes = ['abc': 'xyz', 'xyz': 'abc', 'filename': "file-$uuid", 'uuid': uuid]
+        def attributes = ['abc': 'xyz', 'xyz': 'abc', 'filename': 'file-' + uuid, 'uuid': uuid]
         def prevAttrs = ['filename': '1234.xyz']
 
         def flowFile = new MockFlowFile(3L)
diff --git a/nifi-nar-bundles/nifi-spring-bundle/nifi-spring-processors/src/main/java/org/apache/nifi/spring/SpringContextProcessor.java b/nifi-nar-bundles/nifi-spring-bundle/nifi-spring-processors/src/main/java/org/apache/nifi/spring/SpringContextProcessor.java
index d6ea6af..79aae5f 100644
--- a/nifi-nar-bundles/nifi-spring-bundle/nifi-spring-processors/src/main/java/org/apache/nifi/spring/SpringContextProcessor.java
+++ b/nifi-nar-bundles/nifi-spring-bundle/nifi-spring-processors/src/main/java/org/apache/nifi/spring/SpringContextProcessor.java
@@ -23,7 +23,6 @@ import java.io.OutputStream;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -428,14 +427,11 @@ public class SpringContextProcessor extends AbstractProcessor {
      *
      */
     private static boolean isConfigResolvable(String configPath, File libDirPathFile) {
-        List<URL> urls = new ArrayList<>();
-        URLClassLoader parentLoader = (URLClassLoader) SpringContextProcessor.class.getClassLoader();
-        urls.addAll(Arrays.asList(parentLoader.getURLs()));
-
-        urls.addAll(SpringContextFactory.gatherAdditionalClassPathUrls(libDirPathFile.getAbsolutePath()));
+        ClassLoader parentLoader = SpringContextProcessor.class.getClassLoader();
         boolean resolvable = false;
-        try (URLClassLoader throwawayCl = new URLClassLoader(urls.toArray(new URL[] {}), null)) {
-            resolvable = throwawayCl.findResource(configPath) != null;
+        URL[] urls = SpringContextFactory.gatherAdditionalClassPathUrls(libDirPathFile.getAbsolutePath()).toArray(new URL[]{});
+        try (URLClassLoader throwawayCl = new URLClassLoader(urls, parentLoader)) {
+            resolvable = throwawayCl.getResource(configPath) != null;
         } catch (IOException e) {
             // ignore since it can only happen on CL.close()
         }
diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/pom.xml b/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/pom.xml
index 49c237e..89789e1 100644
--- a/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/pom.xml
+++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/pom.xml
@@ -232,5 +232,33 @@ language governing permissions and limitations under the License. -->
             </plugin>
         </plugins>
     </build>
-
+    <profiles>
+        <profile>
+            <!-- This profile, activating when compiling on Java versions above 1.8, provides configuration changes to
+                 allow NiFi to be compiled on those JDKs. -->
+            <id>jigsaw</id>
+            <activation>
+                <jdk>(1.8,)</jdk>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>javax.xml.bind</groupId>
+                    <artifactId>jaxb-api</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-core</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-impl</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.activation</groupId>
+                    <artifactId>javax.activation</artifactId>
+                    <version>1.2.0</version>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
 </project>
diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/pom.xml b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/pom.xml
index 885efc5..f7e5621 100644
--- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/pom.xml
+++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/pom.xml
@@ -605,5 +605,27 @@
                 </plugins>
             </build>
         </profile>
+        <profile>
+            <!-- This profile, activating when compiling on Java versions above 1.8, provides configuration changes to
+                 allow NiFi to be compiled on those JDKs. -->
+            <id>jigsaw</id>
+            <activation>
+                <jdk>(1.8,)</jdk>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>javax.xml.bind</groupId>
+                    <artifactId>jaxb-api</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-core</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-impl</artifactId>
+                </dependency>
+            </dependencies>
+        </profile>
     </profiles>
 </project>
diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/groovy/org/apache/nifi/processors/standard/TestGetHTTPGroovy.groovy b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/groovy/org/apache/nifi/processors/standard/TestGetHTTPGroovy.groovy
index 408e691..f717044 100644
--- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/groovy/org/apache/nifi/processors/standard/TestGetHTTPGroovy.groovy
+++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/groovy/org/apache/nifi/processors/standard/TestGetHTTPGroovy.groovy
@@ -42,14 +42,13 @@ import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
-import sun.security.ssl.SSLContextImpl
-import sun.security.ssl.SSLEngineImpl
 
 import javax.crypto.Cipher
 import javax.net.SocketFactory
 import javax.net.ssl.HostnameVerifier
 import javax.net.ssl.HttpsURLConnection
 import javax.net.ssl.SSLContext
+import javax.net.ssl.SSLEngine
 import javax.net.ssl.SSLHandshakeException
 import javax.net.ssl.SSLSocket
 import javax.net.ssl.TrustManager
@@ -69,8 +68,10 @@ class TestGetHTTPGroovy extends GroovyTestCase {
     private static final List DEFAULT_PROTOCOLS = [TLSv1, TLSv1_1, TLSv1_2]
 
     private static final String TLSv1_1_CIPHER_SUITE = "TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA"
+    private static final SSLContext SSL_CONTEXT = SSLContext.default
+    private static final SSLEngine SSL_ENGINE = SSL_CONTEXT.createSSLEngine()
     private static
-    final List DEFAULT_CIPHER_SUITES = new SSLEngineImpl(new SSLContextImpl.TLSContext()).supportedCipherSuites as List
+    final List DEFAULT_CIPHER_SUITES = SSL_ENGINE.supportedCipherSuites as List
 
     private static final String DEFAULT_HOSTNAME = "localhost"
     private static final int DEFAULT_TLS_PORT = 8456
diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/groovy/org/apache/nifi/processors/standard/TestPostHTTPGroovy.groovy b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/groovy/org/apache/nifi/processors/standard/TestPostHTTPGroovy.groovy
index 6022b8c..4c66ec7 100644
--- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/groovy/org/apache/nifi/processors/standard/TestPostHTTPGroovy.groovy
+++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/groovy/org/apache/nifi/processors/standard/TestPostHTTPGroovy.groovy
@@ -40,14 +40,13 @@ import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
-import sun.security.ssl.SSLContextImpl
-import sun.security.ssl.SSLEngineImpl
 
 import javax.crypto.Cipher
 import javax.net.SocketFactory
 import javax.net.ssl.HostnameVerifier
 import javax.net.ssl.HttpsURLConnection
 import javax.net.ssl.SSLContext
+import javax.net.ssl.SSLEngine
 import javax.net.ssl.SSLSocket
 import javax.net.ssl.TrustManager
 import javax.net.ssl.X509TrustManager
@@ -67,8 +66,10 @@ class TestPostHTTPGroovy extends GroovyTestCase {
     private static final List DEFAULT_PROTOCOLS = [TLSv1, TLSv1_1, TLSv1_2]
 
     private static final String TLSv1_1_CIPHER_SUITE = "TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA"
+    private static final SSLContext SSL_CONTEXT = SSLContext.default
+    private static final SSLEngine SSL_ENGINE = SSL_CONTEXT.createSSLEngine()
     private static
-    final List DEFAULT_CIPHER_SUITES = new SSLEngineImpl(new SSLContextImpl.TLSContext()).supportedCipherSuites as List
+    final List DEFAULT_CIPHER_SUITES = SSL_ENGINE.supportedCipherSuites as List
 
     private static final String DEFAULT_HOSTNAME = "localhost"
     private static final int DEFAULT_TLS_PORT = 8456
diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestListenRELP.java b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestListenRELP.java
index 3843183..609b35f 100644
--- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestListenRELP.java
+++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestListenRELP.java
@@ -152,6 +152,7 @@ public class TestListenRELP {
     public void testTLS() throws InitializationException, IOException, InterruptedException {
         final SSLContextService sslContextService = new StandardSSLContextService();
         runner.addControllerService("ssl-context", sslContextService);
+        runner.setProperty(sslContextService, StandardSSLContextService.SSL_ALGORITHM, "TLSv1.2");
         runner.setProperty(sslContextService, StandardSSLContextService.TRUSTSTORE, "src/test/resources/truststore.jks");
         runner.setProperty(sslContextService, StandardSSLContextService.TRUSTSTORE_PASSWORD, "passwordpassword");
         runner.setProperty(sslContextService, StandardSSLContextService.TRUSTSTORE_TYPE, "JKS");
diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestListenTCP.java b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestListenTCP.java
index f4d3aa0..b92da80 100644
--- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestListenTCP.java
+++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestListenTCP.java
@@ -130,7 +130,7 @@ public class TestListenTCP {
                 "passwordpassword".toCharArray(),
                 "jks",
                 org.apache.nifi.security.util.SslContextFactory.ClientAuth.valueOf("NONE"),
-                "TLS");
+                "TLSv1.2");
 
         runTCP(messages, messages.size(), clientSslContext);
 
@@ -159,7 +159,7 @@ public class TestListenTCP {
                 "src/test/resources/truststore.jks",
                 "passwordpassword".toCharArray(),
                 "jks",
-                "TLS");
+                "TLSv1.2");
 
         try {
             runTCP(messages, messages.size(), clientSslContext);
@@ -188,7 +188,7 @@ public class TestListenTCP {
                 "src/test/resources/truststore.jks",
                 "passwordpassword".toCharArray(),
                 "jks",
-                "TLS");
+                "TLSv1.2");
 
         runTCP(messages, messages.size(), clientSslContext);
 
@@ -267,6 +267,7 @@ public class TestListenTCP {
         runner.setProperty(sslContextService, StandardSSLContextService.KEYSTORE, "src/test/resources/keystore.jks");
         runner.setProperty(sslContextService, StandardSSLContextService.KEYSTORE_PASSWORD, "passwordpassword");
         runner.setProperty(sslContextService, StandardSSLContextService.KEYSTORE_TYPE, "JKS");
+        runner.setProperty(sslContextService, StandardSSLContextService.SSL_ALGORITHM, "TLSv1.2");
         runner.enableControllerService(sslContextService);
 
         runner.setProperty(ListenTCP.SSL_CONTEXT_SERVICE, "ssl-context");
diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestListenTCPRecord.java b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestListenTCPRecord.java
index 20145b6..10e77c2 100644
--- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestListenTCPRecord.java
+++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestListenTCPRecord.java
@@ -168,7 +168,7 @@ public class TestListenTCPRecord {
                 "passwordpassword".toCharArray(),
                 "jks",
                 org.apache.nifi.security.util.SslContextFactory.ClientAuth.valueOf("NONE"),
-                "TLS");
+                "TLSv1.2");
 
         runTCP(DATA, 1, clientSslContext);
 
@@ -212,7 +212,7 @@ public class TestListenTCPRecord {
                 "src/test/resources/truststore.jks",
                 "passwordpassword".toCharArray(),
                 "jks",
-                "TLS");
+                "TLSv1.2");
 
         runTCP(DATA, 1, clientSslContext);
 
diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestPutTcpSSL.java b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestPutTcpSSL.java
index 70e98ca..228dcfc 100644
--- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestPutTcpSSL.java
+++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestPutTcpSSL.java
@@ -63,6 +63,7 @@ public class TestPutTcpSSL extends TestPutTCPCommon {
         map.put(StandardSSLContextService.TRUSTSTORE.getName(), "src/test/resources/truststore.jks");
         map.put(StandardSSLContextService.TRUSTSTORE_PASSWORD.getName(), "passwordpassword");
         map.put(StandardSSLContextService.TRUSTSTORE_TYPE.getName(), "JKS");
+        map.put(StandardSSLContextService.SSL_ALGORITHM.getName(), "TLSv1.2");
         return map;
     }
 }
diff --git a/nifi-nar-bundles/nifi-standard-services/nifi-hbase_1_1_2-client-service-bundle/nifi-hbase_1_1_2-client-service/pom.xml b/nifi-nar-bundles/nifi-standard-services/nifi-hbase_1_1_2-client-service-bundle/nifi-hbase_1_1_2-client-service/pom.xml
index 8bc178f..6fddf5e 100644
--- a/nifi-nar-bundles/nifi-standard-services/nifi-hbase_1_1_2-client-service-bundle/nifi-hbase_1_1_2-client-service/pom.xml
+++ b/nifi-nar-bundles/nifi-standard-services/nifi-hbase_1_1_2-client-service-bundle/nifi-hbase_1_1_2-client-service/pom.xml
@@ -107,4 +107,39 @@
             <scope>test</scope>
         </dependency>
     </dependencies>
+
+    <profiles>
+        <profile>
+            <!-- This profile, activating when compiling on Java versions above 1.8, provides configuration changes to
+                 allow NiFi to be compiled on those JDKs. -->
+            <id>jigsaw</id>
+            <activation>
+                <jdk>(1.8,)</jdk>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>org.apache.hbase</groupId>
+                    <artifactId>hbase-client</artifactId>
+                    <version>${hbase.version}</version>
+                    <exclusions>
+                        <!-- Need to re-list exclusions here, plus add jdk.tools for Java 9+, since it doesn't need
+                        to be imported in those JDKs.
+                        See https://openjdk.java.net/jeps/220 -->
+                        <exclusion>
+                            <groupId>org.slf4j</groupId>
+                            <artifactId>slf4j-log4j12</artifactId>
+                        </exclusion>
+                        <exclusion>
+                            <groupId>com.google.code.findbugs</groupId>
+                            <artifactId>jsr305</artifactId>
+                        </exclusion>
+                        <exclusion>
+                            <groupId>jdk.tools</groupId>
+                            <artifactId>jdk.tools</artifactId>
+                        </exclusion>
+                    </exclusions>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
 </project>
diff --git a/nifi-nar-bundles/nifi-standard-services/nifi-hbase_2-client-service-bundle/nifi-hbase_2-client-service/pom.xml b/nifi-nar-bundles/nifi-standard-services/nifi-hbase_2-client-service-bundle/nifi-hbase_2-client-service/pom.xml
index 1ef023a..9bd1ed5 100644
--- a/nifi-nar-bundles/nifi-standard-services/nifi-hbase_2-client-service-bundle/nifi-hbase_2-client-service/pom.xml
+++ b/nifi-nar-bundles/nifi-standard-services/nifi-hbase_2-client-service-bundle/nifi-hbase_2-client-service/pom.xml
@@ -105,4 +105,39 @@
             <scope>test</scope>
         </dependency>
     </dependencies>
+
+    <profiles>
+        <profile>
+            <!-- This profile, activating when compiling on Java versions above 1.8, provides configuration changes to
+                 allow NiFi to be compiled on those JDKs. -->
+            <id>jigsaw</id>
+            <activation>
+                <jdk>(1.8,)</jdk>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>org.apache.hbase</groupId>
+                    <artifactId>hbase-client</artifactId>
+                    <version>${hbase.version}</version>
+                    <exclusions>
+                        <!-- Need to re-list exclusions here, plus add jdk.tools for Java 9+, since it doesn't need
+                        to be imported in those JDKs.
+                        See https://openjdk.java.net/jeps/220 -->
+                        <exclusion>
+                            <groupId>org.slf4j</groupId>
+                            <artifactId>slf4j-log4j12</artifactId>
+                        </exclusion>
+                        <exclusion>
+                            <groupId>com.google.code.findbugs</groupId>
+                            <artifactId>jsr305</artifactId>
+                        </exclusion>
+                        <exclusion>
+                            <groupId>jdk.tools</groupId>
+                            <artifactId>jdk.tools</artifactId>
+                        </exclusion>
+                    </exclusions>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
 </project>
diff --git a/nifi-nar-bundles/nifi-update-attribute-bundle/nifi-update-attribute-model/pom.xml b/nifi-nar-bundles/nifi-update-attribute-bundle/nifi-update-attribute-model/pom.xml
index 2d6f326..18c13e8 100644
--- a/nifi-nar-bundles/nifi-update-attribute-bundle/nifi-update-attribute-model/pom.xml
+++ b/nifi-nar-bundles/nifi-update-attribute-bundle/nifi-update-attribute-model/pom.xml
@@ -30,4 +30,28 @@
             <version>1.10.0-SNAPSHOT</version>
         </dependency>
     </dependencies>
+    <profiles>
+        <profile>
+            <!-- This profile, activating when compiling on Java versions above 1.8, provides configuration changes to
+                 allow NiFi to be compiled on those JDKs. -->
+            <id>jigsaw</id>
+            <activation>
+                <jdk>(1.8,)</jdk>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>javax.xml.bind</groupId>
+                    <artifactId>jaxb-api</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-core</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-impl</artifactId>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
 </project>
diff --git a/nifi-nar-bundles/nifi-update-attribute-bundle/nifi-update-attribute-ui/pom.xml b/nifi-nar-bundles/nifi-update-attribute-bundle/nifi-update-attribute-ui/pom.xml
index ffb308c..e7b8b69 100644
--- a/nifi-nar-bundles/nifi-update-attribute-bundle/nifi-update-attribute-ui/pom.xml
+++ b/nifi-nar-bundles/nifi-update-attribute-bundle/nifi-update-attribute-ui/pom.xml
@@ -47,6 +47,30 @@
             </plugin>
         </plugins>
     </build>
+    <profiles>
+        <profile>
+            <!-- This profile, activating when compiling on Java versions above 1.8, provides configuration changes to
+                 allow NiFi to be compiled on those JDKs. -->
+            <id>jigsaw</id>
+            <activation>
+                <jdk>(1.8,)</jdk>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>javax.xml.bind</groupId>
+                    <artifactId>jaxb-api</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-core</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-impl</artifactId>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
     <dependencies>
         <dependency>
             <groupId>org.apache.nifi</groupId>
diff --git a/nifi-nar-bundles/nifi-windows-event-log-bundle/nifi-windows-event-log-processors/src/test/java/org/apache/nifi/processors/windows/event/log/JNAOverridingJUnitRunner.java b/nifi-nar-bundles/nifi-windows-event-log-bundle/nifi-windows-event-log-processors/src/test/java/org/apache/nifi/processors/windows/event/log/JNAOverridingJUnitRunner.java
index 224fc54..2ce8bc9 100644
--- a/nifi-nar-bundles/nifi-windows-event-log-bundle/nifi-windows-event-log-processors/src/test/java/org/apache/nifi/processors/windows/event/log/JNAOverridingJUnitRunner.java
+++ b/nifi-nar-bundles/nifi-windows-event-log-bundle/nifi-windows-event-log-processors/src/test/java/org/apache/nifi/processors/windows/event/log/JNAOverridingJUnitRunner.java
@@ -21,14 +21,21 @@ import com.sun.jna.Native;
 import javassist.ClassPool;
 import javassist.CtClass;
 import javassist.CtMethod;
+import org.junit.Assert;
 import org.junit.runner.Description;
 import org.junit.runner.Runner;
 import org.junit.runner.notification.RunNotifier;
 import org.junit.runners.model.InitializationError;
 import org.mockito.junit.MockitoJUnitRunner;
 
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.net.URLClassLoader;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.Map;
+import java.util.regex.Pattern;
 
 /**
  * Can't even use the JNA interface classes if the native library won't load.  This is a workaround to allow mocking them for unit tests.
@@ -40,7 +47,19 @@ public abstract class JNAOverridingJUnitRunner extends Runner {
 
     public JNAOverridingJUnitRunner(Class<?> klass) throws InitializationError {
         Map<String, Map<String, String>> classOverrideMap = getClassOverrideMap();
-        ClassLoader jnaMockClassloader = new URLClassLoader(((URLClassLoader) JNAOverridingJUnitRunner.class.getClassLoader()).getURLs(), null) {
+        String classpath = System.getProperty("java.class.path");
+        URL[] result = Pattern.compile(File.pathSeparator).splitAsStream(classpath).map(Paths::get).map(Path::toAbsolutePath).map(Path::toUri)
+                .map(uri -> {
+                    URL url = null;
+                    try {
+                        url = uri.toURL();
+                    } catch (MalformedURLException e) {
+                        Assert.fail(String.format("Unable to create URL for classpath entry '%s'", uri));
+                    }
+                    return url;
+                })
+                .toArray(URL[]::new);
+        ClassLoader jnaMockClassloader = new URLClassLoader(result, null) {
             @Override
             protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
                 Map<String, String> classOverrides = classOverrideMap.get(name);
diff --git a/nifi-toolkit/nifi-toolkit-admin/pom.xml b/nifi-toolkit/nifi-toolkit-admin/pom.xml
index c9c3c75..d8bc620 100644
--- a/nifi-toolkit/nifi-toolkit-admin/pom.xml
+++ b/nifi-toolkit/nifi-toolkit-admin/pom.xml
@@ -203,4 +203,29 @@ language governing permissions and limitations under the License. -->
             </plugin>
         </plugins>
     </build>
+
+    <profiles>
+        <profile>
+            <!-- This profile, activating when compiling on Java versions above 1.8, provides configuration changes to
+                 allow NiFi to be compiled on those JDKs. -->
+            <id>jigsaw</id>
+            <activation>
+                <jdk>(1.8,)</jdk>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>javax.xml.bind</groupId>
+                    <artifactId>jaxb-api</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-core</artifactId>
+                </dependency>
+                <dependency>
+                    <groupId>com.sun.xml.bind</groupId>
+                    <artifactId>jaxb-impl</artifactId>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
 </project>
diff --git a/nifi-toolkit/nifi-toolkit-api/pom.xml b/nifi-toolkit/nifi-toolkit-api/pom.xml
index babaae5..8c3c28f 100644
--- a/nifi-toolkit/nifi-toolkit-api/pom.xml
+++ b/nifi-toolkit/nifi-toolkit-api/pom.xml
@@ -123,4 +123,20 @@ language governing permissions and limitations under the License. -->
             </plugin>
         </plugins>
     </build>
+    <profiles>
+        <profile>
+            <!-- This profile, activating when compiling on Java versions above 1.8, provides configuration changes to
+                 allow NiFi to be compiled on those JDKs. -->
+            <id>jigsaw</id>
+            <activation>
+                <jdk>(1.8,)</jdk>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>javax.annotation</groupId>
+                    <artifactId>javax.annotation-api</artifactId>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
 </project>
diff --git a/nifi-toolkit/nifi-toolkit-encrypt-config/pom.xml b/nifi-toolkit/nifi-toolkit-encrypt-config/pom.xml
index 0abe248..c4e68f6 100644
--- a/nifi-toolkit/nifi-toolkit-encrypt-config/pom.xml
+++ b/nifi-toolkit/nifi-toolkit-encrypt-config/pom.xml
@@ -162,6 +162,5 @@
                 </executions>
             </plugin>
         </plugins>
-
     </build>
 </project>
\ No newline at end of file
diff --git a/nifi-toolkit/nifi-toolkit-zookeeper-migrator/pom.xml b/nifi-toolkit/nifi-toolkit-zookeeper-migrator/pom.xml
index 475947f..70c197e 100644
--- a/nifi-toolkit/nifi-toolkit-zookeeper-migrator/pom.xml
+++ b/nifi-toolkit/nifi-toolkit-zookeeper-migrator/pom.xml
@@ -64,6 +64,13 @@
             <version>2.7</version>
         </dependency>
         <dependency>
+            <groupId>org.codehaus.groovy</groupId>
+            <artifactId>groovy-all</artifactId>
+            <version>2.5.4</version>
+            <type>pom</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>org.spockframework</groupId>
             <artifactId>spock-core</artifactId>
             <scope>test</scope>
diff --git a/pom.xml b/pom.xml
index bff9b74..f72183b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -98,6 +98,7 @@
         <jackson.version>2.9.9</jackson.version>
         <nifi.registry.version>0.4.0</nifi.registry.version>
         <nifi.groovy.version>2.5.4</nifi.groovy.version>
+        <surefire.version>2.22.0</surefire.version>
     </properties>
 
     <repositories>
@@ -356,7 +357,7 @@
                 <plugin>
                     <groupId>org.apache.maven.plugins</groupId>
                     <artifactId>maven-compiler-plugin</artifactId>
-                    <version>3.8.0</version>
+                    <version>3.8.1</version>
                     <configuration>
                         <fork>true</fork>
                         <optimize>true</optimize>
@@ -492,7 +493,7 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
-                <version>3.8.0</version>
+                <version>3.8.1</version>
                 <executions>
                     <!-- Only run for tests -->
                     <execution>
@@ -767,6 +768,58 @@
                 </pluginManagement>
             </build>
         </profile>
+        <profile>
+            <!-- This profile, activating when compiling on Java versions above 1.8, provides configuration changes to
+                 allow NiFi to be compiled on those JDKs. -->
+            <id>jigsaw</id>
+            <activation>
+                <jdk>(1.8,)</jdk>
+            </activation>
+            <properties>
+                <maven.compiler.source>11</maven.compiler.source>
+                <maven.compiler.target>11</maven.compiler.target>
+            </properties>
+            <build>
+                <pluginManagement>
+                    <plugins>
+                        <plugin>
+                            <groupId>org.jvnet.jaxb2.maven2</groupId>
+                            <artifactId>maven-jaxb2-plugin</artifactId>
+                            <version>0.14.0</version>
+                        </plugin>
+                    </plugins>
+                </pluginManagement>
+            </build>
+            <dependencyManagement>
+                <dependencies>
+                    <dependency>
+                        <groupId>javax.xml.bind</groupId>
+                        <artifactId>jaxb-api</artifactId>
+                        <version>2.3.0</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>com.sun.xml.bind</groupId>
+                        <artifactId>jaxb-core</artifactId>
+                        <version>2.3.0</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>com.sun.xml.bind</groupId>
+                        <artifactId>jaxb-impl</artifactId>
+                        <version>2.3.0</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>com.sun.activation</groupId>
+                        <artifactId>javax.activation</artifactId>
+                        <version>1.2.0</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>javax.annotation</groupId>
+                        <artifactId>javax.annotation-api</artifactId>
+                        <version>1.3.2</version>
+                    </dependency>
+                </dependencies>
+            </dependencyManagement>
+        </profile>
         <!-- The following profiles are here as a convenience for folks that
             want to build against vendor-specific distributions of the various Hadoop
             ecosystem libraries. These will alter which dependencies are sourced in a