Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Jetty-12 Structure #7638

Closed
gregw opened this issue Feb 23, 2022 · 26 comments
Closed

Jetty-12 Structure #7638

gregw opened this issue Feb 23, 2022 · 26 comments
Assignees

Comments

@gregw
Copy link
Contributor

gregw commented Feb 23, 2022

Target Jetty version(s)
Jetty-12
Enhancement Description

On consideration, I don't think we have the structure in jetty-12 correct yet. Specifically I don't think we should move the Server and core Handler classes to a core package. The Server needs to be our primary front line class and should live where it always has at org.eclipse.jetty.server.Server. The consequence of this is that any jetty-10 or jetty-11 handlers that are ported to run in jetty-12 will need to be moved to packages like org.eclipse.jetty.ee8.server.Handler, being passed a org.eclipse.jetty.ee8.server.Request etc.

Below is an example of how I see us assembling a server that runs a jetty-12 embedded context, an ee10 ServletContext and an ee8 Webapp in the same server. I have left all the package names fully qualified for "clarity". Note that I have used classloaders to isolate the ee8 and ee10 contexts - this is not strictly needed as the servlet API for ee8 and ee10 can coexist in the same classloader ("javax." vs "jakarta."), but that approach would not work if we included ee9 as well as we'd have 2 versions of "jakarta.servlet.*". So classloader isolation has been added, even if strictly not need for this example:

public class Jetty12Example
{
    public static void main(String[] args) throws Exception
    {
        org.eclipse.jetty.server.Server server = new org.eclipse.jetty.server.Server();

        org.eclipse.jetty.server.ServerConnector connector = new org.eclipse.jetty.server.ServerConnector(server);
        server.addConnector(connector);

        // Declare server handler collection
        org.eclipse.jetty.server.handler.ContextHandlerCollection contexts =
            new org.eclipse.jetty.server.handler.ContextHandlerCollection();
        server.setHandler(contexts);

        // Add an embedded jetty-12 context
        org.eclipse.jetty.server.handler.ContextHandler embedded =
            new org.eclipse.jetty.server.handler.ContextHandler("/embedded");
        embedded.setHandler(new org.eclipse.jetty.Handler.Processor()
        {
            public void process(org.eclipse.jetty.server.Request request,
                                org.eclipse.jetty.server.Response response,
                                Callback callback) throws Exception
            {
                response.setStatus(200);
                response.setContentType(MimeTypes.Type.TEXT_PLAIN_UTF_8.asString());
                response.write(true, callback, "Hello World");
            }
        });
        contexts.addHandler(embedded);

        // Add an EE10 ServletContext
        URLClassLoader ee10Loader = new URLClassLoader(
            new URL[] {new URL("file:lib/ee10/servlet-api-6.0.jar"),
                       new URL("file:lib/ee10/jetty-ee10-servlet.jar")},
            Jetty12Example.class.getClassLoader());
        org.eclipse.jetty.server.handler.ContextHandler ee10Context = (org.eclipse.jetty.server.handler.ContextHandler)
            ee10Loader.loadClass("org.eclipse.jetty.ee10.servlet.ServletContextHandler")
                .getDeclaredConstructor(String.class).newInstance("/ee10");
        org.eclipse.jetty.server.Handler ee10Servlet = (org.eclipse.jetty.server.Handler)
            ee10Loader.loadClass("org.eclipse.jetty.ee10.servlet.ServletHandler")
                .getDeclaredConstructor().newInstance();
        ee10Context.setHandler(ee10Servlet);
        contexts.addHandler(ee10Context);
        ee10Servlet.getClass().getMethod("addServletWithMapping", String.class, String.class)
            .invoke(ee10Servlet, "org.acme.MyServlet", "/");

        // Add an EE8 Webapp
        URLClassLoader ee8Loader = new URLClassLoader(
            new URL[] {new URL("file:lib/ee10/servlet-api-4.0.jar"),
                       new URL("file:lib/ee8/jetty-ee8-servlet.jar"),
                       new URL("file:lib/ee8/jetty-ee8-webapp.jar")},
            Jetty12Example.class.getClassLoader());
        org.eclipse.jetty.server.handler.ContextHandler ee8Context = (org.eclipse.jetty.server.handler.ContextHandler)
            ee8Loader.loadClass("org.eclipse.jetty.ee8.webapp.WebAppContext")
                .getDeclaredConstructor(String.class, String.class)
                .newInstance("webapps/ee8", "/ee8");
        contexts.addHandler(ee8Context);

        server.start();
        server.dumpStdErr();
        server.join();
    }
}

