From 26c7e9c6731ea764a0a5e406f8a5cbbb0a832830 Mon Sep 17 00:00:00 2001 From: Jeff Storck Date: Thu, 15 Nov 2018 18:38:02 -0500 Subject: [PATCH] NIFI-5820 NiFi built on Java 8 can run on Java 11 Updated RunNiFi.java to add libs needed to run on Java 11 when it is the detected runtime java version and grant access to the necessary module (java.xml.bind) when running on Java 9 or 10 Added dependencies/includes/excludes to nifi-assembly configurations for enabling NiFi to run on Java 11 --- nifi-assembly/pom.xml | 48 +++++++++++++++++++ nifi-assembly/src/main/assembly/common.xml | 18 +++++++ .../src/main/assembly/dependencies.xml | 8 ++++ .../org/apache/nifi/bootstrap/RunNiFi.java | 22 ++++++++- 4 files changed, 94 insertions(+), 2 deletions(-) diff --git a/nifi-assembly/pom.xml b/nifi-assembly/pom.xml index 164b01a2d6f8..5f041f9204d5 100755 --- a/nifi-assembly/pom.xml +++ b/nifi-assembly/pom.xml @@ -745,6 +745,34 @@ language governing permissions and limitations under the License. --> 1.10.0-SNAPSHOT nar + + + + + javax.xml.bind + jaxb-api + 2.3.0 + + + com.sun.xml.bind + jaxb-impl + 2.3.0 + + + com.sun.xml.bind + jaxb-core + 2.3.0 + + + javax.annotation + javax.annotation-api + 1.3.2 + + + javax.activation + javax.activation-api + 1.2.0 + @@ -992,6 +1020,13 @@ language governing permissions and limitations under the License. --> which are also not in bootstrap --> org.apache.nifi:nifi-resources org.apache.nifi:nifi-docs + + + javax.xml.bind:jaxb-api + com.sun.xml.bind:jaxb-impl + com.sun.xml.bind:jaxb-core + javax.activation:javax.activation-api + javax.annotation:javax.annotation-api @@ -1030,6 +1065,19 @@ language governing permissions and limitations under the License. --> + + + /opt/nifi/nifi-${project.version}/lib/java11 + + + javax.xml.bind:jaxb-api + com.sun.xml.bind:jaxb-impl + com.sun.xml.bind:jaxb-core + javax.activation:javax.activation-api + javax.annotation:javax.annotation-api + + + /opt/nifi/nifi-${project.version}/docs diff --git a/nifi-assembly/src/main/assembly/common.xml b/nifi-assembly/src/main/assembly/common.xml index cad953d72d79..e22d566625d0 100644 --- a/nifi-assembly/src/main/assembly/common.xml +++ b/nifi-assembly/src/main/assembly/common.xml @@ -31,6 +31,24 @@ + + + + runtime + false + lib/java11 + 0770 + 0664 + true + + javax.xml.bind:jaxb-api + com.sun.xml.bind:jaxb-impl + com.sun.xml.bind:jaxb-core + javax.activation:javax.activation-api + javax.annotation:javax.annotation-api + + + runtime diff --git a/nifi-assembly/src/main/assembly/dependencies.xml b/nifi-assembly/src/main/assembly/dependencies.xml index c6dd23cae63e..f804e7bc3104 100644 --- a/nifi-assembly/src/main/assembly/dependencies.xml +++ b/nifi-assembly/src/main/assembly/dependencies.xml @@ -35,6 +35,14 @@ nifi-bootstrap nifi-resources nifi-docs + + + + javax.xml.bind:jaxb-api + com.sun.xml.bind:jaxb-impl + com.sun.xml.bind:jaxb-core + javax.activation:javax.activation-api + javax.annotation:javax.annotation-api diff --git a/nifi-bootstrap/src/main/java/org/apache/nifi/bootstrap/RunNiFi.java b/nifi-bootstrap/src/main/java/org/apache/nifi/bootstrap/RunNiFi.java index 953cdce79956..78e7019175b1 100644 --- a/nifi-bootstrap/src/main/java/org/apache/nifi/bootstrap/RunNiFi.java +++ b/nifi-bootstrap/src/main/java/org/apache/nifi/bootstrap/RunNiFi.java @@ -49,6 +49,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Objects; import java.util.Properties; import java.util.Set; import java.util.concurrent.ExecutorService; @@ -993,6 +994,23 @@ public boolean accept(final File dir, final String filename) { cpFiles.add(file.getAbsolutePath()); } + String runtimeJavaVersion = System.getProperty("java.version"); + defaultLogger.info("Runtime Java version: {}", runtimeJavaVersion); + if (Integer.parseInt(runtimeJavaVersion.substring(0, runtimeJavaVersion.indexOf('.'))) >= 11) { + /* If running on Java 11 or greater, add the JAXB/activation/annotation libs to the classpath. + * + * TODO: Once the minimum Java version requirement of NiFi is 11, this processing should be removed. + * JAXB/activation/annotation will be added as an actual dependency via pom.xml. + */ + final String libJava11Filename = replaceNull(props.get("lib.dir"), "./lib").trim() + "/java11"; + File libJava11Dir = getFile(libJava11Filename, workingDir); + if (libJava11Dir.exists()) { + for (final File file : Objects.requireNonNull(libJava11Dir.listFiles((dir, filename) -> filename.toLowerCase().endsWith(".jar")))) { + cpFiles.add(file.getAbsolutePath()); + } + } + } + final StringBuilder classPathBuilder = new StringBuilder(); for (int i = 0; i < cpFiles.size(); i++) { final String filename = cpFiles.get(i); @@ -1032,8 +1050,8 @@ public boolean accept(final File dir, final String filename) { cmd.add("-Dnifi.bootstrap.listen.port=" + listenPort); cmd.add("-Dapp=NiFi"); cmd.add("-Dorg.apache.nifi.bootstrap.config.log.dir=" + nifiLogDir); - if (!System.getProperty("java.version").startsWith("1.")) { - // running on Java 9+, java.xml.bind module must be made available + if (runtimeJavaVersion.startsWith("9") || runtimeJavaVersion.startsWith("10")) { + // running on Java 9 or 10, internal module java.xml.bind module must be made available cmd.add("--add-modules=java.xml.bind"); } cmd.add("org.apache.nifi.NiFi");