= TomEE Embedded | |
:jbake-date: 2016-03-16 | |
:jbake-type: page | |
:jbake-status: published | |
:jbake-tomeepdf: | |
TomEE Embedded is based on Tomcat embedded and starts a real TomEE in the launching JVM. It is also | |
able to deploy the classpath as a webapp and to use either `META-INF/resources` or a folder as web resources. | |
Here is a basic programmatic usage based on `org.apache.tomee.embedded.Container` class: | |
[source,java] | |
---- | |
try (final Container container = new Container(new Configuration()).deployClasspathAsWebApp()) { | |
System.out.println("Started on http://localhost:" + container.getConfiguration().getHttpPort()); | |
// do something or wait until the end of the application | |
} | |
---- | |
All EE features are then accessible directly in the same JVM. | |
== TomEE Embedded Configuration | |
The default configuration allows to start tomee without issue but you can desire to customize some of them. | |
[.table.table-bordered,options="header"] | |
|=== | |
| Name | Default | Description | |
|httpPort | 8080| http port | |
|stopPort | 8005| shutdown port | |
|host |localhost| host | |
|dir|-|where to create a file hierarchy for tomee (conf, temp, ...) | |
|serverXml|-|which server.xml to use | |
|keepServerXmlAsThis|false|don't adjust ports/host from the configuration and keep the ones in server.xml | |
|properties|-|container properties | |
|quickSession | true|use Random instead of SecureRandom (for dev) | |
|skipHttp|false|don't use the http connector | |
|httpsPort | 8443|https potr | |
|ssl|false| activate https | |
|withEjbRemote|false|use EJBd | |
|keystoreFile|-|https keystore location | |
|keystorePass|-|https keystore password | |
|keystoreType |JKS|https keystore type | |
|clientAuth|-|https client auth | |
|keyAlias|-|https alias | |
|sslProtocol|-|SSL protocol for https connector | |
|webXml|-|default web.xml to use | |
|loginConfig|-|which LoginConfig to use, relies on `org.apache.tomee.embedded.LoginConfigBuilder` to create it | |
|securityConstraints|-|add some security constraints, use `org.apache.tomee.embedded.SecurityConstaintBuilder` to build them | |
|realm|-|which realm to use (useful to switch to `JAASRealm` for instance) without modifying the application | |
|deployOpenEjbApp|false|should internal openejb application be delpoyed | |
|users|-|a map of user/password | |
|roles|-|a map of role/users | |
|tempDir|${java.io.tmpdir}/tomee-embedded_${timestamp}|tomcat needs a docBase, in case you don't provide one one will be created there | |
|webResourceCached |true|should web resources be cached by tomcat (set false in frontend dev) | |
|configuration-location|-|location (classpath or file) to a .properties to configure the server | |
[pre-task|-|Runnable or org.apache.tomee.embedded.LifecycleTask implementations to execute before the container starts | |
|classes-filter|-|implementation of a custom xbean Filter to ignore not desired classes during scanning | |
|basic|-|set /* under BASIC authentication for the realm "Security", authentication role being "*" | |
|=== | |
Note: passing to `Container` constructor a `Configuration` it will start the container automatically but using `setup(Configuration)` | |
to initialize the configuration you will need to call `start()`. | |
You can also pass through the properties `connector.xxx` and `connector.attributes.xxx` to customize connector(s) | |
configuration directly. | |
== Standalone applications or TomEE Embedded provided main(String[]) | |
Deploying an application in a server is very nice cause the application is generally small and it allows to update the | |
container without touching the application (typically insanely important in case of security issues for instance). | |
However sometimes you don't have the choice so TomEE Embedded provides a built-in `main(String[])`. Here are its options: | |
NOTE: this is still a TomEE so all system properties work (for instance to create a resource). | |
[.table.table-bordered,options="header"] | |
|=== | |
|Name|Default|Description | |
|--path|-|location of application(s) to deploy | |
|--context|-|Context name for applications (same order than paths) | |
|-p or --port|8080|http port | |
|-s or --shutdown|8005|shutdown port | |
|-d or --directory|./.apache-tomee|tomee work directory | |
|-c or --as-war|-|deploy classpath as a war | |
|-b or --doc-base|-|where web resources are for classpath deployment | |
|--renaming|-|for fat war only, is renaming of the context supported | |
|--serverxml|-|the server.xml location | |
|--tomeexml|-|the server.xml location | |
|--property|-|a list of container properties (values follow the format x=y) | |
|=== | |
Note that since 7.0.0 TomEE provides 3 flavors (qualifier) of tomee-embedded as fat jars: | |
- uber (where we put all request features by users, this is likely the most complete and the biggest) | |
- jaxrs: webprofile minus JSF | |
- jaxws: webprofile plus JAX-WS | |
These different uber jars are interesting in mainly 2 cases: | |
- you do a war shade (it avoids to list a bunch of dependencies but still get a customized version) | |
- you run your application using `--path` option | |
NOTE: if you already do a custom shade/fatjar this is not really impacting since you can depend on `tomee-embedded` and exclude/include what you want. | |
== FatApp a shortcut main | |
`FatApp` main (same package as tomee embedded `Main`) just wraps the default main ensuring: | |
- ̀`--as-war` is used | |
- ̀`--single-classloader` is used | |
- `--configuration-location=tomee-embedded.properties` is set if `tomee-embedded.properties` is found in the classpath | |
== configuration-location | |
`--configuration-location` option allows to simplify the configuration of tomee embedded through properties. | |
Here are the recognized entries (they match the configuration, see org.apache.tomee.embedded.Configuration for the detail): | |
|=== | |
|Name| | |
|http| | |
|https| | |
|stop| | |
|host| | |
|dir| | |
|serverXml| | |
|keepServerXmlAsThis| | |
|quickSession| | |
|skipHttp| | |
|ssl| | |
|http2| | |
|webResourceCached| | |
|withEjbRemote| | |
|deployOpenEjbApp| | |
|keystoreFile| | |
|keystorePass| | |
|keystoreType| | |
|clientAuth| | |
|keyAlias| | |
|sslProtocol| | |
|webXml| | |
|tempDir| | |
|classesFilter| | |
|conf| | |
|properties.x (set container properties x with the associated value)| | |
|users.x (for default in memory realm add the user x with its password - the value)| | |
|roles.x (for default in memory realm add the role x with its comma separated users - the value)| | |
|connector.x (set the property x on the connector)| | |
|realm=fullyqualifiedname,realm.prop=xxx (define a custom realm with its configuration)| | |
|login=,login.prop=xxx (define a org.apache.tomee.embedded.LoginConfigBuilder == define a LoginConfig)| | |
|securityConstraint=,securityConstraint.prop=xxx (define a org.apache.tomee.embedded.SecurityConstaintBuilder == define webapp security)| | |
|configurationCustomizer.alias=,configurationCustomizer.alias.class=class,configurationCustomizer.alias.prop=xxx (define a ConfigurationCustomizer)| | |
|=== | |
Here is a sample to add BASIC security on `/api/*`: | |
[source] | |
---- | |
# security configuration | |
securityConstraint = | |
securityConstraint.authConstraint = true | |
securityConstraint.authRole = ** | |
securityConstraint.collection = api:/api/* | |
login = | |
login.realmName = app | |
login.authMethod = BASIC | |
realm = org.apache.catalina.realm.JAASRealm | |
realm.appName = app | |
properties.java.security.auth.login.config = configuration/login.jaas | |
---- | |
And here a configuration to exclude jackson packages from scanning and use log4j2 as main logger (needs it as dependency): | |
[source] | |
---- | |
properties.openejb.log.factory = log4j2 | |
properties.openejb.container.additional.include = com.fasterxml.jackson,org.apache.logging.log4j | |
---- | |
== Application Runner | |
SInce TomEE 7.0.2, TomEE provide a light ApplicationComposer integration for TomEE Embedded (all features are not yet supported but the main ones are): | |
`org.apache.tomee.embedded.TomEEEmbeddedApplicationRunner`. It relies on the definition of an `@Application`: | |
[source,java] | |
---- | |
@Application | |
@Classes(context = "app") | |
@ContainerProperties(@ContainerProperties.Property(name = "t", value = "set")) | |
@TomEEEmbeddedApplicationRunner.LifecycleTasks(MyTask.class) // can start a ftp/sftp/elasticsearch/mongo/... server before tomee | |
@TomEEEmbeddedApplicationRunner.Configurers(SetMyProperty.class) | |
public class TheApp { | |
@RandomPort("http") | |
private int port; | |
@RandomPort("http") | |
private URL base; | |
@org.apache.openejb.testing.Configuration | |
public Properties add() { | |
return new PropertiesBuilder().p("programmatic", "property").build(); | |
} | |
@PostConstruct | |
public void appStarted() { | |
// ... | |
} | |
} | |
---- | |
Then just start it with: | |
[source,java] | |
---- | |
TomEEEmbeddedApplicationRunner.run(TheApp.class, "some arg1", "other arg"); | |
---- | |
TIP: `@Classes(values)` and `@Jars` are supported too which can avoid a huge scanning if you run with a lot of not CDI dependencies which would boost the startup of your application. |