So at some stage, I think we need to restructure again.... but let's do some more thought experiments on this before putting the effort in.

@gregw
Copy link
Contributor Author

gregw commented Feb 23, 2022

@joakime @olamy I've assigned to you to think about the mechanics of this, including how the deployer might work.
@janbartel @lachlan-roberts @sbordet @lorban your thoughts?

@janbartel
Copy link
Contributor

The code reads pretty well, particularly for those coming from previous versions of jetty. Do you intend that the org.eclipse.jetty.server.Server would exist in an artifact called jetty-core or jetty-server? If the former, then it's a little weird that core would not be mentioned in the package.

I'll have to have a further think about the implications for eg SessionHandler, particularly with regard to multiple classloader hierarchies and how that interacts with timer thread callbacks and de/serialization of session attributes that can be server or webapp classes.

@gregw
Copy link
Contributor Author

gregw commented Feb 23, 2022

@janbartel in this vision of things there is no core!

@joakime
Copy link
Contributor

joakime commented Feb 23, 2022

The Server needs to be our primary front line class and should live where it always has at org.eclipse.jetty.server.Server.

I always envisioned this as the "end-game" of /jetty-core/.

Step 1: prove out jetty-core-server
Step 2: convert the rest of /jetty-core/ to use this new structure to validate step 1
Step 3: rename jetty-core-server and org.eclipse.jetty.core.server to the original names.
Step 4: work on the the ee10 and ee9 trees.

@joakime
Copy link
Contributor

joakime commented Feb 23, 2022

I would encourage us to move away from URLClassLoader, as the changes coming in on newer JDK releases means we will have a new class of file locking issues on windows.
(Once a specific JAR is loaded into a URLClassLoader it is now locked from being loaded by any other URLClassLoader).

@olamy
Copy link
Member

olamy commented Feb 23, 2022

Something not clear, in my mind my understanding was this mix will not be possible in embedded mode but only when using distribution which may have a different mechanism of class loading.
Not sure how users will build a project with such both dependencies:

  • ee10/servlet-api-6.0.jar
  • ee10/servlet-api-4.0.jar

most of the tools (Maven, Gradle etc..) will not be able to manage to have both and build projects with such dependencies.

@joakime
Copy link
Contributor

joakime commented Feb 23, 2022

@olamy if they have a need for multiple ee levels at the same time, they'll need to manage it from the the raw jar level on disk, not a formal dependency on a build tool.

Think something like ...

main-parent/
  main-server/
  ee8-webapps/
    legacy-webapp/
  ee10-webapps/
    newlish-webapp/
    webnext-webapp/

Their main-server/ will have to use something like dependency:copy (with a plugin local dependency) of legacy-webapp/ into place before the server can execute.

Those kinds of advanced setups will be more work, but not impossible.

@olamy
Copy link
Member

olamy commented Feb 23, 2022

Sure everything is possible but what a complicated stuff to managed for those users.. and definitely not a build trick to recommend.

@gregw
Copy link
Contributor Author

gregw commented Feb 23, 2022

@olamy I think ee8/servlet-api-4.0.jar and ee10/servlet-api-6.0.jar will be fine, because they are "javax." and "jakarta." and accessible via different groupIds. It is ee9 and ee10 that will not be able to live in the same project together, so as @joakime says it will have to not be a formal build tool dependency. From the servers point of view it will just see a ? extends ContextHandler instance where the ? part was loaded from another classloader.

@gregw
Copy link
Contributor Author

gregw commented Feb 26, 2022

