blob: 45250b421c0ea3cbb2f4460e92f45a960c9801e6 [file] [log] [blame]
<!doctype html>
<html lang="en" dir="ltr" class="mdx-wrapper mdx-page plugin-pages plugin-id-default">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.4.0">
<title data-rh="true">Contribution guide | Apache BookKeeper</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://bookkeeper.apache.org/community/contributing"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docsearch:docusaurus_tag" content="default"><meta data-rh="true" property="og:title" content="Contribution guide | Apache BookKeeper"><meta data-rh="true" name="description" content="The Apache BookKeeper community welcomes contributions from anyone with a passion for distributed systems! BookKeeper has many different opportunities for contributions --"><meta data-rh="true" property="og:description" content="The Apache BookKeeper community welcomes contributions from anyone with a passion for distributed systems! BookKeeper has many different opportunities for contributions --"><link data-rh="true" rel="icon" href="/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://bookkeeper.apache.org/community/contributing"><link data-rh="true" rel="alternate" href="https://bookkeeper.apache.org/community/contributing" hreflang="en"><link data-rh="true" rel="alternate" href="https://bookkeeper.apache.org/community/contributing" hreflang="x-default"><link rel="stylesheet" href="/assets/css/styles.49914aab.css">
<link rel="preload" href="/assets/js/runtime~main.99a29ea0.js" as="script">
<link rel="preload" href="/assets/js/main.812b2dbb.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><div class="navbar__logo"><img src="/img/bk-logo.svg" alt="Apache Bookkeeper" class="themedImage_ToTc themedImage--light_HNdA"><img src="/img/bk-logo.svg" alt="Apache Bookkeeper" class="themedImage_ToTc themedImage--dark_i4oU"></div><b class="navbar__title text--truncate">Apache BookKeeper</b></a><a class="navbar__item navbar__link" href="/docs/overview/">Documentation</a><div class="navbar__item dropdown dropdown--hoverable"><a href="#" aria-haspopup="true" aria-expanded="false" role="button" class="navbar__link">Community</a><ul class="dropdown__menu"><li><a class="dropdown__link" href="/community/mailing-lists">Mailing lists</a></li><li><a class="dropdown__link" href="/community/slack">Slack</a></li><li><a href="https://github.com/apache/bookkeeper/issues" target="_blank" rel="noopener noreferrer" class="dropdown__link">Github issues<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li><a class="dropdown__link" href="/community/releases">Release management</a></li><li><a class="dropdown__link" href="/community/meeting">Community meetings</a></li><li><a aria-current="page" class="dropdown__link dropdown__link--active" href="/community/contributing">Contribution guide</a></li><li><a class="dropdown__link" href="/community/coding-guide">Coding guide</a></li><li><a class="dropdown__link" href="/community/testing">Testing guide</a></li><li><a class="dropdown__link" href="/community/issue-report">Issue report guide</a></li><li><a class="dropdown__link" href="/community/release-guide">Release guide</a></li><li><a class="dropdown__link" href="/community/presentations">Presentations</a></li><li><a class="dropdown__link" href="/community/bookkeeper-proposals">BookKeeper proposals (BP)</a></li></ul></div><div class="navbar__item dropdown dropdown--hoverable"><a href="#" aria-haspopup="true" aria-expanded="false" role="button" class="navbar__link">Project</a><ul class="dropdown__menu"><li><a class="dropdown__link" href="/project/who">Who are we?</a></li><li><a class="dropdown__link" href="/project/bylaws">Bylaws</a></li><li><a href="https://apache.org/licenses" target="_blank" rel="noopener noreferrer" class="dropdown__link">License<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li><a class="dropdown__link" href="/project/privacy">Privacy policy</a></li><li><a href="https://www.apache.org/foundation/sponsorship.html" target="_blank" rel="noopener noreferrer" class="dropdown__link">Sponsorship<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li><a href="https://www.apache.org/foundation/thanks.html" target="_blank" rel="noopener noreferrer" class="dropdown__link">Thanks<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="navbar__items navbar__items--right"><div class="navbar__item dropdown dropdown--hoverable dropdown--right"><a class="navbar__link" aria-haspopup="true" aria-expanded="false" role="button" href="/docs/overview/">4.16.5</a><ul class="dropdown__menu"><li><a class="dropdown__link" href="/docs/next/overview/">Next</a></li><li><a class="dropdown__link" href="/docs/overview/">4.16.5</a></li><li><a class="dropdown__link" href="/docs/4.15.5/overview/">4.15.5</a></li><li><a class="dropdown__link" href="/docs/4.14.8/overview/">4.14.8</a></li><li><a class="dropdown__link" href="/docs/4.13.0/overview/">4.13.0</a></li><li><a class="dropdown__link" href="/docs/4.12.1/overview/">4.12.1</a></li><li><a class="dropdown__link" href="/docs/4.11.1/overview/">4.11.1</a></li><li><a class="dropdown__link" href="/docs/4.10.0/overview/">4.10.0</a></li><li><a class="dropdown__link" href="/docs/4.9.2/overview/">4.9.2</a></li><li><a class="dropdown__link" href="/docs/4.8.2/overview/">4.8.2</a></li><li><a class="dropdown__link" href="/docs/4.7.3/overview/">4.7.3</a></li><li><a class="dropdown__link" href="/docs/4.6.2/overview/">4.6.2</a></li><li><a class="dropdown__link" href="/docs/4.5.1/overview/">4.5.1</a></li></ul></div><a class="navbar__item navbar__link" href="/releases">Download</a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="Switch between dark and light mode (currently light mode)" aria-label="Switch between dark and light mode (currently light mode)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="searchBox_ZlJk"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0"><main class="container container--fluid margin-vert--lg"><div class="row mdxPageWrapper_j9I6"><div class="col col--8"><article><h1>Contribution guide</h1><p>The Apache BookKeeper community welcomes contributions from anyone with a passion for distributed systems! BookKeeper has many different opportunities for contributions --
write new examples/tutorials, add new user-facing libraries, work on the core storage components, integrate with different metadata stores (ZooKeeper, Etcd etc), or
participate on the documentation effort.</p><p>We use a review-then-commit workflow in BookKeeper for all contributions.</p><p><strong>For larger contributions or those that affect multiple components:</strong></p><ol><li><strong>Engage</strong>: We encourage you to work with the BookKeeper community on the <a href="https://github.com/apache/bookkeeper/issues" target="_blank" rel="noopener noreferrer">Github Issues</a> and <a href="/community/mailing-lists">developer’s mailing list</a> to identify good areas for contribution.</li><li><strong>Design:</strong> More complicated contributions will likely benefit from some early discussion in order to scope and design them well.</li></ol><p><strong>For all contributions:</strong></p><ol><li><strong>Code:</strong> The best part ;-)</li><li><strong>Review:</strong> Submit a pull request with your contribution to our <a href="https://github.com/apache/bookkeeper" target="_blank" rel="noopener noreferrer">GitHub Repo</a>. Work with a committer to review and iterate on the code, if needed.</li><li><strong>Commit:</strong> A BookKeeper committer merges the pull request into our <a href="https://github.com/apache/bookkeeper" target="_blank" rel="noopener noreferrer">GitHub Repo</a>.</li></ol><p>We look forward to working with you!</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="engage">Engage<a href="#engage" class="hash-link" aria-label="Direct link to Engage" title="Direct link to Engage"></a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="mailing-lists">Mailing list(s)<a href="#mailing-lists" class="hash-link" aria-label="Direct link to Mailing list(s)" title="Direct link to Mailing list(s)"></a></h3><p>We discuss design and implementation issues on the <a href="mailto:dev@bookkeeper.apache.org" target="_blank" rel="noopener noreferrer">dev@bookkeeper.apache.org</a> mailing list, which is archived <a href="https://lists.apache.org/list.html?dev@bookkeeper.apache.org" target="_blank" rel="noopener noreferrer">here</a>. Join by emailing <a href="mailto:dev-subscribe@bookkeeper.apache.org" target="_blank" rel="noopener noreferrer"><code>dev-subscribe@bookkeeper.apache.org</code></a>.</p><p>If interested, you can also join the other <a href="/community/mailing-lists">mailing lists</a>.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="github-issues">Github Issues<a href="#github-issues" class="hash-link" aria-label="Direct link to Github Issues" title="Direct link to Github Issues"></a></h3><p>We are moving to use <a href="https://github.com/apache/bookkeeper/issues" target="_blank" rel="noopener noreferrer">Github Issues</a> as an issue tracking and project management tool, as well as a way to communicate among a very diverse and distributed set of contributors. To be able to gather feedback, avoid frustration, and avoid duplicated efforts all BookKeeper-related work should be tracked there.</p><p>If you do not already have an Github account, sign up <a href="https://github.com/join" target="_blank" rel="noopener noreferrer">here</a>.</p><p>If a quick <a href="https://github.com/apache/bookkeeper/issues?utf8=%E2%9C%93" target="_blank" rel="noopener noreferrer">search</a> doesn’t turn up an existing Github issue for the work you want to contribute, create it. Please discuss your idea with a committer in Github or, alternatively, on the developer mailing list.</p><p>If there’s an existing Github issue for your intended contribution, please comment about your intended work. Once the work is understood, a committer will assign the issue to you. If an issue is currently assigned, please check with the current assignee before reassigning.</p><p>For moderate or large contributions, you should not start coding or writing a design document unless there is a corresponding Github issue assigned to you for that work. Simple changes, like fixing typos, do not require an associated issue.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="online-discussions">Online discussions<a href="#online-discussions" class="hash-link" aria-label="Direct link to Online discussions" title="Direct link to Online discussions"></a></h3><p>We are using <a href="https://apachebookkeeper.slack.com/" target="_blank" rel="noopener noreferrer">Apache BookKeeper Slack channel</a> for online discussions. You can self-invite yourself by accessing <a href="http://apachebookkeeper.slack.com/" target="_blank" rel="noopener noreferrer">this link</a>.</p><p>Slack channels are great for quick questions or discussions on specialized topics. Remember that we strongly encourage communication via the mailing lists, and we prefer to discuss more complex subjects by email. Developers should be careful to move or duplicate all the official or useful discussions to the issue tracking system and/or the dev mailing list.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="design">Design<a href="#design" class="hash-link" aria-label="Direct link to Design" title="Direct link to Design"></a></h2><p>To avoid potential frustration during the code review cycle, we encourage you to clearly scope and design non-trivial contributions with the BookKeeper community before you start coding.</p><p>We are using <a href="https://bookkeeper.apache.org/community/bookkeeper-proposals/" target="_blank" rel="noopener noreferrer">BookKeeper Proposals</a> for managing major changes to BookKeeper.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="code">Code<a href="#code" class="hash-link" aria-label="Direct link to Code" title="Direct link to Code"></a></h2><p>To contribute code to Apache BookKeeper, you’ll have to do a few administrative steps once, and then follow the <a href="/community/coding-guide">Coding Guide</a>.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="one-time-setup">One-time Setup<a href="#one-time-setup" class="hash-link" aria-label="Direct link to One-time Setup" title="Direct link to One-time Setup"></a></h3><h4 class="anchor anchorWithStickyNavbar_LWe7" id="optionally-submit-contributor-license-agreement">[Optionally]<!-- --> Submit Contributor License Agreement<a href="#optionally-submit-contributor-license-agreement" class="hash-link" aria-label="Direct link to optionally-submit-contributor-license-agreement" title="Direct link to optionally-submit-contributor-license-agreement"></a></h4><p>Apache Software Foundation (ASF) desires that all contributors of ideas, code, or documentation to the Apache projects complete, sign, and submit an <a href="https://www.apache.org/licenses/icla.pdf" target="_blank" rel="noopener noreferrer">Individual Contributor License Agreement</a> (ICLA). The purpose of this agreement is to clearly define the terms under which intellectual property has been contributed to the ASF and thereby allow us to defend the project should there be a legal dispute regarding the software at some future time.</p><p>We require you to have an ICLA on file with the Apache Secretary for larger contributions only. For smaller ones, however, we rely on <a href="http://www.apache.org/licenses/LICENSE-2.0#contributions" target="_blank" rel="noopener noreferrer">clause five</a> of the Apache License, Version 2.0, describing licensing of intentionally submitted contributions and do not require an ICLA in that case.</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="obtain-a-github-account">Obtain a GitHub account<a href="#obtain-a-github-account" class="hash-link" aria-label="Direct link to Obtain a GitHub account" title="Direct link to Obtain a GitHub account"></a></h4><p>We use GitHub’s pull request functionality to review proposed code changes.</p><p>If you do not already have a personal GitHub account, sign up <a href="https://github.com/join" target="_blank" rel="noopener noreferrer">here</a>.</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="fork-the-repository-on-github">Fork the repository on GitHub<a href="#fork-the-repository-on-github" class="hash-link" aria-label="Direct link to Fork the repository on GitHub" title="Direct link to Fork the repository on GitHub"></a></h4><p>Go to the <a href="https://github.com/apache/bookkeeper/" target="_blank" rel="noopener noreferrer">BookKeeper GitHub Repo</a> and fork the repository to your own private account. This will be your private workspace for staging changes.</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="clone-the-repository-locally">Clone the repository locally<a href="#clone-the-repository-locally" class="hash-link" aria-label="Direct link to Clone the repository locally" title="Direct link to Clone the repository locally"></a></h4><p>You are now ready to create the development environment on your local machine. Feel free to repeat these steps on all machines that you want to use for development.</p><p>We assume you are using SSH-based authentication with GitHub. If necessary, exchange SSH keys with GitHub by following <a href="https://help.github.com/articles/generating-an-ssh-key/" target="_blank" rel="noopener noreferrer">their instructions</a>.</p><p>Clone your personal BookKeeper’s GitHub fork.</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ git clone https://github.com/&lt;Github_user&gt;/bookkeeper.git</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ cd bookkeeper</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Add Apache Repo as additional Git remotes, where you can sync the changes (for committers, you need these two remotes for pushing changes).</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ git remote add apache https://github.com/apache/bookkeeper</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ git remote add apache-github https://github.com/apache/bookkeeper</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>You are now ready to start developing!</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="optional-ide-setup">[Optional]<!-- --> IDE Setup<a href="#optional-ide-setup" class="hash-link" aria-label="Direct link to optional-ide-setup" title="Direct link to optional-ide-setup"></a></h4><p>Depending on your preferred development environment, you may need to prepare it to develop BookKeeper code.</p><h5 class="anchor anchorWithStickyNavbar_LWe7" id="intellij">IntelliJ<a href="#intellij" class="hash-link" aria-label="Direct link to IntelliJ" title="Direct link to IntelliJ"></a></h5><h6 class="anchor anchorWithStickyNavbar_LWe7" id="checkstyle">Checkstyle<a href="#checkstyle" class="hash-link" aria-label="Direct link to Checkstyle" title="Direct link to Checkstyle"></a></h6><p>IntelliJ supports checkstyle within the IDE using the Checkstyle-IDEA plugin.</p><ol><li>Install the &quot;Checkstyle-IDEA&quot; plugin from the IntelliJ plugin repository.</li><li>Configure the plugin by going to Settings -&gt; Other Settings -&gt; Checkstyle.</li><li>Set the &quot;Scan Scope&quot; to &quot;Only Java sources (including tests)&quot;.</li><li>In the &quot;Configuration File&quot; pane, add a new configuration using the plus icon:<ol><li>Set the &quot;Description&quot; to &quot;BookKeeper&quot;.</li><li>Select &quot;Use a local Checkstyle file&quot;, and point it to
&quot;buildtools/src/main/resources/bookkeeper/checkstyle.xml&quot; within
your repository.</li><li>Check the box for &quot;Store relative to project location&quot;.</li><li>Click Next -&gt; Next -&gt; Finish.</li></ol></li><li>Select &quot;BookKeeper&quot; as the only active configuration file, and click &quot;Apply&quot; and
&quot;OK&quot;.</li><li>Checkstyle will now give warnings in the editor for any Checkstyle
violations.</li></ol><p>You can also scan an entire module by opening the Checkstyle tools window and
clicking the &quot;Check Module&quot; button. The scan should report no errors.</p><p>Note: Selecting &quot;Check Project&quot; may report some errors from the archetype
modules as they are not configured for Checkstyle validation.</p><h5 class="anchor anchorWithStickyNavbar_LWe7" id="eclipse">Eclipse<a href="#eclipse" class="hash-link" aria-label="Direct link to Eclipse" title="Direct link to Eclipse"></a></h5><p>Use a recent Eclipse version that includes m2e. Currently we recommend Eclipse Neon.
Start Eclipse with a fresh workspace in a separate directory from your checkout.</p><h6 class="anchor anchorWithStickyNavbar_LWe7" id="initial-setup">Initial setup<a href="#initial-setup" class="hash-link" aria-label="Direct link to Initial setup" title="Direct link to Initial setup"></a></h6><ol><li><p>Import the bookkeeper projects</p><p>File
-&gt; Import...
-&gt; Browse to the directory you cloned into and select &quot;bookkeeper&quot;
-&gt; make sure all bookkeeper projects are selected
-&gt; Finalize</p></li></ol><p>You now should have all the bookkeeper projects imported into eclipse and should see no compile errors.</p><h6 class="anchor anchorWithStickyNavbar_LWe7" id="checkstyle-1">Checkstyle<a href="#checkstyle-1" class="hash-link" aria-label="Direct link to Checkstyle" title="Direct link to Checkstyle"></a></h6><p>Eclipse supports checkstyle within the IDE using the Checkstyle plugin.</p><ol><li>Install the <a href="https://marketplace.eclipse.org/content/checkstyle-plug" target="_blank" rel="noopener noreferrer">Checkstyle plugin</a>.</li><li>Configure Checkstyle plugin by going to Preferences - Checkstyle.<ol><li>Click &quot;New...&quot;.</li><li>Select &quot;External Configuration File&quot; for type.</li><li>Click &quot;Browse...&quot; and select &quot;buildtools/src/main/resources/bookkeeper/checkstyle.xml&quot;.</li><li>Enter &quot;BookKeeper Checks&quot; under &quot;Name:&quot;.</li><li>Click &quot;OK&quot;, then &quot;OK&quot;.</li></ol></li></ol><h3 class="anchor anchorWithStickyNavbar_LWe7" id="create-a-branch-in-your-fork">Create a branch in your fork<a href="#create-a-branch-in-your-fork" class="hash-link" aria-label="Direct link to Create a branch in your fork" title="Direct link to Create a branch in your fork"></a></h3><p>You’ll work on your contribution in a branch in your own (forked) repository. Create a local branch, initialized with the state of the branch you expect your changes to be merged into. Keep in mind that we use several branches, including <code>master</code>, feature-specific, and release-specific branches. If you are unsure, initialize with the state of the <code>master</code> branch.</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ git fetch apache</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ git checkout -b &lt;my-branch&gt; apache/master</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>At this point, you can start making and committing changes to this branch in a standard way.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="syncing-and-pushing-your-branch">Syncing and pushing your branch<a href="#syncing-and-pushing-your-branch" class="hash-link" aria-label="Direct link to Syncing and pushing your branch" title="Direct link to Syncing and pushing your branch"></a></h3><p>Periodically while you work, and certainly before submitting a pull request, you should update your branch with the most recent changes to the target branch.</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ git pull --rebase</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Remember to always use <code>--rebase</code> parameter to avoid extraneous merge commits.</p><p>Then you can push your local, committed changes to your (forked) repository on GitHub. Since rebase may change that branch&#x27;s history, you may need to force push. You&#x27;ll run:</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ git push &lt;GitHub_user&gt; &lt;my-branch&gt; --force</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="testing">Testing<a href="#testing" class="hash-link" aria-label="Direct link to Testing" title="Direct link to Testing"></a></h3><p>All code should have appropriate unit testing coverage. New code should have new tests in the same contribution. Bug fixes should include a regression test to prevent the issue from reoccurring.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="review">Review<a href="#review" class="hash-link" aria-label="Direct link to Review" title="Direct link to Review"></a></h2><p>Once the initial code is complete and the tests pass, it’s time to start the code review process. We review and discuss all code, no matter who authors it. It’s a great way to build community, since you can learn from other developers, and they become familiar with your contribution. It also builds a strong project by encouraging a high quality bar and keeping code consistent throughout the project.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="create-a-pull-request">Create a pull request<a href="#create-a-pull-request" class="hash-link" aria-label="Direct link to Create a pull request" title="Direct link to Create a pull request"></a></h3><p>Organize your commits to make a committer’s job easier when reviewing. Committers normally prefer multiple small pull requests, instead of a single large pull request. Within a pull request, a relatively small number of commits that break the problem into logical steps is preferred. For most pull requests, you&#x27;ll squash your changes down to 1 commit. You can use the following command to re-order, squash, edit, or change description of individual commits.</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ git rebase -i apache/master</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>You&#x27;ll then push to your branch on GitHub. Note: when updating your commit after pull request feedback and use squash to get back to one commit, you will need to do a force submit to the branch on your repo.</p><p>Navigate to the <a href="https://github.com/apache/bookkeeper" target="_blank" rel="noopener noreferrer">BookKeeper GitHub Repo</a> to create a pull request. The title of the pull request should be strictly in the following format:</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Issue &lt;Github-issue-#&gt; &lt;Title of the pull request&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Please include a descriptive pull request message to help make the comitter’s job easier when reviewing. It’s fine to refer to existing design docs or the contents of the associated JIRA as appropriate.</p><p>If you know a good committer to review your pull request, please make a comment like the following. If not, don’t worry -- a committer will pick it up.</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Hi @&lt;GitHub-committer-username&gt;, can you please take a look?</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>When choosing a committer to review, think about who is the expert on the relevant code, who the stakeholders are for this change, and who else would benefit from becoming familiar with the code. If you’d appreciate comments from additional folks but already have a main committer, you can explicitly cc them using <code>@&lt;GitHub-committer-username&gt;</code>.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="code-review-and-revision">Code Review and Revision<a href="#code-review-and-revision" class="hash-link" aria-label="Direct link to Code Review and Revision" title="Direct link to Code Review and Revision"></a></h3><p>During the code review process, don’t rebase your branch or otherwise modify published commits, since this can remove existing comment history and be confusing to the committer when reviewing. When you make a revision, always push it in a new commit.</p><p>Our GitHub repo automatically provides pre-commit testing coverage using Jenkins. Please make sure those tests pass; the contribution cannot be merged otherwise.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="lgtm">LGTM<a href="#lgtm" class="hash-link" aria-label="Direct link to LGTM" title="Direct link to LGTM"></a></h3><p>Once the committer is happy with the change, they’ll approve the pull request with an LGTM (“<em>looks good to me!</em>”) or a <code>+1</code>. At this point, the committer will take over, possibly make some additional touch ups, and merge your changes into the codebase.</p><p>In the case the author is also a committer, either can merge the pull request. Just be sure to communicate clearly whose responsibility it is in this particular case.</p><p>Thank you for your contribution to BookKeeper!</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="deleting-your-branch">Deleting your branch<a href="#deleting-your-branch" class="hash-link" aria-label="Direct link to Deleting your branch" title="Direct link to Deleting your branch"></a></h3><p>Once the pull request is merged into the BookKeeper repository, you can safely delete the branch locally and purge it from your forked repository.</p><p>From another local branch, run:</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ git fetch origin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ git branch -d &lt;my-branch&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ git push origin --delete &lt;my-branch&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="commit-committers-only">Commit (committers only)<a href="#commit-committers-only" class="hash-link" aria-label="Direct link to Commit (committers only)" title="Direct link to Commit (committers only)"></a></h2><p>Once the code has been peer reviewed by a committer, the next step is for the committer to merge it into the Github repo.</p><p>Pull requests should not be merged before the review has approved from another committer. Exceptions to this rule may be made rarely, on a case-by-case basis only, in the committer’s discretion for situations such as build breakages.</p><p>Committers should never commit anything without going through a pull request, since that would bypass test coverage and potentially cause the build to fail due to checkstyle, etc. In addition, pull requests ensure that changes are communicated properly and potential flaws or improvements can be spotted. <strong>Always go through the pull request, even if you won’t wait for the code review.</strong> Even then, comments can be provided in the pull requests after it has been merged to work on follow-ups.</p><p>Committing is managed by a python script <a href="https://github.com/apache/bookkeeper/blob/master/dev/bk-merge-pr.py" target="_blank" rel="noopener noreferrer">bk-merge-pr.py</a>. Just follow the instructions promoted by the
script and types the information needed by the script.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="contributor-license-agreement">Contributor License Agreement<a href="#contributor-license-agreement" class="hash-link" aria-label="Direct link to Contributor License Agreement" title="Direct link to Contributor License Agreement"></a></h3><p>If you are merging a larger contribution, please make sure that the contributor has an ICLA on file with the Apache Secretary. You can view the list of committers <a href="http://home.apache.org/phonebook.html?unix=committers" target="_blank" rel="noopener noreferrer">here</a>, as well as <a href="http://home.apache.org/unlistedclas.html" target="_blank" rel="noopener noreferrer">ICLA-signers who aren’t yet committers</a>.</p><p>For smaller contributions, however, this is not required. In this case, we rely on <a href="http://www.apache.org/licenses/LICENSE-2.0#contributions" target="_blank" rel="noopener noreferrer">clause five</a> of the Apache License, Version 2.0, describing licensing of intentionally submitted contributions.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="tests">Tests<a href="#tests" class="hash-link" aria-label="Direct link to Tests" title="Direct link to Tests"></a></h3><p>Before merging, please make sure that Jenkins tests pass, as visible in the GitHub pull request. Do not merge the pull request otherwise.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="finishing-touches">Finishing touches<a href="#finishing-touches" class="hash-link" aria-label="Direct link to Finishing touches" title="Direct link to Finishing touches"></a></h3><p>At some point in the review process, you should take the pull request over and complete any outstanding work that is either minor, stylistic, or otherwise outside the expertise of the contributor. The <a href="https://github.com/apache/bookkeeper/blob/master/dev/bk-merge-pr.py" target="_blank" rel="noopener noreferrer">merge script</a> provides instructions for committers to address such minor conflicts.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="documentation">Documentation<a href="#documentation" class="hash-link" aria-label="Direct link to Documentation" title="Direct link to Documentation"></a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="website">Website<a href="#website" class="hash-link" aria-label="Direct link to Website" title="Direct link to Website"></a></h3><p>The BookKeeper website is in the same <a href="https://github.com/apache/bookkeeper" target="_blank" rel="noopener noreferrer">BookKeeper Github Repo</a>. The source files are hosted under <code>site</code> directory in <code>master</code> branch,
the static content is generated by CI job and merged into the <code>asf-site</code> branch.</p><p>Follow the <a href="https://github.com/apache/bookkeeper/tree/master/site" target="_blank" rel="noopener noreferrer">README</a> for making contributions to the website.</p></article></div><div class="col col--2"><div class="tableOfContents_bqdL thin-scrollbar"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#engage" class="table-of-contents__link toc-highlight">Engage</a><ul><li><a href="#mailing-lists" class="table-of-contents__link toc-highlight">Mailing list(s)</a></li><li><a href="#github-issues" class="table-of-contents__link toc-highlight">Github Issues</a></li><li><a href="#online-discussions" class="table-of-contents__link toc-highlight">Online discussions</a></li></ul></li><li><a href="#design" class="table-of-contents__link toc-highlight">Design</a></li><li><a href="#code" class="table-of-contents__link toc-highlight">Code</a><ul><li><a href="#one-time-setup" class="table-of-contents__link toc-highlight">One-time Setup</a></li><li><a href="#create-a-branch-in-your-fork" class="table-of-contents__link toc-highlight">Create a branch in your fork</a></li><li><a href="#syncing-and-pushing-your-branch" class="table-of-contents__link toc-highlight">Syncing and pushing your branch</a></li><li><a href="#testing" class="table-of-contents__link toc-highlight">Testing</a></li></ul></li><li><a href="#review" class="table-of-contents__link toc-highlight">Review</a><ul><li><a href="#create-a-pull-request" class="table-of-contents__link toc-highlight">Create a pull request</a></li><li><a href="#code-review-and-revision" class="table-of-contents__link toc-highlight">Code Review and Revision</a></li><li><a href="#lgtm" class="table-of-contents__link toc-highlight">LGTM</a></li><li><a href="#deleting-your-branch" class="table-of-contents__link toc-highlight">Deleting your branch</a></li></ul></li><li><a href="#commit-committers-only" class="table-of-contents__link toc-highlight">Commit (committers only)</a><ul><li><a href="#contributor-license-agreement" class="table-of-contents__link toc-highlight">Contributor License Agreement</a></li><li><a href="#tests" class="table-of-contents__link toc-highlight">Tests</a></li><li><a href="#finishing-touches" class="table-of-contents__link toc-highlight">Finishing touches</a></li></ul></li><li><a href="#documentation" class="table-of-contents__link toc-highlight">Documentation</a><ul><li><a href="#website" class="table-of-contents__link toc-highlight">Website</a></li></ul></li></ul></div></div></div></main></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Documentation</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/docs/overview">Overview</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/getting-started/installation">Getting started</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/deployment/manual">Deployment</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/admin/bookies">Administration</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/api/overview">API</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/security/overview">Security</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/development/protocol">Development</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/reference/config">Reference</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/community/mailing-lists">Mailing lists</a></li><li class="footer__item"><a class="footer__link-item" href="/community/slack">Slack</a></li><li class="footer__item"><a href="https://github.com/apache/bookkeeper" target="_blank" rel="noopener noreferrer" class="footer__link-item">Github<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://twitter.com/asfbookkeeper" target="_blank" rel="noopener noreferrer" class="footer__link-item">Twitter<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">Project</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/project/who">Who are we?</a></li><li class="footer__item"><a class="footer__link-item" href="/project/bylaws">Bylaws</a></li><li class="footer__item"><a href="https://apache.org/licenses" target="_blank" rel="noopener noreferrer" class="footer__link-item">License<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a class="footer__link-item" href="/project/privacy">Privacy policy</a></li><li class="footer__item"><a href="https://www.apache.org/foundation/sponsorship.html" target="_blank" rel="noopener noreferrer" class="footer__link-item">Sponsorship<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.apache.org/foundation/thanks.html" target="_blank" rel="noopener noreferrer" class="footer__link-item">Thanks<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright"><footer class="footer">
<div class="container">
<div class="content has-text-centered">
<p>
Copyright &copy; 2016 - 2024 <a href="https://www.apache.org/">The Apache Software Foundation</a>,<br> licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, version 2.0</a>.
</p>
<p>
Apache BookKeeper, BookKeeper®, Apache®, the Apache feature logo, and the Apache BookKeeper logo are either registered trademarks or trademarks of The Apache Software Foundation.
</p>
</div>
</div>
</footer>
</div></div></div></footer></div>
<script src="/assets/js/runtime~main.99a29ea0.js"></script>
<script src="/assets/js/main.812b2dbb.js"></script>
</body>
</html>