== Jetty 9 Module for Apache OpenWebBeans

There are two ways to use Apache OpenWebBeans with Jetty 9.
You can:

* Exclude the Apache OpenWebBeans implementation from your `.war` file, this is known as a skinny `.war`
* Include the Apache OpenWebBeans implementation in your `.war` file, this is known as a fat `.war`

=== Fat `.war`

Bundle the Apache OpenWebBeans `.jar` files in your `WEB-INF/lib`.

Add (or augment your existing) `WEB-INF/jetty-web.xml`:

[source,xml]
----
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
<Configure id="wac" class="org.eclipse.jetty.webapp.WebAppContext">
    <Call name="prependServerClass">
        <Arg>-org.eclipse.jetty.util.Decorator</Arg>
    </Call>
    <Call name="prependServerClass">
        <Arg>-org.eclipse.jetty.util.DecoratedObjectFactory</Arg>
    </Call>
    <Call name="prependServerClass">
        <Arg>-org.eclipse.jetty.server.handler.ContextHandler</Arg>
    </Call>
    <Call name="prependServerClass">
        <Arg>-org.eclipse.jetty.servlet.ServletContextHandler$Context</Arg>
    </Call>
    <Call name="prependServerClass">
        <Arg>-org.eclipse.jetty.servlet.ServletContextHandler</Arg>
    </Call>
    <Call name="prependServerClass">
        <Arg>-org.eclipse.jetty.webapp.WebAppContext</Arg>
    </Call>
    <Get id="wal" name="classLoader"/>
    <Get id="objf" name="objectFactory">
        <Call name="addDecorator">
            <Arg>
                <New class="org.apache.webbeans.web.jetty9.JettyDecorator">
                <Arg><Ref refid="wal"/></Arg>
            </New>
            </Arg>
        </Call>
    </Get>
</Configure>
----

Add the listener to your `WEB-INF/web.xml`:

[source,xml]
----
<web-app id="owb-it" version="3.0"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    ...
    <listener>
        <listener-class>org.apache.webbeans.servlet.WebBeansConfigurationListener</listener-class>
    </listener>
    ...
</web-app>
----

The resulting `.war` will run on vanilla Jetty

=== Skinny `.war`

In this case you exclude the Apache OpenWebBeans `.jar` files from your `WEB-INF/lib` and do nothing with deploytment descriptors or adding listeners.

You will need to configure your target Jetty to activate Apache OpenWebBeans.
This depends on your target Jetty.