So this is the structure I think we should go for, which is pretty much jetty-11 with extra:

  • build-resources
  • demos
  • jetty-slf4j-impl
  • jetty-ant
  • jetty-util
  • jetty-jmx
  • jetty-io
  • jetty-quic
  • jetty-http
  • jetty-http2
  • jetty-http3
  • jetty-server - this contains the jetty-core-server code
  • jetty-session - new module for common session code
  • jetty-xml
  • jetty-security
  • jetty-openid - common code only
  • jetty-servlet - common code only
  • jetty-webapp - common code only
  • jetty-annotations - common code only
  • jetty-websocket - core code and jetty API only
  • jetty-quickstart - common code only
  • ee10 / ee9 / ee8
    • jetty-eeX-servlet
    • jetty-eeX-session
    • jetty-eeX-webapp
    • jetty-eeX-annotation
    • jetty-eeX-websocket
    • jetty-eeX-servlets
    • jetty-eeX-quickstart
    • apache-eeX-jsp
    • glassfish-eeX-jstl
    • jetty-eeX-jspc-maven-plugin
    • jetty-eeX-tests
  • jetty-fcgi
  • jetty-util-ajax
  • jetty-maven-plugin
  • jetty-deploy
  • jetty-start
  • jetty-plus
  • jetty-jndi - probably needs to be split in common plus api modules?
  • jetty-jaas - probably needs to be split in common plus api modules?
  • jetty-cdi - should definitely be some common code, but also api modules
  • jetty-client
  • jetty-proxy
  • jetty-jaspi
  • jetty-rewrite
  • jetty-nosql
  • jetty-infinispan
  • jetty-gcloud
  • jetty-memcached
  • jetty-hazelcast
  • jetty-unixsocket
  • tests
  • jetty-runner
  • jetty-http-spi
  • jetty-osgi
  • jetty-alpn
  • jetty-home
  • jetty-bom
  • documentation
  • jetty-keystore
  • jetty-p2
  • jetty-unixdomain-server

The idea being that we leave as many modules in place as possible with same coordinates.
Modules dependent on the servlet-api will either be:

  1. split into a common module (in the old location) plus multiple api specific modules
  2. split into multiple api specific modules

Ideally with the common modules, if we previously had an org.eclipse.jetty.xxx.XxxHandler that was dependent on the servlet-api, then users will now find an abstract version of that handler in the same place with javadoc saying that a concrete eeX impl of it needs to be used.

I'm wondering if it is best to start over with a 11 branch for this?

@gregw
Copy link
Contributor Author

gregw commented Feb 26, 2022

For the jetty-12-hackathone I think we should try to make the following example work:

DELETED THIS EXAMPLE (with classloaders). See next comment instead.

public class Jetty12Example
{
    // deleted. See next comment instead
}

@joakime
Copy link
Contributor

joakime commented Feb 26, 2022

Some good points here.

Let's finish exorcising servlet from current /jetty-core/ and see what we have after that effort. I suspect we'll be close to what you are suggesting, but let's take it one step at a time.

@gregw
Copy link
Contributor Author

gregw commented Feb 27, 2022

Actaully, let's do this initial goal without classloader complication, because "javax." and "jakarta." can coexist we can do ee10 and ee8 together like:

public class Jetty12Example
{
    public static void main(String[] args) throws Exception
    {
        Server server = new Server();

        // HTTP
        ServerConnector http2 = new ServerConnector(server);
        server.addConnector(http2);

        // HTTPS & H2
        HttpConfiguration sslConfiguration = new HttpConfiguration();
        SecureRequestCustomizer secureRequestCustomizer = new SecureRequestCustomizer();
        sslConfiguration.addCustomizer(secureRequestCustomizer);

        SslContextFactory.Server sslContextFactory = new SslContextFactory.Server();
        File keystoreFile = sslContextFactory.getKeyStoreResource().getFile();
        if (!keystoreFile.exists())
            throw new FileNotFoundException(keystoreFile.getAbsolutePath());
        sslContextFactory.setKeyStorePassword("storepwd");

        ServerConnector https = new ServerConnector(server,
            new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()),
            new HttpConnectionFactory(sslConfiguration),
            new HTTP2CServerConnectionFactory(sslConfiguration));
        server.addConnector(https);


        // Declare server handler collection
        ContextHandlerCollection contexts =
            new ContextHandlerCollection();
        server.setHandler(contexts);

        // Add an embedded jetty-12 context
        ContextHandler embedded = new ContextHandler("/embedded");
        embedded.setHandler(new Handler.Processor()
        {
            public void process(Request request,
                                Response response,
                                Callback callback) throws Exception
            {
                response.setStatus(200);
                response.setContentType(MimeTypes.Type.TEXT_PLAIN_UTF_8.asString());
                response.write(true, callback, "Hello World");
            }
        });
        contexts.addHandler(embedded);

