I think a xml-less tomcat is awaited since servlet 3 - graal or not - but
agree risk is a bit higher.
That said path is different so wonder if skipping a temp solution can not
be worth after all for the community.

Le lun. 20 juil. 2020 à 17:58, Filip Hanik <fi...@hanik.com> a écrit :

>
> On 7/20/20 8:47 AM, Romain Manni-Bucau wrote:
>
>
>
> Le lun. 20 juil. 2020 à 17:41, Filip Hanik <fi...@hanik.com> a écrit :
>
>> Thanks for chiming in:
>> On 7/16/20 6:46 AM, Romain Manni-Bucau wrote:
>>
>> Hi everyone,
>>
>> I think the generation is the sanest option since code stay clean but it
>> shouldn't be done in tomcat IMHO but in user code and with a nice wrapper
>> (mvn tomcat:dump/gradle tomcatDump etc, or whatever name you like ;)).
>>
>> That's always an option, but it would become an external artifact and
>> easily end up out of sync.
>>
>
> Was thinking to keep the dumper in tomcat code base and the plugin to
> consume it so it would stay in sync, but agree it is a small risk.
>
>
>> This build phase would dump the descriptors in plain java and would load
>> them with an unique - ie single for the whole webapp - plain SPI -
>> ServiceLoader - maybe?
>>
>> The goal of this artifact was to reduce the size and classes from a full
>> tomcat (already available in tomcat-embed-core), down to a code base where
>> XML/digester/descriptors aren't used, hence tomcat-embed-programmatic
>>
>> This kind of build tool assumes you have all the runtime state in the
>> build - which is typically the case for graalvm - so you can completely
>> dump StandardContext state after start phase there and just reload it from
>> the precomputed model.
>> Only trick is about file paths which must either be recomputed or be
>> configurable to another base but it does not sound crazy.
>>
>> The less tool-ed option would be to extract all "reflectionfull" code in
>> methods and use graalvm substitutions to drop them and use plain java
>> instead (with a good naming convention, it can be generated as well).
>> Keeps the duplication but at least the main code stays clean and
>> optimizations stays together.
>>
>> That's pretty much what we're doing right now. Many of these feel like
>> hacks simply to mitigate how GraalVM/AOT does code initialization (all code
>> loaded initialized at startup)
>>
>
> Reviewing the hacks, all can be done cleanly if extracted in methods.
> Pushing the logic next step - I don't know if worth it but trying to use
> this picture to explain:
>
> 1. A noxml module can be done with protected methods/extension-points for
> XML loading - even usable in java standalone mode
> 2. Current tomcat can extend noxml module
> 3. Graal can be based on 1
>
> This would benefit both jvm and graal users at the end.
> Today 1 is possible with some hacks on tomcat embedded but it is highly
> not natural so this can be an opportunity to make it a feature maybe?
>
> I believe that tomcat-embed-programmatic is a viable interim solution,
> it's a low risk. The question for you, and the rest of the community, is
> the reward itself enough? ie, is it worth it?
>
> There is some talk about making "native-ness" part of the Java itself, and
> that could change a lot of assumptions. Making it a feature, refactoring
> code to satisfy 1, is a bit more intrusive at this point in time. I believe
> it introduces more risk than reward.
>
>
> Filip
>
>
>
>
>> Filip
>>
>>
>>
>> Romain Manni-Bucau
>> @rmannibucau <https://twitter.com/rmannibucau> |  Blog
>> <https://rmannibucau.metawerx.net/> | Old Blog
>> <http://rmannibucau.wordpress.com> | Github
>> <https://github.com/rmannibucau> | LinkedIn
>> <https://www.linkedin.com/in/rmannibucau> | Book
>> <https://www.packtpub.com/application-development/java-ee-8-high-performance>
>>
>>
>> Le jeu. 16 juil. 2020 à 14:31, Rémy Maucherat <r...@apache.org> a écrit :
>>
>>> On Mon, Jul 13, 2020 at 11:59 PM Filip Hanik <fha...@vmware.com> 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
>>>>
>>>>
>>> Well, this is a bit complex and hard to maintain (like, for example,
>>> storeconfig), so that's a downside.
>>>
>>> So starting with Tomcat and its initial server.xml, the process would be:
>>> server.xml -> equivalent Tomcat embedded code -> equivalent Tomcat
>>> embedded code with custom IntrospectionUtils code
>>> The concrete benefits may be limited though.
>>>
>>> I looked at more code generation for web.xml since the digester is nice
>>> for that, but the benefit becomes even more questionable. It is harder to
>>> manage, and the generated classes have to be loaded dynamically [unless
>>> even more code is generated]. If there are tons of fragments, there is a
>>> good intuitive reason why it becomes useless. so I didn't want to do it. I
>>> prefer if things remain a bit EE-ish, ultimately.
>>>
>>> Rémy
>>>
>>>

Reply via email to