NOTE: A regression in Jetty 9.4.13 (link:https://github.com/eclipse/jetty.project/issues/3597[#3597]) means that skinny `.war` deployments will not be able to persist session scoped context.
This regression was fixed in Jetty 9.4.18.
The recommendation is to use fat `.war` deployments if you need to use a version of Jetty with this regression.

=== Standard Jetty Deployment

Should just be a case of adding the module to your Jetty Home and then activating it.

[source,shell]
----
export JETTY_BASE=...
export JETTY_HOME=...

# Add the module to your Jetty Home
cd "${JETTY_HOME}"
curl -O https://repo1.maven.org/maven2/org/apache/openwebbeans/openwebbeans-jetty9/2.0.11/openwebbeans-jetty9-2.0.11-config.jar
unzip openwebbeans-jetty9-2.0.11-config.jar
rm openwebbeans-jetty9-2.0.11-config.jar
cd "${JETTY_BASE}"

# Add the module to your Jetty Base
java -jar "${JETTY_HOME}/start.jar" --add-to-start=apache-owb apache-owb.version=2.0.11

ALERT: There are enabled module(s) with licenses.
The following 1 module(s):
 + contains software not provided by the Eclipse Foundation!
 + contains software not covered by the Eclipse Public License!
 + has not been audited for compliance with its license

 Module: apache-owb
  + Apache OpenWebBeans is an open source project hosted by the Apache Software Foundation and released under the Apache 2.0 license.
  + https://openwebbeans.apache.org/
  + http://www.apache.org/licenses/LICENSE-2.0.html

Proceed (y/N)? y
INFO  : apache-owb      initialized in ${jetty.base}/start.ini
MKDIR : ${jetty.base}/lib/apache-owb
COPY  : .../.m2/repository/org/apache/openwebbeans/openwebbeans-spi/2.0.11/openwebbeans-spi-2.0.11.jar to ${jetty.base}/lib/apache-owb/openwebbeans-spi-2.0.11.jar
COPY  : .../.m2/repository/org/apache/openwebbeans/openwebbeans-impl/2.0.11/openwebbeans-impl-2.0.11.jar to ${jetty.base}/lib/apache-owb/openwebbeans-impl-2.0.11.jar
COPY  : .../.m2/repository/org/apache/openwebbeans/openwebbeans-web/2.0.11/openwebbeans-web-2.0.11.jar to ${jetty.base}/lib/apache-owb/openwebbeans-web-2.0.11.jar
COPY  : .../.m2/repository/org/apache/openwebbeans/openwebbeans-el22/2.0.11/openwebbeans-el22-2.0.11.jar to ${jetty.base}/lib/apache-owb/openwebbeans-el22-2.0.11.jar
COPY  : .../.m2/repository/org/apache/openwebbeans/openwebbeans-jetty9/2.0.11/openwebbeans-jetty9-2.0.11.jar to ${jetty.base}/lib/apache-owb/openwebbeans-jetty9-2.0.11.jar
COPY  : .../.m2/repository/org/apache/geronimo/specs/geronimo-jcdi_2.0_spec/1.0/geronimo-jcdi_2.0_spec-1.0.jar to ${jetty.base}/lib/apache-owb/geronimo-jcdi_2.0_spec-1.0.jar
COPY  : .../.m2/repository/org/apache/geronimo/specs/geronimo-atinject_1.0_spec/1.0/geronimo-atinject_1.0_spec-1.0.jar to ${jetty.base}/lib/apache-owb/geronimo-atinject_1.0_spec-1.0.jar
COPY  : .../.m2/repository/org/apache/geronimo/specs/geronimo-interceptor_1.2_spec/1.0/geronimo-interceptor_1.2_spec-1.0.jar to ${jetty.base}/lib/apache-owb/geronimo-interceptor_1.2_spec-1.0.jar
COPY  : .../.m2/repository/org/apache/xbean/xbean-finder-shaded/4.17/xbean-finder-shaded-4.13.jar to ${jetty.base}/lib/apache-owb/xbean-finder-shaded-4.13.jar
COPY  : .../.m2/repository/org/apache/xbean/xbean-asm9-shaded/4.17/xbean-asm9-shaded-4.13.jar to ${jetty.base}/lib/apache-owb/xbean-asm9-shaded-4.13.jar
INFO  : Base directory was modified
----

==== Jetty Embedded

Just add the `org.apache.webbeans.web.jetty9.OwbConfiguration` to your context's configuration classes e.g.

[source,java]
----
Server jetty;
WebAppContext ctx;

...

Configuration.ClassList classList = Configuration.ClassList.serverDefault(jetty);
classList.addBefore(
        "org.eclipse.jetty.webapp.JettyWebXmlConfiguration",
        "org.eclipse.jetty.annotations.AnnotationConfiguration",
        "org.apache.webbeans.web.jetty9.OwbConfiguration"
);
ctx.setConfigurationClasses(classList);
----

==== Jetty Maven Plugin

NOTE: The following only applies if if you are using a skinny `.war`

Add the dependencies to your `jetty-maven-plugin` definnition and add the `org.apache.webbeans.web.jetty9.OwbConfiguration` to your context's configuration classes.

NOTE: This will require you to specify all the configuration classes

[source,xml]
----
<plugin>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    ...
    <dependencies>
        ...
        <dependency>
            <groupId>org.apache.openwebbeans</groupId>
            <artifactId>openwebbeans-spi</artifactId>
            <version>${openwebbeans.version}/version>
        </dependency>
        <dependency>
            <groupId>org.apache.openwebbeans</groupId>
            <artifactId>openwebbeans-impl</artifactId>
            <version>${openwebbeans.version}/version>
        </dependency>
        <dependency>
            <groupId>org.apache.openwebbeans</groupId>
            <artifactId>openwebbeans-web</artifactId>
            <version>${openwebbeans.version}/version>
        </dependency>
        <dependency>
            <groupId>org.apache.openwebbeans</groupId>
            <artifactId>openwebbeans-jetty9</artifactId>
            <version>${openwebbeans.version}/version>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-jcdi_2.0_spec</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-atinject_1.0_spec</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-interceptor_1.2_spec</artifactId>
            <version>1.0</version>
        </dependency>
        ...
    </dependencies>
    ...
    <configuration>
        ...
        <webApp>
            ...
            <configurationClasses>
                <configurationClass>org.eclipse.jetty.maven.plugin.MavenWebInfConfiguration</configurationClass>
                <configurationClass>org.eclipse.jetty.webapp.WebXmlConfiguration</configurationClass>
                <configurationClass>org.eclipse.jetty.webapp.MetaInfConfiguration</configurationClass>
                <configurationClass>org.eclipse.jetty.webapp.FragmentConfiguration</configurationClass>
                <configurationClass>org.eclipse.jetty.plus.webapp.EnvConfiguration</configurationClass>
                <configurationClass>org.eclipse.jetty.plus.webapp.PlusConfiguration</configurationClass>
                <configurationClass>org.eclipse.jetty.annotations.AnnotationConfiguration</configurationClass>
                <configurationClass>org.apache.webbeans.web.jetty9.OwbConfiguration</configurationClass>
                <configurationClass>org.eclipse.jetty.webapp.JettyWebXmlConfiguration</configurationClass>
            </configurationClasses>
            ...
        </webApp>
        ...
    </configuration>
</plugin>
----