        // Add an EE10 ServletContext
        ContextHandler ee10Context = new org.eclipse.jetty.ee10.servlet.ServletContextHandler("/ee10");
        Handler.Wrapper ee10Session = new org.eclipse.jetty.ee10.session.SessionHandler();
        org.eclipse.jetty.ee10.servlet.ServletHandler ee10Servlet = new org.eclipse.jetty.ee10.servlet.ServletHandler();
        ee10Context.setHandler(ee10Session);
        ee10Session.setHandler(ee10Servlet);
        contexts.addHandler(ee10Context);
        ee10Servlet.addServletWithMapping("org.acme.TestServlet", "/");

        // Add an EE8 Webapp
        ContextHandler ee8Context = new org.eclipse.jetty.ee8.webapp.WebAppContext("/ee8");
        contexts.addHandler(ee8Context);

        server.start();
        server.dumpStdErr();
        server.join();
    }

@joakime & @olamy what we need to achive with this from a git perspective (not sure if it is possible) is:

  • the module 'jetty-servlet' should contain common files (eg Holder) that are the direct decendent of the jetty-11 version.
  • the modules like jetty-ee8-servlet & jetty-ee8-webapp need to be direct decendents of the jetty-10 versions of those modules, so if we look at their git history we will not see all the jetty-11 commits added and then removed.
  • the modules like jetty-ee10-servlet can be copied from their jetty-11 version and modified, but not too bad if ultimately seen as new classes
  • ultimately the jetty-ee9-servlet module have some files that are the direct decendents from the jetty-11 jetty-servlet module

So I really think we need to start over from a fresh jetty-11. Somehow import the jetty-10 modules with history to be under ee8, and then pull apart jetty-servlet into parts that stay in place as common and parts that move to ee10. Only at the very end will we bring in ee9

@gregw
Copy link
Contributor Author

gregw commented Feb 27, 2022

@joakime missed your comment. Yes, let's take it 1 step at a time... continue working in the core structure for now... and plan what we want some more before acting again.
I think even if we start again from jetty-11, it will be purely to move the files into the right location and then to dump on top of them with the code from the current core modules in 12.0.x - ie it can be done at the end if we want to clean up git history.

@gregw
Copy link
Contributor Author

gregw commented Feb 27, 2022

Note, I'm giving up on the source code compatible idea for porting embedded applications from jetty-9/10/11 to 12. Whilst that would be possible, it would result in our main classes having strange package/class names, whilst our legacy stuff squatted on the good package/class names. We'd forever have the problem of same package/class in multiple jars. Moving the legacy code to ee8 and ee9 means some code modifications, but they should be trivial. It will give us a much cleaner base going forward.

@janbartel
Copy link
Contributor

  • build-resources
  • demos

Contains code dependent on ee8/9/10.

  • jetty-slf4j-impl
  • jetty-ant
  • jetty-util
  • jetty-jmx
  • jetty-io
  • jetty-quic
  • jetty-http
  • jetty-http2
  • jetty-http3
  • jetty-server - this contains the jetty-core-server code
  • jetty-session - new module for common session code
  • jetty-xml
  • jetty-security
  • jetty-openid - common code only
  • jetty-servlet - common code only
  • jetty-webapp - common code only
  • jetty-annotations - common code only
  • jetty-websocket - core code and jetty API only
  • jetty-quickstart - common code only
  • ee10 / ee9 / ee8
  • jetty-eeX-servlet
  • jetty-eeX-session
  • jetty-eeX-webapp
  • jetty-eeX-annotation
  • jetty-eeX-websocket
  • jetty-eeX-servlets
  • jetty-eeX-quickstart
  • apache-eeX-jsp
  • glassfish-eeX-jstl
  • jetty-eeX-jspc-maven-plugin
  • jetty-eeX-tests
  • jetty-fcgi
  • jetty-util-ajax
  • jetty-maven-plugin

Needs to be in ee8/9/10 as it directly depends on eg WebAppContext.

  • jetty-deploy
  • jetty-start
  • jetty-plus

Needs to be in ee8/9/10 as it depends on javax/jakarta classes. Or split (if possible) into common and api modules.

  • jetty-jndi - probably needs to be split in common plus api modules?
  • jetty-jaas - probably needs to be split in common plus api modules?
  • jetty-cdi - should definitely be some common code, but also api modules
  • jetty-client
  • jetty-proxy
  • jetty-jaspi

