This is an automated email from the ASF dual-hosted git repository. remm pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/master by this push: new 6bb8ad5 Update to Graal 19 6bb8ad5 is described below commit 6bb8ad5bd3347465de28fbb0225c728a0a623754 Author: remm <r...@apache.org> AuthorDate: Fri May 10 11:55:16 2019 +0200 Update to Graal 19 The previous version was 1.0 RC 16, that's progress. Thankfully, there's still as many issues as before. Start working around the ones that will "never" be fixed using JreCompat (JMX and URL stream handlers). Document the new process. --- java/org/apache/catalina/startup/Tomcat.java | 8 +++++++- java/org/apache/catalina/webresources/StandardRoot.java | 9 ++++++--- java/org/apache/tomcat/util/compat/GraalCompat.java | 4 ++-- java/org/apache/tomcat/util/compat/JreCompat.java | 10 ++++++++++ java/org/apache/tomcat/util/modeler/Registry.java | 7 ++++++- res/tomcat-maven/README.md | 14 +++++++------- res/tomcat-maven/pom.xml | 2 +- webapps/docs/changelog.xml | 8 ++++++++ 8 files changed, 47 insertions(+), 15 deletions(-) diff --git a/java/org/apache/catalina/startup/Tomcat.java b/java/org/apache/catalina/startup/Tomcat.java index 2309109..71d923a 100644 --- a/java/org/apache/catalina/startup/Tomcat.java +++ b/java/org/apache/catalina/startup/Tomcat.java @@ -1391,6 +1391,12 @@ public class Tomcat { * @throws Exception if an error occurs */ public static void main(String[] args) throws Exception { + // Process some command line parameters + for (int i = 0; i < args.length; i++) { + if (args[i].equals("--no-jmx")) { + Registry.disableRegistry(); + } + } org.apache.catalina.startup.Tomcat tomcat = new org.apache.catalina.startup.Tomcat(); // Create a Catalina instance and let it parse the configuration files // It will also set a shutdown hook to stop the Server when needed @@ -1439,7 +1445,7 @@ public class Tomcat { } else if (args[i].equals("--await")) { await = true; } else if (args[i].equals("--no-jmx")) { - Registry.disableRegistry(); + // This was already processed before } else { throw new IllegalArgumentException(sm.getString("tomcat.invalidCommandLine", args[i])); } diff --git a/java/org/apache/catalina/webresources/StandardRoot.java b/java/org/apache/catalina/webresources/StandardRoot.java index ba2bf39..0f5058e 100644 --- a/java/org/apache/catalina/webresources/StandardRoot.java +++ b/java/org/apache/catalina/webresources/StandardRoot.java @@ -45,6 +45,7 @@ import org.apache.catalina.util.LifecycleMBeanBase; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.tomcat.util.buf.UriUtil; +import org.apache.tomcat.util.compat.JreCompat; import org.apache.tomcat.util.http.RequestUtil; import org.apache.tomcat.util.res.StringManager; @@ -694,9 +695,11 @@ public class StandardRoot extends LifecycleMBeanBase implements WebResourceRoot } protected void registerURLStreamHandlerFactory() { - // Ensure support for jar:war:file:/ URLs will be available (required - // for resource JARs in packed WAR files). - TomcatURLStreamHandlerFactory.register(); + if (!JreCompat.isGraalAvailable()) { + // Ensure support for jar:war:file:/ URLs will be available (required + // for resource JARs in packed WAR files). + TomcatURLStreamHandlerFactory.register(); + } } @Override diff --git a/java/org/apache/tomcat/util/compat/GraalCompat.java b/java/org/apache/tomcat/util/compat/GraalCompat.java index f6636c7..bfa7b02 100644 --- a/java/org/apache/tomcat/util/compat/GraalCompat.java +++ b/java/org/apache/tomcat/util/compat/GraalCompat.java @@ -25,10 +25,10 @@ class GraalCompat extends JreCompat { static { boolean result = false; try { - Class<?> nativeImageClazz = Class.forName("org.graalvm.nativeimage"); + Class<?> nativeImageClazz = Class.forName("org.graalvm.nativeimage.ImageInfo"); result = (nativeImageClazz.getMethod("inImageCode").invoke(null) == Boolean.TRUE); } catch (ClassNotFoundException e) { - // Must be Java 8 + // Must be Graal } catch (ReflectiveOperationException | IllegalArgumentException e) { // Should never happen } diff --git a/java/org/apache/tomcat/util/compat/JreCompat.java b/java/org/apache/tomcat/util/compat/JreCompat.java index f507b11..ffe2223 100644 --- a/java/org/apache/tomcat/util/compat/JreCompat.java +++ b/java/org/apache/tomcat/util/compat/JreCompat.java @@ -38,20 +38,25 @@ public class JreCompat { private static final int RUNTIME_MAJOR_VERSION = 8; private static final JreCompat instance; + private static final boolean graalAvailable; private static final boolean jre9Available; private static final StringManager sm = StringManager.getManager(JreCompat.class); static { // This is Tomcat 9 with a minimum Java version of Java 8. // Look for the highest supported JVM first + System.out.println("GraalCompat : " + GraalCompat.isSupported()); if (GraalCompat.isSupported()) { instance = new GraalCompat(); + graalAvailable = true; jre9Available = false; } else if (Jre9Compat.isSupported()) { instance = new Jre9Compat(); + graalAvailable = false; jre9Available = true; } else { instance = new JreCompat(); + graalAvailable = false; jre9Available = false; } } @@ -62,6 +67,11 @@ public class JreCompat { } + public static boolean isGraalAvailable() { + return graalAvailable; + } + + public static boolean isJre9Available() { return jre9Available; } diff --git a/java/org/apache/tomcat/util/modeler/Registry.java b/java/org/apache/tomcat/util/modeler/Registry.java index 0958a92..6ee1393 100644 --- a/java/org/apache/tomcat/util/modeler/Registry.java +++ b/java/org/apache/tomcat/util/modeler/Registry.java @@ -38,6 +38,7 @@ import javax.management.ObjectName; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; +import org.apache.tomcat.util.compat.JreCompat; import org.apache.tomcat.util.modeler.modules.ModelerSource; import org.apache.tomcat.util.res.StringManager; @@ -134,7 +135,11 @@ public class Registry implements RegistryMBean, MBeanRegistration { */ public static synchronized Registry getRegistry(Object key, Object guard) { if (registry == null) { - registry = new Registry(); + if (JreCompat.isGraalAvailable()) { + disableRegistry(); + } else { + registry = new Registry(); + } } if (registry.guard != null && registry.guard != guard) { return null; diff --git a/res/tomcat-maven/README.md b/res/tomcat-maven/README.md index 095c3fd..3063ac2 100644 --- a/res/tomcat-maven/README.md +++ b/res/tomcat-maven/README.md @@ -82,11 +82,11 @@ oc policy add-role-to-user view system:serviceaccount:$(oc project -q):default - Note: Graal support in Tomcat is not functional yet. -Build Graal native-image-configure tool. +Download Graal native-image and tools. ``` -export JAVA_HOME=/path...to/graalvm-ce-1.0.0-rc16 -cd $JAVA_HOME/jre/tools/native-image-configure -$JAVA_HOME/bin/native-image -H:-ParseRuntimeOptions -jar svm-configure.jar -H:Name=native-image-configure +export JAVA_HOME=/path...to/graalvm-ce-19.0.0 +cd $JAVA_HOME/bin +./gu install native-image ``` Run Tomcat with the agent in full trace mode. ``` @@ -96,9 +96,9 @@ Then exercise necessary paths of your service with the Tomcat configuration. Generate the final json using native-image-configuration then use native image using the generated reflection metadata. ``` -$JAVA_HOME/jre/tools/native-image-configure/native-image-configure generate --trace-input=./target/trace-file.json --output-dir=./target -$JAVA_HOME/bin/native-image -H:+ReportUnsupportedElementsAtRuntime -H:ConfigurationFileDirectories=./target/ -H:ReflectionConfigurationFiles=./tomcat-reflection.json -jar target/tomcat-maven-1.0.jar -./tomcat-maven-1.0 -Dcatalina.base=. -Djava.util.logging.config.file=conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager +$JAVA_HOME/bin/native-image-configure generate --trace-input=./target/trace-file.json --output-dir=./target +$JAVA_HOME/bin/native-image --allow-incomplete-classpath -H:+ReportUnsupportedElementsAtRuntime -H:ConfigurationFileDirectories=./target/ -H:ReflectionConfigurationFiles=./tomcat-reflection.json -jar target/tomcat-maven-1.0.jar +./tomcat-maven-1.0 --no-jmx -Dcatalina.base=. -Djava.util.logging.config.file=conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager ``` Note: -H:ConfigurationFileDirectories does not appear to work properly, so it could be needed to add the content of reflect-config.json to tomcat-reflection.json. diff --git a/res/tomcat-maven/pom.xml b/res/tomcat-maven/pom.xml index 7208413..c6bd79a 100644 --- a/res/tomcat-maven/pom.xml +++ b/res/tomcat-maven/pom.xml @@ -29,7 +29,7 @@ <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <mainClass>org.apache.catalina.startup.Tomcat</mainClass> - <tomcat.version>9.0.19</tomcat.version> + <tomcat.version>9.0.21</tomcat.version> </properties> <dependencies> diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index a0d7616..72a7da2 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -50,6 +50,10 @@ <add> <bug>57287</bug>: Add file sorting to DefaultServlet (schultz) </add> + <fix> + Fix <code>--no-jmx</code> flag processing, which was called after + registry initialization. (remm) + </fix> </changelog> </subsection> <subsection name="Coyote"> @@ -95,6 +99,10 @@ <bug>63403</bug>: Fix TestHttp2InitialConnection test failures when running with a non-English locale. (kkolinko) </fix> + <fix> + Add Graal JreCompat, and use it to disable JMX and URL stream handlers. + (remm) + </fix> </changelog> </subsection> </section> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org