We've had some discussions around this, mostly high level about where
this could go.
At this point, anyone strongly opposed to ship a light weight jar?
Do we feel the value is or is not there compared to the maintenance of it?
Filip
On 7/13/20 2:59 PM, Filip Hanik wrote:
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