Needs to be in ee8/9/10 as it depends on javax/jakarta classes. Or split (if possible) into common and api modules.

  • jetty-rewrite
  • jetty-nosql
  • jetty-infinispan
  • jetty-gcloud
  • jetty-memcached
  • jetty-hazelcast
  • jetty-unixsocket
  • tests

Contains some tests eg sessions that are dependent on ee8/9/10.

  • jetty-runner
  • jetty-http-spi
  • jetty-osgi

Has direct dependencies eg on WebAppContext and jsp. Will need to be split out into ee8/9/10.

  • jetty-alpn
  • jetty-home
  • jetty-bom
  • documentation
  • jetty-keystore
  • jetty-p2

I think our split into ee8/9/10 might break this - not sure the tycho plugin will cope. Might be possible to do ee8/9/10 versions with enough configuration?

  • jetty-unixdomain-server

@gregw
Copy link
Contributor Author

gregw commented Mar 1, 2022

I have created https://github.com/eclipse/jetty.project/tree/jetty-12.0.x-hackathon restarted from jetty-11

I've copied the servlet/webapp to an ee9 structure and made them all compile, so now we have both org.eclipse.jetty.servlet and org.eclipse.jetty.ee9.servlet with duplicate content, but the later in the ee9 name space. The former will be converted to the common code and the later converted to ee9 specific code and both will share the git history.

I will do the same with ee10 soon. Need to work out how the same files from jetty-10 can end up in ee8 with a direct git history that doesn't go via jakarta name space.

Once the structure is good, only then will I copy over code from current 12.0.x branch, which will break some things.

@gregw
Copy link
Contributor Author

gregw commented Mar 1, 2022

ee10 has been added

@joakime
Copy link
Contributor

joakime commented Mar 1, 2022

ee10 is not present in either the now mangled jetty-12.0.x or the new jetty-12.0.x-hackathon branch. (edit: found them)

I see jetty-ee9 and jetty-ee10 though.

