for discussion, all feedback and questions welcome:

I've created a concept of having Apache Tomcat, embedded, run without 
reflection in a native image.
This concept creates a jar, tomcat-embedded-programmatic.jar, that can be fine 
tuned to only include what is needed in a default configuration when an 
embedded tomcat instance is used and configured programatically.

Steps to run Apache Tomcat using Java 8 without reflection

  1.  Make sure you have native-image (from the graal installation) on your path
  2.  git clone -b feature/embed-minimal-programmatic-jar-file-master 
g...@github.com:fhanik/tomcat.git
  3.  cd tomcat/res/graal/
  4.  ./build-tomcat-native-image.sh && ./graal-measure.sh

Should yield an output similar to (Graal 20.1):
SUCCESS: the servlet is working
RSS memory: 20.7M
Image size: 20.5M


or using an older graal, 19.2
SUCCESS: the servlet is working
RSS memory: 18.0M
Image size: 16.7M


This also leaves a file named 
${java.io.tmpdir}/XReflectionIntrospectionUtils.java so that you can review the 
solution to IntrospectionUtils.java

Goals of this concept

  1.  Do not break anything
  2.  Create a new and optimized for size artifact, tomcat-embedded-programmatic
  3.  Remove reflection by introspecting classes that are currently passed into 
IntrospectionUtils.set/getProperty by generating setters/getters at build time

How it's done

  1.  I've build out a small introspection tool in the package 
org.apache.tomcat.util.xreflect
  2.  During build time, it analyses a set of known classes that are used with 
IntrospectionUtils.java, and generates XReflectionIntrospectionUtils.java
  3.  When it packages tomcat-embed-programmatic.jar it uses the generated code 
when calling setProperty and getProperty

A PR would look like this:
https://github.com/apache/tomcat/compare/master...fhanik:feature/embed-minimal-programmatic-jar-file-master?expand=1

Reply via email to