blob: 2098a25a6ee2e74b2d37734646ac4266c74cd71c [file] [log] [blame]
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- Generated by Apache Maven Doxia at 2021-11-12 -->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Apache James Project &#x2013; Apache James Server 3 - Extend James</title>
<style type="text/css" media="all">
@import url("../css/james.css");
@import url("../css/maven-base.css");
@import url("../css/maven-theme.css");
@import url("../css/site.css");
@import url("../js/jquery/css/custom-theme/jquery-ui-1.8.5.custom.css");
@import url("../js/jquery/css/print.css");
@import url("../js/fancybox/jquery.fancybox-1.3.4.css");
</style>
<script type="text/javascript" src="../js/jquery/js/jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="../js/jquery/js/jquery-ui-1.8.5.custom.min.js"></script>
<script type="text/javascript" src="../js/fancybox/jquery.fancybox-1.3.4.js"></script>
<link rel="stylesheet" href="../css/print.css" type="text/css" media="print" />
<meta name="Date-Revision-yyyymmdd" content="20211112" />
<meta http-equiv="Content-Language" content="en" />
<script type="text/javascript" src="./js/dev-extend.js"></script>
<!-- Google Analytics -->
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-1384591-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script').item(0); s.parentNode.insertBefore(ga, s);
})();
</script>
</head>
<body class="composite">
<div id="banner">
<a href="../index.html" id="bannerLeft" title="james-logo.png">
<img src="../images/logos/james-logo.png" alt="James Project" />
</a>
<a href="https://www.apache.org/index.html" id="bannerRight">
<img src="images/logos/asf_logo_small.png" alt="The Apache Software Foundation" />
</a>
<div class="clear">
<hr/>
</div>
</div>
<div id="breadcrumbs">
<div class="xleft">
<span id="publishDate">Last Published: 2021-11-12</span>
</div>
<div class="xright"> <a href="../index.html" title="Home">Home</a>
|
<a href="../documentation.html" title="James">James</a>
|
<a href="../mime4j/index.html" title="Mime4J">Mime4J</a>
|
<a href="../jsieve/index.html" title="jSieve">jSieve</a>
|
<a href="../jspf/index.html" title="jSPF">jSPF</a>
|
<a href="../jdkim/index.html" title="jDKIM">jDKIM</a>
</div>
<div class="clear">
<hr/>
</div>
</div>
<div id="leftColumn">
<div id="navcolumn">
<h5>James components</h5>
<ul>
<li class="collapsed">
<a href="../documentation.html" title="About James">About James</a>
</li>
<li class="expanded">
<a href="../server/index.html" title="Server">Server</a>
<ul>
<li class="none">
<a href="../server/advantages.html" title="Advantages">Advantages</a>
</li>
<li class="none">
<a href="../server/objectives.html" title="Objectives">Objectives</a>
</li>
<li class="expanded">
<a href="../server/quick-start.html" title="User Manual">User Manual</a>
<ul>
<li class="collapsed">
<a href="../server/features.html" title="1. Features">1. Features</a>
</li>
<li class="none">
<a href="../server/packaging.html" title="2. Packaging">2. Packaging</a>
</li>
<li class="collapsed">
<a href="../server/install.html" title="3. Install James">3. Install James</a>
</li>
<li class="collapsed">
<a href="../server/config.html" title="4. Configure James">4. Configure James</a>
</li>
<li class="collapsed">
<a href="../server/manage.html" title="5. Manage">5. Manage</a>
</li>
<li class="collapsed">
<a href="../server/monitor.html" title="6. Monitor">6. Monitor</a>
</li>
<li class="collapsed">
<a href="../server/upgrade.html" title="7. Upgrade">7. Upgrade</a>
</li>
<li class="expanded">
<a href="../server/dev.html" title="8. Developers Corner">8. Developers Corner</a>
<ul>
<li class="none">
<a href="../server/dev-build.html" title="Build from source">Build from source</a>
</li>
<li class="none">
<a href="../server/dev-database-schema.html" title="Database Schema">Database Schema</a>
</li>
<li class="expanded">
<strong>Develop Extensions</strong>
<ul>
<li class="none">
<a href="../server/dev-extend-mailet.html" title="Mailet">Mailet</a>
</li>
<li class="none">
<a href="../server/dev-extend-matcher.html" title="Matcher">Matcher</a>
</li>
<li class="none">
<a href="../server/dev-extend-smtp-hook.html" title="SMTP Hook">SMTP Hook</a>
</li>
</ul>
</li>
<li class="collapsed">
<a href="../server/dev-provided.html" title="Provided Extensions">Provided Extensions</a>
</li>
</ul>
</li>
</ul>
</li>
<li class="none">
<a href="../mail.html#James_Mailing_lists" title="Mailing Lists">Mailing Lists</a>
</li>
<li class="none">
<a href="../server/release-notes.html" title="Release Notes">Release Notes</a>
</li>
<li class="none">
<a href="../server/apidocs/index.html" title="Javadoc">Javadoc</a>
</li>
<li class="none">
<a href="https://issues.apache.org/jira/browse/JAMES" title="Issue Tracker">Issue Tracker</a>
</li>
<li class="none">
<a href="https://github.com/apache/james-project" title="Sources">Sources</a>
</li>
<li class="none">
<a href="../server/rfcs.html" title="RFCs">RFCs</a>
</li>
<li class="none">
<a href="../download.cgi#Apache_James_Server" title="Download releases">Download releases</a>
</li>
</ul>
</li>
<li class="collapsed">
<a href="../mailet/index.html" title="Mailets">Mailets</a>
</li>
<li class="collapsed">
<a href="../mailbox/index.html" title="Mailbox">Mailbox</a>
</li>
<li class="collapsed">
<a href="../protocols/index.html" title="Protocols">Protocols</a>
</li>
<li class="collapsed">
<a href="../mpt/index.html" title="MPT">MPT</a>
</li>
</ul>
<h5>Apache Software Foundation</h5>
<ul>
<li>
<strong>
<a title="ASF" href="http://www.apache.org/">ASF</a>
</strong>
</li>
<li>
<a title="Get Involved" href="http://www.apache.org/foundation/getinvolved.html">Get Involved</a>
</li>
<li>
<a title="FAQ" href="http://www.apache.org/foundation/faq.html">FAQ</a>
</li>
<li>
<a title="License" href="http://www.apache.org/licenses/" >License</a>
</li>
<li>
<a title="Sponsorship" href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a>
</li>
<li>
<a title="Thanks" href="http://www.apache.org/foundation/thanks.html">Thanks</a>
</li>
<li>
<a title="Security" href="http://www.apache.org/security/">Security</a>
</li>
</ul>
<a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy">
<img class="poweredBy" alt="Built by Maven" src="../images/logos/maven-feather.png" />
</a>
</div>
</div>
<div id="bodyColumn">
<div id="contentBox">
<section>
<h2><a name="Extend_James"></a>Extend James</h2>
<section>
<h3><a name="Custom_Mailet"></a>Custom Mailet</h3>
<p>See the <a href="dev-extend-mailet.html">mailet</a> page for more information.</p>
</section>
<section>
<h3><a name="Custom_Matcher"></a>Custom Matcher</h3>
<p>See the <a href="dev-extend-mailet.html">matcher</a> page for more information.</p>
</section>
<section>
<h3><a name="SMTP_Hook"></a>SMTP Hook</h3>
<p>See the <a href="dev-extend-hook-smtp.html">SMTP Hook</a> page for more information.</p>
</section>
<section>
<h3><a name="Mailbox_Store"></a>Mailbox Store</h3>
<p>See the <a class="externalLink" href="http://james.apache.org/mailbox">mailbox</a> project for more information.</p>
</section>
<section>
<h3><a name="Mailbox_Listeners"></a>Mailbox Listeners</h3>
<p>See the <a class="externalLink" href="http://james.apache.org/mailbox">mailbox</a> project for more information.</p>
<p>See the <a class="externalLink" href="http://james.apache.org/server/config-listeners.html">mailbox listeners</a> for configuring
additional mailbox listeners.</p>
</section>
<section>
<h3><a name="Queue"></a>Queue</h3>
</section>
<section>
<h3><a name="Queue_Listeners"></a>Queue Listeners</h3>
</section>
<section>
<h3><a name="Extension_and_Guice_wiring"></a>Extension and Guice wiring</h3>
<p>This section does not concern the Spring / server/app wiring.</p>
<p>Guice applications let you load several type of user defined components. These components include:</p>
<ul>
<li><a class="externalLink" href="https://github.com/apache/james-project/blob/master/mailet/api/src/main/java/org/apache/mailet/Mailet.java">Mailets</a></li>
<li><a class="externalLink" href="https://github.com/apache/james-project/blob/master/mailet/api/src/main/java/org/apache/mailet/Matcher.java">Matchers</a></li>
<li><a class="externalLink" href="https://github.com/apache/james-project/blob/master/mailbox/api/src/main/java/org/apache/james/mailbox/events/MailboxListener.java">Mailbox Listeners</a></li>
<li><a class="externalLink" href="https://github.com/apache/james-project/blob/master/mailbox/api/src/main/java/org/apache/james/mailbox/extension/PreDeletionHook.java">PreDeletion hooks</a></li>
<li><a class="externalLink" href="https://github.com/apache/james-project/blob/master/protocols/api/src/main/java/org/apache/james/protocols/api/handler/ProtocolHandler.java">Protocol handlers</a> (SMTP/LMTP/POP3)</li>
<li><a class="externalLink" href="https://github.com/apache/james-project/blob/master/server/protocols/webadmin/webadmin-core/src/main/java/org/apache/james/webadmin/Routes.java">Additional webAdmin routes</a></li>
</ul>
<p>Given a custom maven module implementing one or more of the following APIs, first create a
<a class="externalLink" href="https://maven.apache.org/plugins/maven-assembly-plugin/descriptor-refs.html#jar-with-dependencies">jar-with-dependencies</a>
of your module. Then copy the jar-with-dependencies into the ./extensions-jars folder of your guice
James server installation.</p>
<p>Note: Transitive dependency resolution is only done if you are packaging your extension into a jar-with-dependencies.
Your extension class-loader will be the modified one (James and extensions-jars content) but James class-loader
stays unmodified everywhere else.</p>
<p>Once done, you need to explicitly require James to load your extensions. This needs to be done in the following
configuration files:</p>
<ul>
<li><a href="config-mailetcontainer.html">Mailets</a></li>
<li><a href="config-mailetcontainer.html">Matchers</a></li>
<li><a href="config-listeners.html">Mailbox Listeners</a></li>
<li><a href="config-listeners.html">PreDeletion hooks</a></li>
<li>Protocol handlers for <a href="config-smtp.html">SMTP</a>,<a href="config-lmtp.html">LMTP</a>,<a href="config-pop3.html">POP3</a></li>
<li><a href="config-webadmin.html">Additional webAdmin routes</a></li>
</ul>
<p>Also, it is possible to register additional Guice bindings, that are applied as a Guice child injector
for creating extensions.</p>
<p>Note: Extensions are loaded in their own classpath to avoid breaking James server but they can retrieve James services to implement their business logic.</p>
<p>To do so, write an <a class="externalLink" href="https://google.github.io/guice/api-docs/latest/javadoc/index.html?com/google/inject/Module.html">
Module</a> with the additional guice bindings you need. Then package it as a <b>jar-with-dependencies</b>, and copy the
jar-with-dependencies within the <b>extensions-jars</b> folder of your James installation, as you will do for any other extension.</p>
<p>Then register your additional Guice modules for extensions within the
<a class="externalLink" href="https://github.com/apache/james-project/blob/master/server/apps/distributed-app/sample-configuration/extensions.properties">extensions.properties</a>
configuration file.</p>
<p>Note: No Guice extensions will be applied upon Guice extension module invocation.</p>
<p>This enables injections defined in your Module into all extensions.</p>
</section>
</section>
</div>
</div>
<div class="clear">
<hr/>
</div>
<div id="footer">
<div class="xright">Copyright &#169; 2006-2021
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All Rights Reserved.
</div>
<div class="clear">
<hr/>
</div>
</div>
</body>
</html>