Neither had their history preserved (which is possible btw). - the old jetty-12.0.x structure with /jetty-core/ had preserved history.
This also means we don't benefit from git rename tracking.
If you want the history, you'll have to redo that jetty-12.0.x-hackathon branch from jetty-11.0.x properly again.
(edit: ah, looks like you did a move while rename, which allows for follow history, a non-standard approach, but workable, just have to keep in mind that we'll have to use the optional --follow git command line option more now)

@joakime
Copy link
Contributor

joakime commented Mar 1, 2022

How are we structuring the various "big" categories now?

  1. Core
  2. EE#
  3. Home (Home + Start, which is neither Core nor EE)
  4. Support Layer (Where the things that are not core, but exist to support the ee# category exist, like ee-spec-"common" artifacts such as jetty-proxy-common, or jetty-servlet-common, or jetty-deploy-common)
  5. Integrations (This is our integration with 3rd party things go, like mongo, gcloud, infinispan, etc)
  6. Test (Integration / Home)

The Core and EE# layers will definitely need individual boms.
The Integrations / Support layer can be just part of the EE# boms (where they will be used). But I can see an argument that those should be handled differently.

@gregw
Copy link
Contributor Author

gregw commented Mar 1, 2022

There is now no core. Just jetty server in it's normal location.

Ultimately anything dependent on a servlet api will need to move under a jetty-eeX module. I've only done the servlet/webApps for now as that's what we should work on next week. Things like jetty-home will stay top level.

I'm not sure why you think 12.0.x is mangled? It's not been touched by this whilst i trial these ideas Ina different branch.

@joakime
Copy link
Contributor

joakime commented Mar 1, 2022

Preserving the maven coordinates for those modules that will now have servlet removed will be awkward to explain/support.

But the "compat" layers (within ee10) that we talked about at the old coordinates does make sense.

So, that means ee10/jetty-ee10-server-compat will be the replacement of the existing org.eclipse.jetty:jetty-server:12.0.0 maven coordinates.
Even if that *-compat (maven) module is merely a pom that lists the other dependencies to build up a similar purpose as before (eg: org.eclipse.jetty:jetty-server:12.0.0 lists the ee10 artifacts + core artifacts that build up a similar set of classes to use as before)

@gregw
Copy link
Contributor Author

gregw commented Mar 2, 2022

I don't see a problem with the preserved maven coordinates:

  • jetty-server is still jetty-server, so it should be at the same coordinate.
  • Something like jetty-servlet or jetty-webapp will now have common code in it, probably an abstract o.e.j.servlet.ServletHandler that has javadoc telling them that they need to use a o.e.j.eeX.servlet.ServletHandler, so in that case the preserved coordinates will both make sense and help users move to the new structure.
  • Something like apache-jsp might not have any common code in it, so it will ultimately dissappear and not be a problem

There will never be something like ee10/jetty-ee10-server-compat. There is only org.eclipse.jetty.server.Server. There is a new ee9/jetty-ee9-handler module that will adapt a new handler to the old style handlers, but it does not contain a server and the normal o.e.j.server.Server will be used, even for old style handlers. I'm not yet sure if ee10 needs this handler layer, as it will use new style handlers.... however it does need a home for the servlet state machine stuff (was HttpChannelState, but now I think @lachlan-roberts is calling it @ServletRequestState or similar).

@gregw
Copy link
Contributor Author

gregw commented Mar 2, 2022

I've now pushed the new jetty-server arch to the hackaton branch. I've been very careful to preserve unit tests, so we don't lose any goodness (many were missing in the current 12.0.x). It has been broken up as follows:

  • Jan has moved session stuff out of jetty-server to jetty-session, which will hold the common code (SessionData) that is not API dependent. Session tests should have followed
  • All the jetty-server tests from the current 12.0.x branch have been moved over and are working. There is a little strangeness with o.e.j.server.ssl as that package only has tests... which should probably move to keep JPMS happy, but I have left them where they were.
  • There are a bunch or non-servlet handlers/tests/mechanism (eg ResourceService, SecuredRedirectHandler, multipart etc.) that were missing in 12.0.x. I have kept these in the hackathon branch, although most are commented out and/or only partially ported. This will be a good hackathon excercise to update the mechanisms and their associated test.
  • Any tests in jetty-server have been removed from the matching structure in jetty-ee9/jetty-ee9-handler, so we only have them once.
  • Any servlet related tests have been removed from jetty-server but should remain in jetty-ee9/jetty-ee9-handler. These might need to be copied eventually to ee10.

So yes the build is now horribly broken. Nothing above jetty-server will build. Can't make an omlette without breaking some eggs!

Hackathon goals are to fix the disabled tests in jetty-server and to make jetty-ee9-servlet and jetty-ee10-servlet compile and work. If we get jetty-ee*-webapp compiling/working, then that is a bonus.

@joakime
Copy link
Contributor

joakime commented Mar 2, 2022

  • Something like jetty-servlet or jetty-webapp will now have common code in it, probably an abstract o.e.j.servlet.ServletHandler that has javadoc telling them that they need to use a o.e.j.eeX.servlet.ServletHandler, so in that case the preserved coordinates will both make sense and help users move to the new structure.

OK, but there's 2 things that still need to happen.
There cannot be any ee# dependency mentioned at the top level pom, or first level "old school" modules.
Only the jetty-ee#/ trees have servlet/jakarta/ee dependency mentions.

With this structure, that ALSO means /jetty-home/ and /tests/ cannot have servlet references, even transitively.

  • Something like apache-jsp might not have any common code in it, so it will ultimately dissappear and not be a problem

This is 100% ee specific, and should live in the appropriate /jetty-ee#/ tree.

@gregw
Copy link
Contributor Author

gregw commented Mar 2, 2022

OK, but there's 2 things that still need to happen. There cannot be any ee# dependency mentioned at the top level pom, or first level "old school" modules. Only the jetty-ee#/ trees have servlet/jakarta/ee dependency mentions.

Exactly

With this structure, that ALSO means /jetty-home/ and /tests/ cannot have servlet references, even transitively.

But jetty-home will still need to exist at the top level. We will still have it as our primary distribution. Ultimately ee8/ee9/ee10 become jetty modules that can be deployed into jetty-home, adding the right servlet-api in the right places.

  • Something like apache-jsp might not have any common code in it, so it will ultimately dissappear and not be a problem

This is 100% ee specific, and should live in the appropriate /jetty-ee#/ tree.

Perhaps not 100%. JuliLog is not servlet-api specific.... but it may not be worth having a common module for one little class like that.

That is why there is now an apache-ee9-jsp and an apache-ee10-jsp

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants