Xml-less Tomcat would also be very useful for OSGi http whiteboard
implementation which I'd like to work on in the coming months.

So I +1 more programmatic API.

Just let's not forget about tear down. So many APIs completely ignore a
tear down lifecycle.

- Ray

On Mon, Jul 20, 2020, 12:16 Romain Manni-Bucau, <rmannibu...@gmail.com>
wrote:

> 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