blob: ed401f2db48d9854c2927f197b24fc722287400c [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Apache TomEE</title>
<meta name="description"
content="Apache TomEE is a lightweight, yet powerful, JavaEE Application server with feature rich tooling." />
<meta name="keywords" content="tomee,asf,apache,javaee,jee,shade,embedded,test,junit,applicationcomposer,maven,arquillian" />
<meta name="author" content="Luka Cvetinovic for Codrops" />
<link rel="icon" href="../../../favicon.ico">
<link rel="icon" type="image/png" href="../../../favicon.png">
<meta name="msapplication-TileColor" content="#80287a">
<meta name="theme-color" content="#80287a">
<link rel="stylesheet" type="text/css" href="../../../css/normalize.css">
<link rel="stylesheet" type="text/css" href="../../../css/bootstrap.css">
<link rel="stylesheet" type="text/css" href="../../../css/owl.css">
<link rel="stylesheet" type="text/css" href="../../../css/animate.css">
<link rel="stylesheet" type="text/css" href="../../../fonts/font-awesome-4.1.0/css/font-awesome.min.css">
<link rel="stylesheet" type="text/css" href="../../../fonts/eleganticons/et-icons.css">
<link rel="stylesheet" type="text/css" href="../../../css/jqtree.css">
<link rel="stylesheet" type="text/css" href="../../../css/idea.css">
<link rel="stylesheet" type="text/css" href="../../../css/cardio.css">
<script type="text/javascript">
<!-- Matomo -->
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
/* We explicitly disable cookie tracking to avoid privacy issues */
_paq.push(['disableCookies']);
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function () {
var u = "//matomo.privacy.apache.org/";
_paq.push(['setTrackerUrl', u + 'matomo.php']);
_paq.push(['setSiteId', '5']);
var d = document, g = d.createElement('script'), s = d.getElementsByTagName('script')[0];
g.async = true;
g.src = u + 'matomo.js';
s.parentNode.insertBefore(g, s);
})();
<!-- End Matomo Code -->
</script>
</head>
<body>
<div class="preloader">
<img src="../../../img/loader.gif" alt="Preloader image">
</div>
<nav class="navbar">
<div class="container">
<div class="row"> <div class="col-md-12">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/" title="Apache TomEE">
<span>
<img
src="../../../img/apache_tomee-logo.svg"
onerror="this.src='../../../img/apache_tomee-logo.jpg'"
height="50"
>
</span>
</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav navbar-right main-nav">
<li><a href="../../../docs.html">Documentation</a></li>
<li><a href="../../../community/index.html">Community</a></li>
<li><a href="../../../security/security.html">Security</a></li>
<li><a class="btn btn-accent accent-orange no-shadow" href="../../../download.html">Downloads</a></li>
</ul>
</div>
<!-- /.navbar-collapse -->
</div></div>
</div>
<!-- /.container-fluid -->
</nav>
<div id="main-block" class="container main-block">
<div class="row title">
<div class="col-md-12">
<div class='page-header'>
<h1>Serverless Builder API</h1>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>A API <code>Server.Builder</code> permite que você construa uma instância embutida(embedded) ou sem servidor(serverless) de Tomcat/TomEE dentro da sua JVM, efetivamente executando Tomcat/TomEE como uma biblioteca simples.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">import org.apache.tomee.bootstrap.Server;
public class Main {
public static void main(String[] args) {
final Server server = Server.builder().build();
System.out.println("Listening for requests at " + server.getURI());
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>O design da API pode ser melhor descrito como uma API de construtor funcional (FBA) e permite efetivamente fornecer funções e referências de método que realmente auxiliam no processo de construção do servidor. É por meio dessas funções que você pode implantar aplicativos, modificar configurações e executar com eficácia qualquer código de que você precisa para ajudar a preparar a instância do servidor.</p>
</div>
<div class="paragraph">
<p>Uma visão geral de alto nível dos métodos builder disponíveis após chamar <code>Server.builder ()</code> são os seguintes:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">public static class Builder
public Builder httpPort(final int port)
public Builder ajpPort(final int port)
public Builder add(final String name, final byte[] bytes)
public Builder add(final String name, final Supplier&lt;byte[]&gt; content)
public Builder add(final String name, final String content)
public Builder add(final String name, final File content)
public Builder add(final String name, final Archive contents)
public Builder home(final Consumer&lt;File&gt; customization)
public Builder and(final Consumer&lt;Builder&gt; consumer)
public Server build()</code></pre>
</div>
</div>
<div class="paragraph">
<p>Para realmente saber como usar a API, primeiramente devemos entender os conceitos <code>catalina.home</code> e <code>catalina.base</code> do Tomcat e o que realmente acontece quando chamamos <code>Server.builder().Build()</code>.</p>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_compreendendo_a_home_e_base_do_tomcat">Compreendendo a home e base do Tomcat</h3>
<div class="paragraph">
<p>É um fato pouco conhecido que por décadas o Tomcat teve a capacidade de executar várias instâncias a partir de um único zip do Tomcat. O Tomcat usa uma variável <code>catalina.home</code> para identificar a localização do zip extraído onde as bibliotecas do servidor podem ser encontradas e um <code>catalina.base</code> por instância para definir a localização dos arquivos de configuração, arquivos de log e aplicativos da web dessa instância.</p>
</div>
<div class="paragraph">
<p>Em nossa situação, seu classpath JVM é efetivamente o <code>catalina.home</code> e quando usamos a API do <code>Server</code> estamos criando um <code>catalina.base</code> muito fino que contém os arquivos de configuração, arquivos de log e webapps para essa instância de servidor construído (Tomcat). Se você usar a API <code>Server</code> dez vezes na mesma JVM, terá 10 diretórios ` catalina.base`. No entanto, eles são considerados locais de trabalho temporários e serão excluídos na saída da JVM.</p>
</div>
</div>
<div class="sect2">
<h3 id="_chamando_o_server_builder_build">Chamando o <code>Server.builder().build()</code></h3>
<div class="paragraph">
<p>Quando o método <code>build()</code> do <code>Server.Builder</code> é chamado, as seguintes ações são realizadas nesta ordem:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Quaisquer funções adicionadas via <code>and(final Consumer&lt;Builder&gt; consumer)</code> são executadas. Isso permite que seja fornecida uma função que modifique ainda mais o construtor antes de qualquer construção ser executada. Várias modificações do construtor podem ser agrupadas em uma função que as instala todas.</p>
</li>
<li>
<p>É criado um diretório temporário que servirá como <code>catalina.home</code> e <code>catalina.base</code> e as configurações padrão como <code>server.xml</code>,<code>logging.properties</code> e <code>tomee.xml</code> são copiadas.</p>
</li>
<li>
<p>AQuaisquer funções adicionadas por meio de <code>add(final String destinationPath, final Supplier&lt;byte[]&gt; content)</code> são executadas e quaisquer bytes fornecidos, Strings ou Arquivos são gravados em <code>destinationPath</code> dentro do diretório temporário. Isso permite que as configurações padrão como <code>server.xml</code> sejam sobrescritas ou aplicativos sejam escritos no diretório <code>webapps/</code>.</p>
</li>
<li>
<p>As portas são definidas modificando-se <code>conf/server.xml</code>. Se <code>httpPort</code> não foi definido, as portas serão aleatórias.</p>
</li>
<li>
<p>Todas as funções adicionadas via <code>home(final Consumer&lt;File&gt; customization)</code> são executadas. O diretório temporário será fornecido como o valor de <code>File</code>.</p>
</li>
<li>
<p>A instância Tomcat/TomEE é iniciada e retornada como uma instância de <code>Server</code>.</p>
</li>
</ol>
</div>
</div>
<div class="sect2">
<h3 id="_vendo_o_resultado_de_server_builder_build">Vendo o resultado de <code>Server.builder().Build()</code></h3>
<div class="paragraph">
<p>Ajuda muito poder ver o que foi construído. Podemos fazer isso instalando uma referência de função ou método como mostrada abaixo.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">import org.apache.tomee.bootstrap.Server;
import java.io.File;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.stream.Stream;
public class Main {
public static void main(String[] args) {
Server.builder()
.home(Main::list)
.build();
}
private static void list(final File home) {
try {
Files.walk(home.toPath())
.sorted()
.forEach(System.out::println);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Quando o executamos, devemos ver uma saída semelhante a esta:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-console" data-lang="console">/var/folders/bd/f9ntqy1m8xj_fs006s6crtjh0000gn/T/temp9107162877421339516dir/apache-tomee
/var/folders/bd/f9ntqy1m8xj_fs006s6crtjh0000gn/T/temp9107162877421339516dir/apache-tomee/conf
/var/folders/bd/f9ntqy1m8xj_fs006s6crtjh0000gn/T/temp9107162877421339516dir/apache-tomee/conf/catalina.policy
/var/folders/bd/f9ntqy1m8xj_fs006s6crtjh0000gn/T/temp9107162877421339516dir/apache-tomee/conf/catalina.properties
/var/folders/bd/f9ntqy1m8xj_fs006s6crtjh0000gn/T/temp9107162877421339516dir/apache-tomee/conf/context.xml
/var/folders/bd/f9ntqy1m8xj_fs006s6crtjh0000gn/T/temp9107162877421339516dir/apache-tomee/conf/jaspic-providers.xml
/var/folders/bd/f9ntqy1m8xj_fs006s6crtjh0000gn/T/temp9107162877421339516dir/apache-tomee/conf/jaspic-providers.xsd
/var/folders/bd/f9ntqy1m8xj_fs006s6crtjh0000gn/T/temp9107162877421339516dir/apache-tomee/conf/logging.properties
/var/folders/bd/f9ntqy1m8xj_fs006s6crtjh0000gn/T/temp9107162877421339516dir/apache-tomee/conf/server.xml
/var/folders/bd/f9ntqy1m8xj_fs006s6crtjh0000gn/T/temp9107162877421339516dir/apache-tomee/conf/system.properties
/var/folders/bd/f9ntqy1m8xj_fs006s6crtjh0000gn/T/temp9107162877421339516dir/apache-tomee/conf/tomcat-users.xml
/var/folders/bd/f9ntqy1m8xj_fs006s6crtjh0000gn/T/temp9107162877421339516dir/apache-tomee/conf/tomcat-users.xsd
/var/folders/bd/f9ntqy1m8xj_fs006s6crtjh0000gn/T/temp9107162877421339516dir/apache-tomee/conf/tomee.xml
/var/folders/bd/f9ntqy1m8xj_fs006s6crtjh0000gn/T/temp9107162877421339516dir/apache-tomee/conf/web.xml
/var/folders/bd/f9ntqy1m8xj_fs006s6crtjh0000gn/T/temp9107162877421339516dir/apache-tomee/logs
/var/folders/bd/f9ntqy1m8xj_fs006s6crtjh0000gn/T/temp9107162877421339516dir/apache-tomee/webapps</code></pre>
</div>
</div>
<div class="paragraph">
<p>O acima representa o que sai da caixa ao chamar <code>Server.builder().Build()</code> sem modificações.</p>
</div>
</div>
<div class="sect1">
<h2 id="_criação_de_aplicativos_com_archive">Criação de aplicativos com <code>Archive</code></h2>
<div class="sectionbody">
<div class="paragraph">
<p>A segunda classe a aprender é <code>Archive</code> e é essencialmente um construtor de aplicativos simples. Com essa abordagem, todas as suas classes já estão efetivamente no classpath e visíveis, portanto, em última análise, as únicas classes que precisam ser incluídas são Servlets anotados, EJBs, CDI Beans, classes JAX-RS, etc.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">public class Archive
public static Archive archive()
public Archive manifest(final String key, final Object value)
public Archive manifest(final String key, final Class value)
public Archive add(final String name, final byte[] bytes)
public Archive add(final String name, final Supplier&lt;byte[]&gt; content)
public Archive add(final String name, final String content)
public Archive add(final String name, final File content)
public Archive add(final String name, final Archive archive)
public Archive add(final String name, final URL content)
public Archive add(final Class&lt;?&gt; clazz)
public Archive addDir(final File dir)
public Archive addJar(final File file)
public File toJar()
public File toJar(final File file)
public File toDir()
public void toDir(final File dir)</code></pre>
</div>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
Você pode usar APIs como ShrinkWrap para construir os jars e arquivos war como uma alternativa para <code>Archive</code>. Qualquer coisa que possa produzir um arquivo jar, um arquivo war ou uma estrutura de diretório war explodida (descompactada) funcionará.
</td>
</tr>
</table>
</div>
<div class="sect2">
<h3 id="_creating_a_root_war">Creating a ROOT war</h3>
<div class="paragraph">
<p>Neste exemplo, estamos efetivamente adicionando três classes a um <code>Archive</code> que é adicionado a um novo diretório <code>webapps/ROOT/WEB-INF/classes</code>.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">import org.apache.tomee.bootstrap.Archive;
import org.apache.tomee.bootstrap.Server;
import java.io.File;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.file.Files;
public class Main {
public static void main(String[] args) {
final Server server = Server.builder()
.add("webapps/ROOT/WEB-INF/classes", Archive.archive()
.add(Api.class)
.add(Movie.class)
.add(MovieService.class))
.home(Main::list)
.build();
System.out.println("Listening for requests at " + server.getURI());
}
private static void list(final File home) {
try {
Files.walk(home.toPath())
.map(Path::toFile)
.filter(File::isFile)
.map(File::getAbsolutePath)
.map(s -&gt; "..." + s.substring(49))
.sorted()
.forEach(System.out::println);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Quando isso for executado, veremos o método <code>Main.list</code>, que é executado logo antes do início do servidor, imprimirá o seguinte:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-console" data-lang="console">...temp710654453954858189dir/apache-tomee/conf/catalina.policy
...temp710654453954858189dir/apache-tomee/conf/catalina.properties
...temp710654453954858189dir/apache-tomee/conf/context.xml
...temp710654453954858189dir/apache-tomee/conf/jaspic-providers.xml
...temp710654453954858189dir/apache-tomee/conf/jaspic-providers.xsd
...temp710654453954858189dir/apache-tomee/conf/logging.properties
...temp710654453954858189dir/apache-tomee/conf/server.xml
...temp710654453954858189dir/apache-tomee/conf/system.properties
...temp710654453954858189dir/apache-tomee/conf/tomcat-users.xml
...temp710654453954858189dir/apache-tomee/conf/tomcat-users.xsd
...temp710654453954858189dir/apache-tomee/conf/tomee.xml
...temp710654453954858189dir/apache-tomee/conf/web.xml
...temp710654453954858189dir/apache-tomee/webapps/ROOT/WEB-INF/classes/org/superbiz/movie/Api.class
...temp710654453954858189dir/apache-tomee/webapps/ROOT/WEB-INF/classes/org/superbiz/movie/Movie.class
...temp710654453954858189dir/apache-tomee/webapps/ROOT/WEB-INF/classes/org/superbiz/movie/MovieService.class</code></pre>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_apis_used">APIs Used</h2>
<div class="sectionbody">
<div class="ulist">
<ul>
<li>
<p><a href="../../../tomee-9.0/javadoc/org/apache/tomee/bootstrap/Archive.html">org.apache.tomee.bootstrap.Archive</a></p>
</li>
<li>
<p><a href="../../../tomee-9.0/javadoc/org/apache/tomee/bootstrap/Server.html">org.apache.tomee.bootstrap.Server</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/annotation/PostConstruct.html">jakarta.annotation.PostConstruct</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/ws/rs/ApplicationPath.html">jakarta.ws.rs.ApplicationPath</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/ws/rs/Consumes.html">jakarta.ws.rs.Consumes</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/ws/rs/GET.html">jakarta.ws.rs.GET</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/ws/rs/POST.html">jakarta.ws.rs.POST</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/ws/rs/Path.html">jakarta.ws.rs.Path</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/ws/rs/Produces.html">jakarta.ws.rs.Produces</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/ws/rs/client/ClientBuilder.html">jakarta.ws.rs.client.ClientBuilder</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/ws/rs/client/Entity.html">jakarta.ws.rs.client.Entity</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/ws/rs/client/WebTarget.html">jakarta.ws.rs.client.WebTarget</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/ws/rs/core/Application.html">jakarta.ws.rs.core.Application</a></p>
</li>
<li>
<p><a href="../../../jakartaee-10.0/javadoc/jakarta/ws/rs/core/MediaType.html">jakarta.ws.rs.core.MediaType</a></p>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
<div style="margin-bottom: 30px;"></div>
<footer>
<div class="container">
<div class="row">
<div class="col-sm-6 text-center-mobile">
<h3 class="white">Be simple. Be certified. Be Tomcat.</h3>
<h5 class="light regular light-white">"A good application in a good server"</h5>
<ul class="social-footer">
<li><a href="https://www.facebook.com/ApacheTomEE/"><i class="fa fa-facebook"></i></a></li>
<li><a href="https://twitter.com/apachetomee"><i class="fa fa-twitter"></i></a></li>
</ul>
<h5 class="light regular light-white">
<a href="../../../privacy-policy.html" class="white">Privacy Policy</a>
</h5>
</div>
<div class="col-sm-6 text-center-mobile">
<div class="row opening-hours">
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../../latest/docs/" class="white">Documentation</a></h5>
<ul class="list-unstyled">
<li><a href="../../../latest/docs/admin/configuration/index.html" class="regular light-white">How to configure</a></li>
<li><a href="../../../latest/docs/admin/file-layout.html" class="regular light-white">Dir. Structure</a></li>
<li><a href="../../../latest/docs/developer/testing/index.html" class="regular light-white">Testing</a></li>
<li><a href="../../../latest/docs/admin/cluster/index.html" class="regular light-white">Clustering</a></li>
</ul>
</div>
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../../latest/examples/" class="white">Examples</a></h5>
<ul class="list-unstyled">
<li><a href="../../../latest/examples/simple-cdi-interceptor.html" class="regular light-white">CDI Interceptor</a></li>
<li><a href="../../../latest/examples/rest-cdi.html" class="regular light-white">REST with CDI</a></li>
<li><a href="../../../latest/examples/ejb-examples.html" class="regular light-white">EJB</a></li>
<li><a href="../../../latest/examples/jsf-managedBean-and-ejb.html" class="regular light-white">JSF</a></li>
</ul>
</div>
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../../community/index.html" class="white">Community</a></h5>
<ul class="list-unstyled">
<li><a href="../../../community/contributors.html" class="regular light-white">Contributors</a></li>
<li><a href="../../../community/social.html" class="regular light-white">Social</a></li>
<li><a href="../../../community/sources.html" class="regular light-white">Sources</a></li>
</ul>
</div>
<div class="col-sm-3 text-center-mobile">
<h5><a href="../../../security/index.html" class="white">Security</a></h5>
<ul class="list-unstyled">
<li><a href="https://apache.org/security" target="_blank" class="regular light-white">Apache Security</a></li>
<li><a href="https://apache.org/security/projects.html" target="_blank" class="regular light-white">Security Projects</a></li>
<li><a href="https://cve.mitre.org" target="_blank" class="regular light-white">CVE</a></li>
</ul>
</div>
</div>
</div>
</div>
<div class="row bottom-footer text-center-mobile">
<div class="col-sm-12 light-white">
<p>Copyright &copy; 1999-2022 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. Apache TomEE, TomEE, Apache, the Apache feather logo, and the Apache TomEE project logo are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.</p>
</div>
</div>
</div>
</footer>
<!-- Holder for mobile navigation -->
<div class="mobile-nav">
<ul>
<li><a hef="../../../latest/docs/admin/index.html">Administrators</a>
<li><a hef="../../../latest/docs/developer/index.html">Developers</a>
<li><a hef="../../../latest/docs/advanced/index.html">Advanced</a>
<li><a hef="../../../community/index.html">Community</a>
</ul>
<a href="#" class="close-link"><i class="arrow_up"></i></a>
</div>
<!-- Scripts -->
<script src="../../../js/jquery-1.11.1.min.js"></script>
<script src="../../../js/owl.carousel.min.js"></script>
<script src="../../../js/bootstrap.min.js"></script>
<script src="../../../js/wow.min.js"></script>
<script src="../../../js/typewriter.js"></script>
<script src="../../../js/jquery.onepagenav.js"></script>
<script src="../../../js/tree.jquery.js"></script>
<script src="../../../js/highlight.pack.js"></script>
<script src="../../../js/main.js"></script>
</body>
</html>