blob: b537788efe852721dd7aad59eded8394504be7ac [file] [log] [blame]
<!doctype html><html lang=cn class=no-js><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.102.3"><link rel=canonical type=text/html href=/cn/docs/contribution-guidelines/><link rel=alternate type=application/rss+xml href=/cn/docs/contribution-guidelines/index.xml><meta name=robots content="noindex, nofollow"><link rel="shortcut icon" href=/favicons/favicon.ico><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/favicons/favicon-32x32.png sizes=32x32><link rel=icon type=image/png href=/favicons/android-36x36.png sizes=36x36><link rel=icon type=image/png href=/favicons/android-48x48.png sizes=48x48><link rel=icon type=image/png href=/favicons/android-72x72.png sizes=72x72><link rel=icon type=image/png href=/favicons/android-96x96.png sizes=96x96><link rel=icon type=image/png href=/favicons/android-144x144.png sizes=144x144><link rel=icon type=image/png href=/favicons/android-192x192.png sizes=192x192><title>Contribution Guidelines | HugeGraph</title><meta name=description content><meta property="og:title" content="Contribution Guidelines"><meta property="og:description" content="Apache HugeGraph 官网"><meta property="og:type" content="website"><meta property="og:url" content="/cn/docs/contribution-guidelines/"><meta property="og:site_name" content="HugeGraph"><meta itemprop=name content="Contribution Guidelines"><meta itemprop=description content="Apache HugeGraph 官网"><meta name=twitter:card content="summary"><meta name=twitter:title content="Contribution Guidelines"><meta name=twitter:description content="Apache HugeGraph 官网"><link rel=preload href=/scss/main.min.14ea575cb35d93d46ff8681b2334f40fd46243c100c5c39f5a841b931fae2d40.css as=style><link href=/scss/main.min.14ea575cb35d93d46ff8681b2334f40fd46243c100c5c39f5a841b931fae2d40.css rel=stylesheet integrity><script src=https://code.jquery.com/jquery-3.5.1.min.js integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin=anonymous></script>
<link rel=stylesheet href=/css/prism.css><script type=application/javascript>var doNotTrack=!1;doNotTrack||(window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)},ga.l=+new Date,ga("create","UA-00000000-0","auto"),ga("send","pageview"))</script><script async src=https://www.google-analytics.com/analytics.js></script></head><body class=td-section><header><nav class="js-navbar-scroll navbar navbar-expand navbar-dark flex-column flex-md-row td-navbar"><a class=navbar-brand href=/cn/><span class=navbar-logo><svg id="图层_1" data-name="图层 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 16 16"><defs><style>.cls-1{fill:none;stroke:#fff;stroke-miterlimit:10;stroke-width:.5px;opacity:.3}.cls-2{fill:#229efa}.cls-3{fill:#9948f7}.cls-4{fill:#33bc7a}.cls-5{fill:url(#未命名的渐变_3)}.cls-6{fill:url(#未命名的渐变_13)}.cls-7{fill:url(#未命名的渐变_11)}</style><linearGradient id="未命名的渐变_3" x1="6.16" y1="14.63" x2="6.16" y2="6.01" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#2e3192"/><stop offset="0" stop-color="#229efa"/><stop offset=".44" stop-color="#239cf8"/><stop offset=".6" stop-color="#2795f2"/><stop offset=".71" stop-color="#2d8ae8"/><stop offset=".81" stop-color="#3679d9"/><stop offset=".89" stop-color="#4263c6"/><stop offset=".95" stop-color="#5048af"/><stop offset="1" stop-color="#5c319b"/></linearGradient><linearGradient id="未命名的渐变_13" x1="10.75" y1="8.2" x2="4.49" y2="1.94" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#991146"/><stop offset="0" stop-color="#326b4e"/><stop offset=".02" stop-color="#3a685c"/><stop offset=".07" stop-color="#506180"/><stop offset=".13" stop-color="#645aa0"/><stop offset=".19" stop-color="#7554bc"/><stop offset=".26" stop-color="#8250d2"/><stop offset=".35" stop-color="#8d4ce3"/><stop offset=".45" stop-color="#944aee"/><stop offset=".6" stop-color="#9848f5"/><stop offset="1" stop-color="#9948f7"/></linearGradient><linearGradient id="未命名的渐变_11" x1="15.34" y1="6.67" x2="7.88" y2="10.98" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#33bc7a"/><stop offset=".45" stop-color="#32ba7a"/><stop offset=".61" stop-color="#2fb37c"/><stop offset=".73" stop-color="#29a87e"/><stop offset=".82" stop-color="#219782"/><stop offset=".9" stop-color="#168186"/><stop offset=".97" stop-color="#09668b"/><stop offset="1" stop-color="#03598e"/></linearGradient></defs><title>logo</title><rect class="cls-1" x="-143.14" y="-373.46" width="597.8" height="424.44"/><circle class="cls-2" cx="12.02" cy="1.83" r="1.33"/><circle class="cls-3" cx="12.02" cy="14.17" r="1.33"/><circle class="cls-4" cx="1.33" cy="8" r="1.33"/><path class="cls-5" d="M7.91 10h0a2.65 2.65.0 01-.23-3.74A1.75 1.75.0 017.91 6h0A2.66 2.66.0 014.4 6h0a1.81 1.81.0 01.24.24A2.65 2.65.0 014.4 10h0a2.62 2.62.0 00-.89 2 2.65 2.65.0 104.4-2z"/><path class="cls-6" d="M12.19 5.49a2.78 2.78.0 01-.5.11A2.64 2.64.0 018.76 3.5h0a2.65 2.65.0 10-2.6 3.17A2.6 2.6.0 007 6.53H7a2.65 2.65.0 013.44 2 2.94 2.94.0 010-.51 2.65 2.65.0 011.75-2.53z"/><path class="cls-7" d="M13 5.35a2.64 2.64.0 00-2.59 2.12h0a3 3 0 01-.08.32A2.65 2.65.0 017.54 9.58a2.86 2.86.0 00.37.41h0a2.63 2.63.0 01.9 2 2.84 2.84.0 01-.05.51 2.64 2.64.0 013.12-2.06l.32.08h0a2.6 2.6.0 00.84.14 2.65 2.65.0 100-5.3z"/></svg></span><span class=font-weight-bold>HugeGraph</span></a><div class="td-navbar-nav-scroll ml-md-auto" id=main_navbar><ul class="navbar-nav mt-2 mt-lg-0"><li class="nav-item mr-4 mb-2 mb-lg-0"><a class=nav-link href=/cn/docs/><i class='fas fa-book pr-2'></i><span>Documentation</span></a></li><li class="nav-item mr-4 mb-2 mb-lg-0"><a class=nav-link href=https://github.com/apache/incubator-hugegraph target=_blank><i class='fab fa-github pr-2'></i><span>GitHub</span></a></li><li class="nav-item mr-4 mb-2 mb-lg-0"><a class=nav-link href=/cn/docs/download/download/><i class='fas fa-download pr-2'></i><span>Download</span></a></li><li class="nav-item mr-4 mb-2 mb-lg-0"><a class=nav-link href=/cn/community/><span>Community</span></a></li><li class="nav-item dropdown mr-4 d-none d-lg-block"><a class="nav-link dropdown-toggle" href=# id=navbarDropdown role=button data-toggle=dropdown aria-haspopup=true aria-expanded=false>中文</a><div class=dropdown-menu aria-labelledby=navbarDropdownMenuLink><a class=dropdown-item href=/docs/contribution-guidelines/>English</a></div></li></ul></div><div class="navbar-nav d-none d-lg-block"></div></nav></header><div class="container-fluid td-outer"><div class=td-main><div class="row flex-xl-nowrap"><main class="col-12 col-md-9 col-xl-8 pl-md-5" role=main><div class=td-content><div class="pageinfo pageinfo-primary d-print-none"><p>This is the multi-page printable view of this section.
<a href=# onclick="return print(),!1">Click here to print</a>.</p><p><a href=/cn/docs/contribution-guidelines/>Return to the regular view of this page</a>.</p></div><h1 class=title>Contribution Guidelines</h1><ul><li>1: <a href=#pg-17ea1d6a1e6627d08a7d6f4d2898cca1>如何参与 HugeGraph 社区</a></li><li>2: <a href=#pg-dc89ef117bed0b0ef3c6487f9a6a8bd0>订阅社区邮箱</a></li><li>3: <a href=#pg-07536ba8fd0a4ba5975f821978cf0009>验证 Apache 发版</a></li><li>4: <a href=#pg-c89774a4e231af418639f53a926ea188>在 IDEA 中配置 Server 开发环境</a></li><li>5: <a href=#pg-e1fc3666faccec72ead94a2ed6a9f8a3>Apache HugeGraph Committer 指南</a></li></ul><div class=content></div></div><div class=td-content><h1 id=pg-17ea1d6a1e6627d08a7d6f4d2898cca1>1 - 如何参与 HugeGraph 社区</h1><blockquote><p>TODO: translate this article to Chinese</p></blockquote><p>Thanks for taking the time to contribute! As an open source project, HugeGraph is looking forward to be contributed from everyone, and we are also grateful to all the contributors.</p><p>The following is a contribution guide for HugeGraph:</p><img width=884 alt=image src=https://user-images.githubusercontent.com/9625821/159643158-8bf72c0a-93c3-4a58-8912-7b2ab20ced1d.png><h2 id=1-preparation>1. Preparation</h2><p><strong>建议</strong>: 使用 <a href=https://desktop.github.com/>GitHub desktop</a> 可以大幅简化和改善你提交 PR/Commit 的过程, 特别适合新人</p><p>We can contribute by reporting issues, submitting code patches or any other feedback.</p><p>Before submitting the code, we need to do some preparation:</p><ol><li><p>Sign up or login to GitHub: <a href=https://github.com>https://github.com</a></p></li><li><p>Fork HugeGraph repo from GitHub: <a href=https://github.com/apache/hugegraph/fork>https://github.com/apache/incubator-hugegraph/fork</a></p></li><li><p>Clone code from fork repo to local: <a href=https://github.com/$%7BGITHUB_USER_NAME%7D/hugegraph>https://github.com/${GITHUB_USER_NAME}/hugegraph</a></p><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-shell data-lang=shell><span style=display:flex><span><span style=color:#8f5902;font-style:italic># clone code from remote to local repo</span>
</span></span><span style=display:flex><span>git clone https://github.com/<span style=color:#4e9a06>${</span><span style=color:#000>GITHUB_USER_NAME</span><span style=color:#4e9a06>}</span>/hugegraph
</span></span></code></pre></div></li><li><p>Configure local HugeGraph repo</p><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-shell data-lang=shell><span style=display:flex><span><span style=color:#204a87>cd</span> hugegraph
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#8f5902;font-style:italic># add upstream to synchronize the latest code</span>
</span></span><span style=display:flex><span>git remote add hugegraph https://github.com/apache/hugegraph
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#8f5902;font-style:italic># set name and email to push code to github</span>
</span></span><span style=display:flex><span>git config user.name <span style=color:#4e9a06>&#34;{full-name}&#34;</span> <span style=color:#8f5902;font-style:italic># like &#34;Jermy Li&#34;</span>
</span></span><span style=display:flex><span>git config user.email <span style=color:#4e9a06>&#34;{email-address-of-github}&#34;</span> <span style=color:#8f5902;font-style:italic># like &#34;jermy@apache.org&#34;</span>
</span></span></code></pre></div></li></ol><h2 id=2-create-an-issue-on-github>2. Create an Issue on GitHub</h2><p>If you encounter bugs or have any questions, please go to <a href=https://github.com/apache/incubator-hugegraph/issues>GitHub Issues</a> to report them and feel free to <a href=https://github.com/apache/hugegraph/issues/new>create an issue</a>.</p><h2 id=3-make-changes-of-code-locally>3. Make changes of code locally</h2><h4 id=31-create-a-new-branch>3.1 Create a new branch</h4><p>Please don&rsquo;t use master branch for development. We should create a new branch instead:</p><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-shell data-lang=shell><span style=display:flex><span><span style=color:#8f5902;font-style:italic># checkout master branch</span>
</span></span><span style=display:flex><span>git checkout master
</span></span><span style=display:flex><span><span style=color:#8f5902;font-style:italic># pull the latest code from official hugegraph</span>
</span></span><span style=display:flex><span>git pull hugegraph
</span></span><span style=display:flex><span><span style=color:#8f5902;font-style:italic># create new branch: bugfix-branch</span>
</span></span><span style=display:flex><span>git checkout -b bugfix-branch
</span></span></code></pre></div><h4 id=32-change-the-code>3.2 Change the code</h4><p>Assume that we need to modify some files like &ldquo;HugeGraph.java&rdquo; and &ldquo;HugeFactory.java&rdquo;:</p><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-shell data-lang=shell><span style=display:flex><span><span style=color:#8f5902;font-style:italic># modify code to fix a bug</span>
</span></span><span style=display:flex><span>vim hugegraph-core/src/main/java/org/apache/hugegraph/HugeGraph.java
</span></span><span style=display:flex><span>vim hugegraph-core/src/main/java/org/apache/hugegraph/HugeFactory.java
</span></span><span style=display:flex><span><span style=color:#8f5902;font-style:italic># run test locally (optional)</span>
</span></span><span style=display:flex><span>mvn <span style=color:#204a87>test</span> -Pcore-test,memory
</span></span></code></pre></div><p>Note: In order to be consistent with the code style easily, if you use <a href=https://www.jetbrains.com/idea/>IDEA</a> as your IDE, you can directly <a href=https://www.jetbrains.com/help/idea/configuring-code-style.html>import</a> our code style <a href=./hugegraph-style.xml>configuration file</a>.</p><h5 id=321-添加第三方依赖>3.2.1 添加第三方依赖</h5><p>如果我们要在 <code>HugeGraph</code> 项目中添加新的第三方依赖, 我们需要做下面的几件事情:</p><ol><li>找到第三方依赖的仓库,将依赖的 <code>license</code> 文件放到 <a href=https://github.com/apache/incubator-hugegraph/tree/master/hugegraph-server/hugegraph-dist/release-docs/licenses>./hugegraph-dist/release-docs/licenses/</a> 路径下。</li><li><a href=https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-dist/release-docs/LICENSE>./hugegraph-dist/release-docs/LICENSE</a> 中声明该依赖的 <code>LICENSE</code> 信息。</li><li>找到仓库里的 NOTICE 文件,将其追加到 <a href=https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-dist/release-docs/NOTICE>./hugegraph-dist/release-docs/NOTICE</a> 文件后面(如果没有NOTICE文件则跳过这一步)。</li><li>本地执行<a href=https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-dist/scripts/dependency/regenerate_known_dependencies.sh>./hugegraph-dist/scripts/dependency/regenerate_known_dependencies.sh</a> 脚本来更新依赖列表<a href=https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-dist/scripts/dependency/known-dependencies.txt>known-dependencies.txt</a> (或者手动更新)。</li></ol><p><strong>例如</strong>:在项目中引入了第三方新依赖 -> <code>ant-1.9.1.jar</code></p><ul><li>项目源码位于:https://github.com/apache/ant/tree/rel/1.9.1</li><li>LICENSE 文件:https://github.com/apache/ant/blob/rel/1.9.1/LICENSE</li><li>NOTICE 文件:https://github.com/apache/ant/blob/rel/1.9.1/NOTICE</li></ul><p><code>ant-1.9.1.jar</code> 的 license 信息需要在 LICENSE 文件中指定,notice 信息需要在 NOTICE 文件中指定。 ant-1.9.1.jar 对应的详细 LICENSE 文件需要复制到我们的 licenses/ 目录下。最后更新 known-dependencies.txt 文件。</p><h4 id=33-commit-changes-to-git-repo>3.3 Commit changes to git repo</h4><p>After the code has been completed, we submit them to the local git repo:</p><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-shell data-lang=shell><span style=display:flex><span><span style=color:#8f5902;font-style:italic># add files to local git index</span>
</span></span><span style=display:flex><span>git add hugegraph-core/src/main/java/org/apache/hugegraph/HugeGraph.java
</span></span><span style=display:flex><span>git add hugegraph-core/src/main/java/org/apache/hugegraph/HugeFactory.java
</span></span><span style=display:flex><span><span style=color:#8f5902;font-style:italic># commit to local git repo</span>
</span></span><span style=display:flex><span>git commit
</span></span></code></pre></div><p>Please edit the commit message after running <code>git commit</code>, we can explain what and how to fix a bug or implement a feature, the following is an example:</p><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>Fix bug: run deploy multiple <span style=color:#204a87>times</span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>fix <span style=color:#8f5902;font-style:italic>#ISSUE_ID</span>
</span></span></code></pre></div><blockquote><p>Please remember to fill in the issue id, which was generated by GitHub after issue creation.</p></blockquote><h4 id=34-push-commit-to-github-fork-repo>3.4 Push commit to GitHub fork repo</h4><p>Push the local commit to GitHub fork repo:</p><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-shell data-lang=shell><span style=display:flex><span><span style=color:#8f5902;font-style:italic># push the local commit to fork repo</span>
</span></span><span style=display:flex><span>git push origin bugfix-branch:bugfix-branch
</span></span></code></pre></div><p>Note that since GitHub requires submitting code through <code>username + token</code> (instead of using <code>username + password</code> directly), you need to create a GitHub token from <a href=https://github.com/settings/tokens>https://github.com/settings/tokens</a>:
<img width=1280 alt=image src=https://user-images.githubusercontent.com/9625821/163524204-7fe0e6bf-9c8b-4b1a-ac65-6a0ac423eb16.png></p><h2 id=4-create-a-pull-request>4. Create a Pull Request</h2><p>Go to the web page of GitHub fork repo, there would be a chance to create a Pull Request after pushing to a new branch, just click button &ldquo;Compare & pull request&rdquo; to do it. Then edit the description for proposed changes, which can just be copied from the commit message.</p><p>Note: please make sure the email address you used to submit the code is bound to the GitHub account. For how to bind the email address, please refer to <a href=https://github.com/settings/emails>https://github.com/settings/emails</a>:
<img width=1280 alt=image src=https://user-images.githubusercontent.com/9625821/163522445-2a50a72a-dea2-434f-9868-3a0d40d0d037.png></p><h2 id=5-code-review>5. Code review</h2><p>Maintainers will start the code review after all the <strong>automatic</strong> checks are passed:</p><ul><li>Check: Contributor License Agreement is signed</li><li>Check: Travis CI builds is passed (automatically Test and Deploy)</li></ul><p>The commit will be accepted and merged if there is no problem after review.</p><p>Please click on &ldquo;Details&rdquo; to find the problem if any check does not pass.</p><p>If there are checks not passed or changes requested, then continue to modify the code and push again.</p><h2 id=6-more-changes-after-review>6. More changes after review</h2><p>If we have not passed the review, don&rsquo;t be discouraged. Usually a commit needs to be reviewed several times before being accepted! Please follow the review comments and make further changes.</p><p>After the further changes, we submit them to the local repo:</p><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-shell data-lang=shell><span style=display:flex><span><span style=color:#8f5902;font-style:italic># commit all updated files in a new commit,</span>
</span></span><span style=display:flex><span><span style=color:#8f5902;font-style:italic># please feel free to enter any appropriate commit message, note that</span>
</span></span><span style=display:flex><span><span style=color:#8f5902;font-style:italic># we will squash all commits in the pull request as one commit when</span>
</span></span><span style=display:flex><span><span style=color:#8f5902;font-style:italic># merging into the master branch.</span>
</span></span><span style=display:flex><span>git commit -a
</span></span></code></pre></div><blockquote><p>If there are conflicts that prevent the code from being merged, we need to rebase on master branch:</p><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-shell data-lang=shell><span style=display:flex><span><span style=color:#8f5902;font-style:italic># synchronize the latest code</span>
</span></span><span style=display:flex><span>git checkout master
</span></span><span style=display:flex><span>git pull hugegraph
</span></span><span style=display:flex><span><span style=color:#8f5902;font-style:italic># rebase on master</span>
</span></span><span style=display:flex><span>git checkout bugfix-branch
</span></span><span style=display:flex><span>git rebase -i master
</span></span></code></pre></div></blockquote><p>And push it to GitHub fork repo again:</p><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-shell data-lang=shell><span style=display:flex><span><span style=color:#8f5902;font-style:italic># force push the local commit to fork repo</span>
</span></span><span style=display:flex><span>git push -f origin bugfix-branch:bugfix-branch
</span></span></code></pre></div><p>GitHub will automatically update the Pull Request after we push it, just wait for code review.</p></div><div class=td-content style=page-break-before:always><h1 id=pg-dc89ef117bed0b0ef3c6487f9a6a8bd0>2 - 订阅社区邮箱</h1><p>按照以下步骤订阅邮件列表:</p><ul><li>通过您的电子邮件账户发送邮件至 <a href=mailto:dev-subscribe@hugegraph.apache.org>dev-subscribe@hugegraph.apache.org</a>,然后您将收到一封确认邮件。</li><li>回复确认邮件以确认您的订阅。然后,您将收到另一封确认邮件。</li><li>现在您已经成为该邮件列表的订阅者。如果您有更多问题,只需发送邮件到邮件列表,社区同学看到后会及时回复。</li></ul><p>您可以随时订阅邮件列表。此外,您也可以直接浏览<a href=https://lists.apache.org/list.html?dev@hugegraph.apache.org>历史邮件/所有邮件</a>(即使没有订阅列表)。</p><p>注意事项:</p><ul><li>如果您没有收到确认邮件,请在24小时后再重试发送邮件。</li><li>在成功订阅邮件列表之前,请勿发送电子邮件到 <strong>dev</strong>(未订阅发送的邮件将被自动拦截)。</li></ul><p>HugeGraph提供了一个供开发和用户讨论的电子邮件列表。</p><ul><li>hugegraph-dev: <a href=mailto:dev@hugegraph.apache.org>dev@hugegraph.apache.org</a> 用于开发和用户讨论。</li></ul><p>有关邮件订阅的更多信息,请参阅:</p><ul><li><a href=https://lists.apache.org/list.html?dev@hugegraph.apache.org>https://lists.apache.org/list.html?dev@hugegraph.apache.org</a></li><li><a href=http://apache.org/foundation/mailinglists.html#subscribing>http://apache.org/foundation/mailinglists.html#subscribing</a></li></ul><h1 id=退订邮件列表>退订邮件列表</h1><p>如果您不再需要了解 HugeGraph 的最新动态,可以退订邮件列表。</p><p>退订邮件列表的步骤如下:</p><ol><li><p>使用您订阅时的电子邮件发送邮件到 <a href=mailto:dev-unsubscribe@hugegraph.apache.org>dev-unsubscribe@hugegraph.apache.org</a>(主题和内容任意)。</p></li><li><p>收到确认邮件并回复。完成第一步后,您将收到来自 <a href=mailto:dev-help@hugegraph.apache.org>dev-help@hugegraph.apache.org</a> 的确认邮件(如果未收到,请确认邮件是否被自动归类为垃圾邮件、推广邮件、订阅邮件等)。然后直接回复邮件,或点击邮件中的链接快速回复(主题和内容任意)。</p></li><li><p>收到再见邮件。完成上述步骤后,您将收到一封主题为 &ldquo;GOODBYE from <a href=mailto:dev@hugegraph.apache.org>dev@hugegraph.apache.org</a>&rdquo; 的再见邮件,表示您已成功退订 Apache HugeGraph 邮件列表,您将不再接收来自 <a href=mailto:dev@hugegraph.apache.org>dev@hugegraph.apache.org</a> 的邮件。</p></li></ol></div><div class=td-content style=page-break-before:always><h1 id=pg-07536ba8fd0a4ba5975f821978cf0009>3 - 验证 Apache 发版</h1><blockquote><p>Note: 这篇文档会持续更新。
建议使用 Java11 验证测试,从 1.5.0 版本开始(除 client 外) 不再支持 Java8</p></blockquote><h2 id=验证阶段>验证阶段</h2><p>当内部的临时发布和打包工作完成后,其他的社区开发者 (尤其是 PMC)
需要参与到<a href=https://cwiki.apache.org/confluence/display/INCUBATOR/Incubator+Release+Checklist>验证环节</a>
确保某个人发布版本的"正确性 + 完整性", 这里需要<strong>每个人</strong>都尽量参与,然后后序<strong>邮件回复</strong>的时候说明自己
<strong>已检查</strong>了哪些项。(下面是核心项)</p><h4 id=1-准备工作>1. 准备工作</h4><p>如果本地没有 svn 或 gpg 或 wget 环境,建议先安装一下 (windows 推荐使用 WSL2 环境,
或者至少是 <code>git-bash</code>), 同时确保安装 Java(推荐 11) 和 maven 软件。</p><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span><span style=color:#8f5902;font-style:italic># 1. 安装svn</span>
</span></span><span style=display:flex><span><span style=color:#8f5902;font-style:italic># ubuntu/debian</span>
</span></span><span style=display:flex><span>sudo apt install subversion -y
</span></span><span style=display:flex><span><span style=color:#8f5902;font-style:italic># MacOS</span>
</span></span><span style=display:flex><span>brew install subversion
</span></span><span style=display:flex><span><span style=color:#8f5902;font-style:italic># 验证安装是否成功, 执行以下命令:</span>
</span></span><span style=display:flex><span>svn --version
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#8f5902;font-style:italic># 2. 安装gpg</span>
</span></span><span style=display:flex><span><span style=color:#8f5902;font-style:italic># ubuntu/debian</span>
</span></span><span style=display:flex><span>sudo apt-get install gnupg -y
</span></span><span style=display:flex><span><span style=color:#8f5902;font-style:italic># MacOS</span>
</span></span><span style=display:flex><span>brew install gnupg
</span></span><span style=display:flex><span><span style=color:#8f5902;font-style:italic># 验证安装是否成功, 执行以下命令:</span>
</span></span><span style=display:flex><span>gpg --version
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#8f5902;font-style:italic># 3. 安装wget</span>
</span></span><span style=display:flex><span><span style=color:#8f5902;font-style:italic># ubuntu/debian</span>
</span></span><span style=display:flex><span>sudo apt-get install wget -y
</span></span><span style=display:flex><span><span style=color:#8f5902;font-style:italic># MacOS</span>
</span></span><span style=display:flex><span>brew install wget
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#8f5902;font-style:italic># 4. 下载 hugegraph-svn 目录 (版本号注意填写此次验证版本)</span>
</span></span><span style=display:flex><span>svn co https://dist.apache.org/repos/dist/dev/incubator/hugegraph/1.x.x/
</span></span><span style=display:flex><span><span style=color:#8f5902;font-style:italic># (注) 如果出现 svn 下载某个文件速度很慢的情况, 可以考虑 wget 单个文件下载, 如下 (或考虑使用 VPN / 代理)</span>
</span></span><span style=display:flex><span>wget https://dist.apache.org/repos/dist/dev/incubator/hugegraph/1.x.x/apache-hugegraph-toolchain-incubating-1.x.x.tar.gz
</span></span></code></pre></div><h4 id=2-检查-hash-值>2. 检查 hash 值</h4><p>首先需要检查 <code>source + binary</code> 包的文件完整性,通过 <code>shasum</code> 进行校验,确保和发布到 apache/github 上的
hash 值一致 (一般是 sha512)</p><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span>执行命令:
</span></span><span style=display:flex><span><span style=color:#204a87;font-weight:700>for</span> i in *.tar.gz<span style=color:#000;font-weight:700>;</span> <span style=color:#204a87;font-weight:700>do</span> <span style=color:#204a87>echo</span> <span style=color:#000>$i</span><span style=color:#000;font-weight:700>;</span> shasum -a <span style=color:#0000cf;font-weight:700>512</span> --check <span style=color:#000>$i</span>.sha512<span style=color:#000;font-weight:700>;</span> <span style=color:#204a87;font-weight:700>done</span>
</span></span></code></pre></div><h4 id=3-检查-gpg-签名>3. 检查 gpg 签名</h4><p>这个就是为了确保发布的包是由<strong>可信赖</strong>的人上传的,假设 tom 签名后上传,其他人应该下载 A 的<strong>公钥</strong>
然后进行<strong>签名确认</strong>, 相关命令:</p><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span><span style=color:#8f5902;font-style:italic># 1. 下载项目可信赖公钥到本地 (首次需要) &amp; 导入</span>
</span></span><span style=display:flex><span>curl https://downloads.apache.org/incubator/hugegraph/KEYS &gt; KEYS
</span></span><span style=display:flex><span>gpg --import KEYS
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#8f5902;font-style:italic># 导入后可以看到如下输出, 这代表导入了 x 个用户公钥</span>
</span></span><span style=display:flex><span>gpg: /home/ubuntu/.gnupg/trustdb.gpg: trustdb created
</span></span><span style=display:flex><span>gpg: key BA7E78F8A81A885E: public key <span style=color:#4e9a06>&#34;imbajin (apache mail) &lt;jin@apache.org&gt;&#34;</span> imported
</span></span><span style=display:flex><span>gpg: key 818108E7924549CC: public key <span style=color:#4e9a06>&#34;vaughn &lt;vaughn@apache.org&gt;&#34;</span> imported
</span></span><span style=display:flex><span>gpg: key 28DCAED849C4180E: public key <span style=color:#4e9a06>&#34;coderzc (CODE SIGNING KEY) &lt;zhaocong@apache.org&gt;&#34;</span> imported
</span></span><span style=display:flex><span>....
</span></span><span style=display:flex><span>gpg: Total number processed: x
</span></span><span style=display:flex><span>gpg: imported: x
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#8f5902;font-style:italic># 2. 信任发版用户 (你需要信任 n 个邮件里提到的 gpg 用户名, >1则依次执行相同操作)</span>
</span></span><span style=display:flex><span>gpg --edit-key <span style=color:#000>$USER</span> <span style=color:#8f5902;font-style:italic># 这里填写具体用户名或者公钥串, 回车进入交互模式</span>
</span></span><span style=display:flex><span>gpg&gt; trust
</span></span><span style=display:flex><span>...输出选项..
</span></span><span style=display:flex><span>Your decision? <span style=color:#0000cf;font-weight:700>5</span> <span style=color:#8f5902;font-style:italic># 选择5</span>
</span></span><span style=display:flex><span>Do you really want to <span style=color:#204a87>set</span> this key to ultimate trust? <span style=color:#ce5c00;font-weight:700>(</span>y/N<span style=color:#ce5c00;font-weight:700>)</span> y <span style=color:#8f5902;font-style:italic># 选择y, 然后 q 退出信任下一个用户</span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#8f5902;font-style:italic># (可选) 你也可以直接使用非交互模式的如下命令:</span>
</span></span><span style=display:flex><span><span style=color:#204a87>echo</span> -e <span style=color:#4e9a06>&#34;5\ny\n&#34;</span> <span style=color:#000;font-weight:700>|</span> gpg --batch --command-fd <span style=color:#0000cf;font-weight:700>0</span> --edit-key <span style=color:#000>$USER</span> trust
</span></span><span style=display:flex><span><span style=color:#8f5902;font-style:italic># 或者是信任所有当前导入过的 gpg 公钥 (请小心检查)</span>
</span></span><span style=display:flex><span><span style=color:#204a87;font-weight:700>for</span> key in <span style=color:#204a87;font-weight:700>$(</span>gpg --no-tty --list-keys --with-colons <span style=color:#000;font-weight:700>|</span> awk -F: <span style=color:#4e9a06>&#39;/^pub/ {print $5}&#39;</span><span style=color:#204a87;font-weight:700>)</span><span style=color:#000;font-weight:700>;</span> <span style=color:#204a87;font-weight:700>do</span>
</span></span><span style=display:flex><span> <span style=color:#204a87>echo</span> -e <span style=color:#4e9a06>&#34;5\ny\n&#34;</span> <span style=color:#000;font-weight:700>|</span> gpg --batch --command-fd <span style=color:#0000cf;font-weight:700>0</span> --edit-key <span style=color:#4e9a06>&#34;</span><span style=color:#000>$key</span><span style=color:#4e9a06>&#34;</span> trust
</span></span><span style=display:flex><span><span style=color:#204a87;font-weight:700>done</span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#8f5902;font-style:italic># 3. 检查签名(确保没有 Warning 输出, 每一个 source/binary 文件都提示 Good Signature)</span>
</span></span><span style=display:flex><span><span style=color:#8f5902;font-style:italic>#单个文件验证</span>
</span></span><span style=display:flex><span>gpg --verify xx.asc xxx-src.tar.gz
</span></span><span style=display:flex><span>gpg --verify xx.asc xxx.tar.gz <span style=color:#8f5902;font-style:italic># 注:目前没有 bin/binary 后缀</span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#8f5902;font-style:italic># 一行脚本快速验证所有包 (推荐使用,请确保所有 gpg 公钥已经信任)</span>
</span></span><span style=display:flex><span><span style=color:#204a87;font-weight:700>for</span> i in *.tar.gz<span style=color:#000;font-weight:700>;</span> <span style=color:#204a87;font-weight:700>do</span> <span style=color:#204a87>echo</span> <span style=color:#000>$i</span><span style=color:#000;font-weight:700>;</span> gpg --verify <span style=color:#000>$i</span>.asc <span style=color:#000>$i</span> <span style=color:#000;font-weight:700>;</span> <span style=color:#204a87;font-weight:700>done</span>
</span></span></code></pre></div><p>先确认了整体的"完整性 + 一致性", 然后接下来确认具体的内容 (<strong>关键</strong>)</p><h4 id=4-检查压缩包内容>4. 检查压缩包内容</h4><p>这里检查准备工作下载的压缩包内容。分源码包 + 二进制包两个方面,源码包更为严格,挑核心的部分说
(完整的列表可参考官方 <a href=https://cwiki.apache.org/confluence/display/INCUBATOR/Incubator+Release+Checklist>Wiki</a>, 比较长)</p><h5 id=a-源码包>A. 源码包</h5><p>解压 <code>*hugegraph*src.tar.gz</code>后,进行如下检查:</p><ol><li>文件夹都带有 <code>incubating</code>, 且不存在<strong>空的</strong>文件/文件夹</li><li>存在 <code>LICENSE</code> + <code>NOTICE</code> + 存在 <code>DISCLAIMER</code> 文件并且内容正常</li><li><strong>不存在</strong> 缺乏 License 的二进制文件</li><li>源码文件都包含标准 <code>ASF License</code> 头 (这个用插件跑一下为主)</li><li>检查每个父 / 子模块的 <code>pom.xml</code> 版本号是否一致 (且符合期望)</li><li>最后,确保源码可以正常 / 正确编译 (然后看看测试和规范)</li></ol><p>PMC 同学请特别注意认真检查 <code>LICENSE</code> + <code>NOTICE</code> 文件,确保文件严格遵循了 ASF 的发版要求,
大部分的发版问题都与之相关</p><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span><span style=color:#8f5902;font-style:italic># 请优先使用/切换到 `java 11` 版本进行后序的编译和运行操作 (注:`Computer` 仅支持 `java &gt;= 11`) </span>
</span></span><span style=display:flex><span><span style=color:#8f5902;font-style:italic># java --version</span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#8f5902;font-style:italic># 尝试在 Unix 环境下编译测试是否正常 (stage 表示从 stage 仓库拉取依赖)</span>
</span></span><span style=display:flex><span>mvn clean package -P stage -Dmaven.test.skip<span style=color:#ce5c00;font-weight:700>=</span><span style=color:#204a87>true</span> -Dcheckstyle.skip<span style=color:#ce5c00;font-weight:700>=</span><span style=color:#204a87>true</span>
</span></span></code></pre></div><h5 id=b-二进制包>B. 二进制包</h5><p>解压 <code>xxx-hugegraph.tar.gz</code>后,进行如下检查:</p><ol><li>文件夹都带有 <code>incubating</code></li><li>存在 <code>LICENSE</code> + <code>NOTICE</code> 文件并且内容正常</li><li>服务启动</li></ol><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span><span style=color:#8f5902;font-style:italic># hugegraph-server</span>
</span></span><span style=display:flex><span>bin/start-hugegraph.sh
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#8f5902;font-style:italic># hugegraph-loader</span>
</span></span><span style=display:flex><span>bin/hugegraph-loader.sh -g hugegraph -f example/file/struct.json -s example/file/schema.groovy
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#8f5902;font-style:italic># hugegraph-hubble</span>
</span></span><span style=display:flex><span>bin/start-hubble.sh
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>更多参考官网: https://hugegraph.apache.org/cn/docs/quickstart
</span></span></code></pre></div><p><strong>注:</strong> 如果二进制包里面引入了第三方依赖, 则需要更新 LICENSE, 加入第三方依赖的 LICENSE; 若第三方依赖
LICENSE 是 Apache 2.0, 且对应的项目中包含了 NOTICE, 则还需要更新我们的 NOTICE 文件</p><h4 id=5-检查官网以及-github-等页面>5. 检查官网以及 github 等页面</h4><ol><li>确保官网至少满足 <a href=https://whimsy.apache.org/pods/project/hugegraph>apache website check</a>,
以及没有死链等</li><li>更新<strong>下载链接</strong>存在,以及版本更新说明页面更新</li><li>&mldr;</li></ol><h2 id=邮件模板>邮件模板</h2><p>检查完成后,你应该按不同角色回复邮件:(普通开发者 & PMC 成员)</p><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-markdown data-lang=markdown><span style=display:flex><span>[] +1 approve
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>[] +0 no opinion
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>[] -1 disapprove with the reason
</span></span></code></pre></div><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-markdown data-lang=markdown><span style=display:flex><span>+1 (non-binding)
</span></span><span style=display:flex><span>I checked:
</span></span><span style=display:flex><span><span style=color:#204a87;font-weight:700>1.</span> Download link/tag in mail are valid
</span></span><span style=display:flex><span><span style=color:#204a87;font-weight:700>2.</span> Checksum and GPG signatures are OK
</span></span><span style=display:flex><span><span style=color:#204a87;font-weight:700>3.</span> LICENSE <span style=color:#a40000>&amp;</span> NOTICE <span style=color:#a40000>&amp;</span> DISCLAIMER are exist
</span></span><span style=display:flex><span><span style=color:#204a87;font-weight:700>4.</span> Build successfully on XX OS version XXX
</span></span><span style=display:flex><span><span style=color:#204a87;font-weight:700>5.</span> No unexpected binary files
</span></span><span style=display:flex><span><span style=color:#204a87;font-weight:700>6.</span> Date is right in the NOTICE file
</span></span><span style=display:flex><span><span style=color:#204a87;font-weight:700>7.</span> Compile from source is fine under JavaX
</span></span><span style=display:flex><span><span style=color:#204a87;font-weight:700>8.</span> No empty file <span style=color:#a40000>&amp;</span> directory found
</span></span><span style=display:flex><span><span style=color:#204a87;font-weight:700>9.</span> Test running xxx service OK
</span></span><span style=display:flex><span><span style=color:#204a87;font-weight:700>10.</span> ....
</span></span></code></pre></div><p>特别注意 PMC 成员必须使用 <code>binding</code> 标记回复邮件,这对于统计有效投票很重要;</p><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-markdown data-lang=markdown><span style=display:flex><span>+1 (binding)
</span></span><span style=display:flex><span>I checked:
</span></span><span style=display:flex><span><span style=color:#204a87;font-weight:700>1.</span> Download link/tag in mail are valid
</span></span><span style=display:flex><span><span style=color:#204a87;font-weight:700>2.</span> Checksum and GPG signatures are OK
</span></span><span style=display:flex><span><span style=color:#204a87;font-weight:700>3.</span> LICENSE <span style=color:#a40000>&amp;</span> NOTICE <span style=color:#a40000>&amp;</span> DISCLAIMER are exist
</span></span><span style=display:flex><span><span style=color:#204a87;font-weight:700>4.</span> Build successfully on XX OS Version XX
</span></span><span style=display:flex><span><span style=color:#204a87;font-weight:700>5.</span> No unexpected binary files
</span></span><span style=display:flex><span><span style=color:#204a87;font-weight:700>6.</span> Date is right in the NOTICE file
</span></span><span style=display:flex><span><span style=color:#204a87;font-weight:700>7.</span> Compile from source is fine under JavaXX
</span></span><span style=display:flex><span><span style=color:#204a87;font-weight:700>8.</span> No empty file <span style=color:#a40000>&amp;</span> directory found
</span></span><span style=display:flex><span><span style=color:#204a87;font-weight:700>9.</span> Test running XXX service OK
</span></span><span style=display:flex><span><span style=color:#204a87;font-weight:700>10.</span> ....
</span></span></code></pre></div></div><div class=td-content style=page-break-before:always><h1 id=pg-c89774a4e231af418639f53a926ea188>4 - 在 IDEA 中配置 Server 开发环境</h1><blockquote><p>注意:下述配置仅供参考,基于<a href=https://github.com/apache/incubator-hugegraph/commit/a946ad1de4e8f922251a5241ffc957c33379677f>这个版本</a>,在 Linux 和 macOS 平台下进行了测试。</p></blockquote><h3 id=背景>背景</h3><p><a href=/docs/quickstart/hugegraph-server/>Quick Start</a> 部分已经介绍了使用<strong>脚本</strong>启停 HugeGraph-Server 的流程。下面以 Linux 平台为例,
介绍使用 <strong>IntelliJ IDEA</strong> 运行与调试 HugeGraph-Server 的流程。</p><p>本地启动的核心与<strong>脚本启动</strong>是一样的:</p><ol><li>初始化数据库后端,执行 <code>InitStore</code> 类初始化图</li><li>启动 HugeGraph-Server,执行 <code>HugeGraphServer</code> 类加载初始化的图信息启动</li></ol><p>在执行下述流程之前,请确保已经克隆了 HugeGraph 的源代码,并且已经配置了 Java 11 环境 & 可以参考这个
<a href=https://github.com/apache/incubator-hugegraph/wiki/The-style-config-for-HugeGraph-in-IDEA>配置文档</a></p><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span>git clone https://github.com/apache/hugegraph.git
</span></span></code></pre></div><h3 id=步骤>步骤</h3><h4 id=1-配置文件拷贝>1. 配置文件拷贝</h4><p>为了避免配置文件的更改影响 Git 的追踪,建议将所需的配置文件拷贝到一个单独的文件夹中:</p><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span>cp -r hugegraph-dist/src/assembly/static/scripts hugegraph-dist/src/assembly/static/conf path-to-your-directory
</span></span></code></pre></div><p><code>path-to-your-directory</code> 替换为你创建的文件夹的路径。</p><h4 id=2-initstore-类初始化图>2. <code>InitStore</code> 类初始化图</h4><p>首先,需要在配置文件中配置数据库后端。以 RocksDB 为例,在 <code>path-to-your-directory/conf/graphs/hugegraph.properties</code> 文件中进行以下配置:</p><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-fallback data-lang=fallback><span style=display:flex><span>backend=rocksdb
</span></span><span style=display:flex><span>serializer=binary
</span></span><span style=display:flex><span>rocksdb.data_path=.
</span></span><span style=display:flex><span>rocksdb.wal_path=.
</span></span></code></pre></div><p>然后,打开 IntelliJ IDEA 的 <code>Run/Debug Configurations</code> 面板,创建一个新的 Application 配置,按照以下步骤进行配置:</p><ul><li><code>Use classpath of module</code> 中选择 <code>hugegraph-dist</code></li><li><code>Main class</code> 设置为 <code>org.apache.hugegraph.cmd.InitStore</code></li><li>设置运行参数为 <code>conf/rest-server.properties</code>,这里的路径是相对于工作路径的,需要将工作路径设置为 <code>path-to-your-directory</code></li></ul><blockquote><p>若在 <strong>Java 11</strong> 环境下为 HugeGraph-Server 配置了<strong>用户认证</strong> (authenticator),需要参考二进制包的脚本<a href=https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-dist/src/assembly/static/bin/init-store.sh#L52>配置</a>,添加下述 <strong>VM options</strong>:</p><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span>--add-exports<span style=color:#ce5c00;font-weight:700>=</span>java.base/jdk.internal.reflect<span style=color:#ce5c00;font-weight:700>=</span>ALL-UNNAMED
</span></span></code></pre></div><p>否则会报错:</p><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#000>java</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>lang</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>reflect</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>InaccessibleObjectException</span><span style=color:#ce5c00;font-weight:700>:</span> <span style=color:#000>Unable</span> <span style=color:#000>to</span> <span style=color:#000>make</span> <span style=color:#204a87;font-weight:700>public</span> <span style=color:#204a87;font-weight:700>static</span> <span style=color:#204a87;font-weight:700>synchronized</span> <span style=color:#204a87;font-weight:700>void</span> <span style=color:#000>jdk</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>internal</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>reflect</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>Reflection</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>registerFieldsToFilter</span><span style=color:#ce5c00;font-weight:700>(</span><span style=color:#000>java</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>lang</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>Class</span><span style=color:#ce5c00;font-weight:700>,</span><span style=color:#000>java</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>lang</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>String</span><span style=color:#ce5c00;font-weight:700>[])</span> <span style=color:#000>accessible</span><span style=color:#ce5c00;font-weight:700>:</span> <span style=color:#000>module</span> <span style=color:#000>java</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>base</span> <span style=color:#000>does</span> <span style=color:#000>not</span> <span style=color:#4e9a06>&#34;exports jdk.internal.reflect&#34;</span> <span style=color:#000>to</span> <span style=color:#000>unnamed</span> <span style=color:#000>module</span> <span style=color:#5c35cc;font-weight:700>@xxx</span>
</span></span></code></pre></div></blockquote><p>配置完成后运行,如果运行成功,将会输出以下类似运行日志:</p><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#000>2023</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>06</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>05</span> <span style=color:#000>00</span><span style=color:#ce5c00;font-weight:700>:</span><span style=color:#000>43</span><span style=color:#ce5c00;font-weight:700>:</span><span style=color:#000>37</span> <span style=color:#ce5c00;font-weight:700>[</span><span style=color:#000>main</span><span style=color:#ce5c00;font-weight:700>]</span> <span style=color:#ce5c00;font-weight:700>[</span><span style=color:#000>INFO</span><span style=color:#ce5c00;font-weight:700>]</span> <span style=color:#000>o</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>a</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>h</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>u</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>ConfigUtil</span> <span style=color:#ce5c00;font-weight:700>-</span> <span style=color:#000>Scanning</span> <span style=color:#000>option</span> <span style=color:#a40000>&#39;</span><span style=color:#000>graphs</span><span style=color:#a40000>&#39;</span> <span style=color:#000>directory</span> <span style=color:#a40000>&#39;</span><span style=color:#ce5c00;font-weight:700>./</span><span style=color:#000>conf</span><span style=color:#ce5c00;font-weight:700>/</span><span style=color:#000>graphs</span><span style=color:#a40000>&#39;</span>
</span></span><span style=display:flex><span><span style=color:#000>2023</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>06</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>05</span> <span style=color:#000>00</span><span style=color:#ce5c00;font-weight:700>:</span><span style=color:#000>43</span><span style=color:#ce5c00;font-weight:700>:</span><span style=color:#000>37</span> <span style=color:#ce5c00;font-weight:700>[</span><span style=color:#000>main</span><span style=color:#ce5c00;font-weight:700>]</span> <span style=color:#ce5c00;font-weight:700>[</span><span style=color:#000>INFO</span><span style=color:#ce5c00;font-weight:700>]</span> <span style=color:#000>o</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>a</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>h</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>c</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>InitStore</span> <span style=color:#ce5c00;font-weight:700>-</span> <span style=color:#000>Init</span> <span style=color:#000>graph</span> <span style=color:#000>with</span> <span style=color:#000>config</span> <span style=color:#000>file</span><span style=color:#ce5c00;font-weight:700>:</span> <span style=color:#ce5c00;font-weight:700>./</span><span style=color:#000>conf</span><span style=color:#ce5c00;font-weight:700>/</span><span style=color:#000>graphs</span><span style=color:#ce5c00;font-weight:700>/</span><span style=color:#000>hugegraph</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>properties</span>
</span></span><span style=display:flex><span><span style=color:#ce5c00;font-weight:700>......</span>
</span></span><span style=display:flex><span><span style=color:#000>2023</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>06</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>05</span> <span style=color:#000>00</span><span style=color:#ce5c00;font-weight:700>:</span><span style=color:#000>43</span><span style=color:#ce5c00;font-weight:700>:</span><span style=color:#000>39</span> <span style=color:#ce5c00;font-weight:700>[</span><span style=color:#000>main</span><span style=color:#ce5c00;font-weight:700>]</span> <span style=color:#ce5c00;font-weight:700>[</span><span style=color:#000>INFO</span><span style=color:#ce5c00;font-weight:700>]</span> <span style=color:#000>o</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>a</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>h</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>b</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>s</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>r</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>RocksDBStore</span> <span style=color:#ce5c00;font-weight:700>-</span> <span style=color:#000>Write</span> <span style=color:#000>down</span> <span style=color:#000>the</span> <span style=color:#000>backend</span> <span style=color:#000>version</span><span style=color:#ce5c00;font-weight:700>:</span> <span style=color:#000>1</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>11</span>
</span></span><span style=display:flex><span><span style=color:#000>2023</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>06</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>05</span> <span style=color:#000>00</span><span style=color:#ce5c00;font-weight:700>:</span><span style=color:#000>43</span><span style=color:#ce5c00;font-weight:700>:</span><span style=color:#000>39</span> <span style=color:#ce5c00;font-weight:700>[</span><span style=color:#000>main</span><span style=color:#ce5c00;font-weight:700>]</span> <span style=color:#ce5c00;font-weight:700>[</span><span style=color:#000>INFO</span><span style=color:#ce5c00;font-weight:700>]</span> <span style=color:#000>o</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>a</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>h</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>StandardHugeGraph</span> <span style=color:#ce5c00;font-weight:700>-</span> <span style=color:#000>Graph</span> <span style=color:#a40000>&#39;</span><span style=color:#000>hugegraph</span><span style=color:#a40000>&#39;</span> <span style=color:#000>has</span> <span style=color:#000>been</span> <span style=color:#000>initialized</span>
</span></span><span style=display:flex><span><span style=color:#000>2023</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>06</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>05</span> <span style=color:#000>00</span><span style=color:#ce5c00;font-weight:700>:</span><span style=color:#000>43</span><span style=color:#ce5c00;font-weight:700>:</span><span style=color:#000>39</span> <span style=color:#ce5c00;font-weight:700>[</span><span style=color:#000>main</span><span style=color:#ce5c00;font-weight:700>]</span> <span style=color:#ce5c00;font-weight:700>[</span><span style=color:#000>INFO</span><span style=color:#ce5c00;font-weight:700>]</span> <span style=color:#000>o</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>a</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>h</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>StandardHugeGraph</span> <span style=color:#ce5c00;font-weight:700>-</span> <span style=color:#000>Close</span> <span style=color:#000>graph</span> <span style=color:#000>standardhugegraph</span><span style=color:#ce5c00;font-weight:700>[</span><span style=color:#000>hugegraph</span><span style=color:#ce5c00;font-weight:700>]</span>
</span></span><span style=display:flex><span><span style=color:#000>2023</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>06</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>05</span> <span style=color:#000>00</span><span style=color:#ce5c00;font-weight:700>:</span><span style=color:#000>43</span><span style=color:#ce5c00;font-weight:700>:</span><span style=color:#000>39</span> <span style=color:#ce5c00;font-weight:700>[</span><span style=color:#000>db</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>open</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>1</span><span style=color:#ce5c00;font-weight:700>]</span> <span style=color:#ce5c00;font-weight:700>[</span><span style=color:#000>INFO</span><span style=color:#ce5c00;font-weight:700>]</span> <span style=color:#000>o</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>a</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>h</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>b</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>s</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>r</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>RocksDBStore</span> <span style=color:#ce5c00;font-weight:700>-</span> <span style=color:#000>Opening</span> <span style=color:#000>RocksDB</span> <span style=color:#000>with</span> <span style=color:#000>data</span> <span style=color:#000>path</span><span style=color:#ce5c00;font-weight:700>:</span> <span style=color:#ce5c00;font-weight:700>./</span><span style=color:#000>m</span>
</span></span><span style=display:flex><span><span style=color:#000>2023</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>06</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>05</span> <span style=color:#000>00</span><span style=color:#ce5c00;font-weight:700>:</span><span style=color:#000>43</span><span style=color:#ce5c00;font-weight:700>:</span><span style=color:#000>39</span> <span style=color:#ce5c00;font-weight:700>[</span><span style=color:#000>db</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>open</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>1</span><span style=color:#ce5c00;font-weight:700>]</span> <span style=color:#ce5c00;font-weight:700>[</span><span style=color:#000>INFO</span><span style=color:#ce5c00;font-weight:700>]</span> <span style=color:#000>o</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>a</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>h</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>b</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>s</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>r</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>RocksDBStore</span> <span style=color:#ce5c00;font-weight:700>-</span> <span style=color:#000>Opening</span> <span style=color:#000>RocksDB</span> <span style=color:#000>with</span> <span style=color:#000>data</span> <span style=color:#000>path</span><span style=color:#ce5c00;font-weight:700>:</span> <span style=color:#ce5c00;font-weight:700>./</span><span style=color:#000>s</span>
</span></span><span style=display:flex><span><span style=color:#000>2023</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>06</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>05</span> <span style=color:#000>00</span><span style=color:#ce5c00;font-weight:700>:</span><span style=color:#000>43</span><span style=color:#ce5c00;font-weight:700>:</span><span style=color:#000>39</span> <span style=color:#ce5c00;font-weight:700>[</span><span style=color:#000>db</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>open</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>1</span><span style=color:#ce5c00;font-weight:700>]</span> <span style=color:#ce5c00;font-weight:700>[</span><span style=color:#000>INFO</span><span style=color:#ce5c00;font-weight:700>]</span> <span style=color:#000>o</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>a</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>h</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>b</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>s</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>r</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>RocksDBStore</span> <span style=color:#ce5c00;font-weight:700>-</span> <span style=color:#000>Opening</span> <span style=color:#000>RocksDB</span> <span style=color:#000>with</span> <span style=color:#000>data</span> <span style=color:#000>path</span><span style=color:#ce5c00;font-weight:700>:</span> <span style=color:#ce5c00;font-weight:700>./</span><span style=color:#000>g</span>
</span></span><span style=display:flex><span><span style=color:#000>2023</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>06</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>05</span> <span style=color:#000>00</span><span style=color:#ce5c00;font-weight:700>:</span><span style=color:#000>43</span><span style=color:#ce5c00;font-weight:700>:</span><span style=color:#000>39</span> <span style=color:#ce5c00;font-weight:700>[</span><span style=color:#000>main</span><span style=color:#ce5c00;font-weight:700>]</span> <span style=color:#ce5c00;font-weight:700>[</span><span style=color:#000>INFO</span><span style=color:#ce5c00;font-weight:700>]</span> <span style=color:#000>o</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>a</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>h</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>HugeFactory</span> <span style=color:#ce5c00;font-weight:700>-</span> <span style=color:#000>HugeFactory</span> <span style=color:#000>shutdown</span>
</span></span><span style=display:flex><span><span style=color:#000>2023</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>06</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>05</span> <span style=color:#000>00</span><span style=color:#ce5c00;font-weight:700>:</span><span style=color:#000>43</span><span style=color:#ce5c00;font-weight:700>:</span><span style=color:#000>39</span> <span style=color:#ce5c00;font-weight:700>[</span><span style=color:#000>hugegraph</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>shutdown</span><span style=color:#ce5c00;font-weight:700>]</span> <span style=color:#ce5c00;font-weight:700>[</span><span style=color:#000>INFO</span><span style=color:#ce5c00;font-weight:700>]</span> <span style=color:#000>o</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>a</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>h</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>HugeFactory</span> <span style=color:#ce5c00;font-weight:700>-</span> <span style=color:#000>HugeGraph</span> <span style=color:#000>is</span> <span style=color:#000>shutting</span> <span style=color:#000>down</span>
</span></span></code></pre></div><h4 id=3-运行-hugegraphserver>3. 运行 <code>HugeGraphServer</code></h4><p>类似地,打开 IntelliJ IDEA 的 <code>Run/Debug Configurations</code> 面板,创建一个新的 <code>Application</code> 配置,按照以下步骤进行配置:</p><ul><li><code>Use classpath of module</code> 中选择 <code>hugegraph-dist</code></li><li><code>Main class</code> 设置为 <code>org.apache.hugegraph.dist.HugeGraphServer</code></li><li>设置运行参数为 <code>conf/gremlin-server.yaml conf/rest-server.properties</code>,同样地,这里的路径是相对于工作路径的,需要将工作路径设置为 <code>path-to-your-directory</code></li></ul><blockquote><p>类似的,若在 <strong>Java 11</strong> 环境下为 HugeGraph-Server 配置了<strong>用户认证</strong> (authenticator),同样需要参考二进制包的脚本<a href=https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-dist/src/assembly/static/bin/hugegraph-server.sh#L124>配置</a>,添加下述 <strong>VM options</strong>:</p><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span>--add-exports<span style=color:#ce5c00;font-weight:700>=</span>java.base/jdk.internal.reflect<span style=color:#ce5c00;font-weight:700>=</span>ALL-UNNAMED --add-modules<span style=color:#ce5c00;font-weight:700>=</span>jdk.unsupported --add-exports<span style=color:#ce5c00;font-weight:700>=</span>java.base/sun.nio.ch<span style=color:#ce5c00;font-weight:700>=</span>ALL-UNNAMED
</span></span></code></pre></div><p>否则会报错:</p><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#000>java</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>lang</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>reflect</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>InaccessibleObjectException</span><span style=color:#ce5c00;font-weight:700>:</span> <span style=color:#000>Unable</span> <span style=color:#000>to</span> <span style=color:#000>make</span> <span style=color:#204a87;font-weight:700>public</span> <span style=color:#204a87;font-weight:700>static</span> <span style=color:#204a87;font-weight:700>synchronized</span> <span style=color:#204a87;font-weight:700>void</span> <span style=color:#000>jdk</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>internal</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>reflect</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>Reflection</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>registerFieldsToFilter</span><span style=color:#ce5c00;font-weight:700>(</span><span style=color:#000>java</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>lang</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>Class</span><span style=color:#ce5c00;font-weight:700>,</span><span style=color:#000>java</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>lang</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>String</span><span style=color:#ce5c00;font-weight:700>[])</span> <span style=color:#000>accessible</span><span style=color:#ce5c00;font-weight:700>:</span> <span style=color:#000>module</span> <span style=color:#000>java</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>base</span> <span style=color:#000>does</span> <span style=color:#000>not</span> <span style=color:#4e9a06>&#34;exports jdk.internal.reflect&#34;</span> <span style=color:#000>to</span> <span style=color:#000>unnamed</span> <span style=color:#000>module</span> <span style=color:#5c35cc;font-weight:700>@xxx</span>
</span></span></code></pre></div></blockquote><p>配置完成后运行,如果看到以下类似日志,表示 <code>HugeGraphServer</code> 已经成功启动:</p><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#ce5c00;font-weight:700>......</span>
</span></span><span style=display:flex><span><span style=color:#000>2023</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>06</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>05</span> <span style=color:#000>00</span><span style=color:#ce5c00;font-weight:700>:</span><span style=color:#000>51</span><span style=color:#ce5c00;font-weight:700>:</span><span style=color:#000>56</span> <span style=color:#ce5c00;font-weight:700>[</span><span style=color:#000>gremlin</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>server</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>boss</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>1</span><span style=color:#ce5c00;font-weight:700>]</span> <span style=color:#ce5c00;font-weight:700>[</span><span style=color:#000>INFO</span><span style=color:#ce5c00;font-weight:700>]</span> <span style=color:#000>o</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>a</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>t</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>g</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>s</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>GremlinServer</span> <span style=color:#ce5c00;font-weight:700>-</span> <span style=color:#000>Gremlin</span> <span style=color:#000>Server</span> <span style=color:#000>configured</span> <span style=color:#000>with</span> <span style=color:#000>worker</span> <span style=color:#000>thread</span> <span style=color:#000>pool</span> <span style=color:#000>of</span> <span style=color:#000>1</span><span style=color:#ce5c00;font-weight:700>,</span> <span style=color:#000>gremlin</span> <span style=color:#000>pool</span> <span style=color:#000>of</span> <span style=color:#000>8</span> <span style=color:#000>and</span> <span style=color:#000>boss</span> <span style=color:#000>thread</span> <span style=color:#000>pool</span> <span style=color:#000>of</span> <span style=color:#000>1</span><span style=color:#ce5c00;font-weight:700>.</span>
</span></span><span style=display:flex><span><span style=color:#000>2023</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>06</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>05</span> <span style=color:#000>00</span><span style=color:#ce5c00;font-weight:700>:</span><span style=color:#000>51</span><span style=color:#ce5c00;font-weight:700>:</span><span style=color:#000>56</span> <span style=color:#ce5c00;font-weight:700>[</span><span style=color:#000>gremlin</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>server</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>boss</span><span style=color:#ce5c00;font-weight:700>-</span><span style=color:#000>1</span><span style=color:#ce5c00;font-weight:700>]</span> <span style=color:#ce5c00;font-weight:700>[</span><span style=color:#000>INFO</span><span style=color:#ce5c00;font-weight:700>]</span> <span style=color:#000>o</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>a</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>t</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>g</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>s</span><span style=color:#ce5c00;font-weight:700>.</span><span style=color:#c4a000>GremlinServer</span> <span style=color:#ce5c00;font-weight:700>-</span> <span style=color:#000>Channel</span> <span style=color:#000>started</span> <span style=color:#000>at</span> <span style=color:#000>port</span> <span style=color:#000>8182</span><span style=color:#ce5c00;font-weight:700>.</span>
</span></span></code></pre></div><h4 id=4-调试-hugegraphserver-可选>4. 调试 <code>HugeGraphServer</code> (可选)</h4><p>在完成上述配置后,可以尝试对 <code>HugeGraphServer</code> 进行调试。在调试模式下运行 <code>HugeGraphServer</code>,并在以下<a href=https://github.com/apache/hugegraph/blob/a946ad1de4e8f922251a5241ffc957c33379677f/hugegraph-api/src/main/java/org/apache/hugegraph/api/graph/VertexAPI.java#L238>位置</a>设置断点:</p><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#204a87;font-weight:700>public</span> <span style=color:#000>String</span> <span style=color:#000>list</span><span style=color:#ce5c00;font-weight:700>(</span><span style=color:#5c35cc;font-weight:700>@Context</span> <span style=color:#000>GraphManager</span> <span style=color:#000>manager</span><span style=color:#ce5c00;font-weight:700>,</span>
</span></span><span style=display:flex><span> <span style=color:#5c35cc;font-weight:700>@PathParam</span><span style=color:#ce5c00;font-weight:700>(</span><span style=color:#4e9a06>&#34;graph&#34;</span><span style=color:#ce5c00;font-weight:700>)</span> <span style=color:#000>String</span> <span style=color:#000>graph</span><span style=color:#ce5c00;font-weight:700>,</span> <span style=color:#5c35cc;font-weight:700>@QueryParam</span><span style=color:#ce5c00;font-weight:700>(</span><span style=color:#4e9a06>&#34;label&#34;</span><span style=color:#ce5c00;font-weight:700>)</span> <span style=color:#000>String</span> <span style=color:#000>label</span><span style=color:#ce5c00;font-weight:700>,</span>
</span></span><span style=display:flex><span> <span style=color:#5c35cc;font-weight:700>@QueryParam</span><span style=color:#ce5c00;font-weight:700>(</span><span style=color:#4e9a06>&#34;properties&#34;</span><span style=color:#ce5c00;font-weight:700>)</span> <span style=color:#000>String</span> <span style=color:#000>properties</span><span style=color:#ce5c00;font-weight:700>,</span> <span style=color:#ce5c00;font-weight:700>......)</span> <span style=color:#ce5c00;font-weight:700>{</span>
</span></span><span style=display:flex><span> <span style=color:#8f5902;font-style:italic>// ignore log
</span></span></span><span style=display:flex><span><span style=color:#8f5902;font-style:italic></span> <span style=color:#000>Map</span><span style=color:#ce5c00;font-weight:700>&lt;</span><span style=color:#000>String</span><span style=color:#ce5c00;font-weight:700>,</span> <span style=color:#000>Object</span><span style=color:#ce5c00;font-weight:700>&gt;</span> <span style=color:#000>props</span> <span style=color:#ce5c00;font-weight:700>=</span> <span style=color:#000>parseProperties</span><span style=color:#ce5c00;font-weight:700>(</span><span style=color:#000>properties</span><span style=color:#ce5c00;font-weight:700>);</span>
</span></span></code></pre></div><p>然后,使用 RESTful API 请求 <code>HugeGraphServer</code></p><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span>curl <span style=color:#4e9a06>&#34;http://localhost:8080/graphs/hugegraph/graph/vertices&#34;</span> <span style=color:#000;font-weight:700>|</span> gunzip
</span></span></code></pre></div><p>此时,可以在调试器中查看详细的变量信息。</p><h4 id=5-log4j2-日志配置>5. Log4j2 日志配置</h4><p>默认情况下,运行 <code>InitStore</code><code>HugeGraphServer</code> 时,读取的 Log4j2 配置文件路径为 <code>hugegraph-dist/src/main/resources/log4j2.xml</code>,而不是 <code>path-to-your-directory/conf/log4j2.xml</code>,这个配置文件是使用<strong>脚本</strong>启动 HugeGraph-Server 时读取的。</p><p>为了避免同时维护两份配置文件,可以考虑在 <strong>IntelliJ IDEA</strong> 运行与调试 HugeGraph-Server 时,修改读取的 Log4j2 配置文件路径:</p><ol><li>打开之前创建的 <code>Application</code> 配置</li><li>点击 <code>Modify options</code> - <code>Add VM options</code></li><li>设置 VM options 为 <code>-Dlog4j.configurationFile=conf/log4j2.xml</code></li></ol><h3 id=可能遇到的问题>可能遇到的问题</h3><h4 id=1-java-package-sunmisc-does-not-exist>1. java: package sun.misc does not exist</h4><p>原因可能是在使用 <strong>Java 11</strong> 编译时触发了交叉编译,导致项目中使用的 <code>sun.misc.Unsafe</code> 找不到符号。有两种解决方案可供选择:</p><ol><li>在 IntelliJ IDEA 的 <code>Preferences/Settings</code> 中找到 <code>Java Compiler</code> 面板,然后关闭 <code>--release</code> 选项 (推荐)</li><li>或者将项目的 SDK 版本设置为 8 (Deprecated soon)</li></ol><h4 id=2-java-storeraftrpcraftrequests-does-not-exist-rpc-generated-files>2. java: *.store.raft.rpc.RaftRequests does not exist (RPC Generated Files)</h4><p>原因是源代码没有包含 <code>RPC-generated</code> 文件。可以尝试两种方法来解决:</p><ol><li>[命令] 在根目录下运行 <code>mvn clean compile -DskipTests</code> (<strong>推荐</strong>)</li><li>[UI] 在 IDEA 中,右键点击 <code>hugegraph</code> 模块,选择 <code>Manve -> Generate Sources and Update Folders</code></li></ol><h4 id=3-log4j2-日志无法打印-l-等位置信息>3. Log4j2 日志无法打印 %l 等位置信息</h4><p>这是因为 Log4j2 中使用了 asynchronous loggers,可以参考<a href=https://logging.apache.org/log4j/2.x/manual/layouts.html#LocationInformation>官方文档</a>进行配置</p><hr><h5 id=参考>参考</h5><ol><li><a href=/docs/quickstart/hugegraph-server/>HugeGraph-Server Quick Start</a></li><li><a href=https://gist.github.com/imbajin/1661450f000cd62a67e46d4f1abfe82c>hugegraph-server 本地调试文档 (Win/Unix)</a></li><li><a href=https://youtrack.jetbrains.com/issue/IDEA-180033>&ldquo;package sun.misc does not exist&rdquo; compilation error</a></li><li><a href=https://youtrack.jetbrains.com/issue/IDEA-201168>Cannot compile: java: package sun.misc does not exist</a></li><li><a href=https://github.com/apache/incubator-hugegraph/wiki/The-style-config-for-HugeGraph-in-IDEA>The code-style config for HugeGraph in IDEA</a></li></ol></div><div class=td-content style=page-break-before:always><h1 id=pg-e1fc3666faccec72ead94a2ed6a9f8a3>5 - Apache HugeGraph Committer 指南</h1><blockquote><p>本文档概述了 Apache Committer 推选要求以及流程,对应的 ASF 官方文档可见:https://community.apache.org/newcommitter.html</p></blockquote><h1 id=候选人要求>候选人要求</h1><ol><li>候选人应遵守 <a href=https://www.apache.org/foundation/policies/conduct.html>Apache Code of Conduct</a></li><li>PMC 成员将通过搜索<a href=https://lists.apache.org/list?dev@hugegraph.apache.org>邮件列表</a><a href=https://github.com/apache/hugegraph/issues>issues</a><a href=https://github.com/apache/incubator-hugegraph/pulls>PRs</a><a href=https://hugegraph.apache.org/docs>官网文档</a>等方式,了解候选人如何与他人互动,以及他们所做的贡献</li><li>以下是在评估候选人是否适合成为 Committer 时需要考虑的一些要点:<ol><li>与社区成员合作的能力</li><li>担任导师的能力</li><li>社区参与度</li><li>贡献程度</li><li>个人技能/能力</li></ol></li></ol><h1 id=推选详细流程>推选详细流程</h1><p><strong>讨论 (DISCUSS) → 投票 (VOTE) → 邀请 (INVITE) → 公告 (ANNOUNCE)</strong></p><h2 id=1-发起社区邮件讨论-discuss>1. 发起社区邮件讨论 (DISCUSS)</h2><p>任何 HugeGraph 的 (P)PMC 成员都可以发起投票讨论,在发现社区贡献者任何有价值的贡献并取得候选人本人同意后,可以在 <a href=mailto:private@hugegraph.apache.org>private@hugegraph.apache.org</a> 发起讨论。
讨论邮件里提议者要把候选人的贡献说清楚,并最好给出确认贡献的 URL 等信息,便于大家讨论分析。</p><p>下面是 HugeGraph 对应的邮件模板:(仅供参考)</p><blockquote><p>Note: 后续将使用 xxx 指代候选人名,一般 <code>xxx</code> 为一个容易读的名字 (例如 <code>Simon Jay</code>)</p><p><code>ASF-INFRA</code> 建议<strong>避免</strong>使用不易读的 <code>ID</code> 直接作为邮件<strong>人名代指</strong> (例如<strong>避免</strong> <code>simon321</code><code>wh0isSim0n</code> 😄)</p><p>另发送邮件最好选择 <strong>&ldquo;纯文本&rdquo;</strong> 模式,否则排版在 ASF Mail UI 中可能会乱</p></blockquote><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-markdown data-lang=markdown><span style=display:flex><span>To: private@hugegraph.apache.org
</span></span><span style=display:flex><span>Subject: [DISCUSS] XXX as a HugeGraph Committer Candidate
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>Hi all:
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>I am pleased to nominate xxx for the role of HugeGraph Committer based on his/her contributions over the past few months.
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>[ Candidate&#39;s Contribution Summary ]
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>Here are the relevant PRs (issues) he/she has participated in:
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#000;font-weight:700>**Core Features:**</span>
</span></span><span style=display:flex><span><span style=color:#204a87;font-weight:700>-</span> Feature 1: [ Reference Links ]
</span></span><span style=display:flex><span><span style=color:#204a87;font-weight:700>-</span> ...
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#000;font-weight:700>**Fix/Chore/Release:**</span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#000;font-weight:700>**Doc:**</span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>[ Candidate&#39;s Current Notable Contributions ]
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>His/Her contributions bring the following benefits to the community, helping us in the following ways:
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>[ Candidate&#39;s Contributions and Benefits to the Community ]
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>In view of the above contributions, I elect xxx as Committer of the HugeGraph project.
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>[ Reference Links ]
</span></span><span style=display:flex><span><span style=color:#204a87;font-weight:700>1.</span> PR1
</span></span><span style=display:flex><span><span style=color:#204a87;font-weight:700>2.</span> PR2
</span></span><span style=display:flex><span><span style=color:#204a87;font-weight:700>3.</span> ...
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>Welcome everyone to share opinions~
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>Thanks!
</span></span></code></pre></div><p>对于讨论邮件中贡献链接,可以使用 <a href=https://github.com/search>GitHub Search</a> 的统计功能,按需输入如下对应关键词查询即可,可以在此基础上添加新的 repo 如 <code>repo:apache/incubator-hugegraph-computer</code>,特别注意调整<strong>时间范围</strong> (下面是一个模板参考,请自行调整参数):</p><ul><li>PR 提交次数<ul><li><code>is:pr author:xxx repo:apache/incubator-hugegraph repo:apache/incubator-hugegraph-doc created:>2023-06-01 updated:&lt;2023-12-25</code></li></ul></li><li>代码提交/修改行数<ul><li><a href="https://github.com/apache/incubator-hugegraph/graphs/contributors?from=2023-06-01&to=2023-12-25&type=c">https://github.com/apache/incubator-hugegraph/graphs/contributors?from=2023-06-01&to=2023-12-25&type=c</a></li><li><a href="https://github.com/apache/incubator-hugegraph-doc/graphs/contributors?from=2023-06-01&to=2023-12-25&type=c">https://github.com/apache/incubator-hugegraph-doc/graphs/contributors?from=2023-06-01&to=2023-12-25&type=c</a></li></ul></li><li>PR 提交关联 Issue 次数<ul><li><code>linked:issue involves:xxx repo:apache/incubator-hugegraph repo:apache/incubator-hugegraph-doc created:>2023-06-01 updated:&lt;2023-12-25</code></li></ul></li><li>PR Review 个数<ul><li><code>type:pr reviewed-by:xxx repo:apache/incubator-hugegraph repo:apache/incubator-hugegraph-doc created:>2023-06-01 updated:&lt;2023-12-25</code></li></ul></li><li>PR Review 行数</li><li>合并次数<ul><li><code>type:pr author:xxx repo:apache/incubator-hugegraph repo:apache/incubator-hugegraph-doc created:>2023-06-01 updated:&lt;2023-12-25</code></li></ul></li><li>有效合并行数<ul><li><a href="https://github.com/apache/incubator-hugegraph/graphs/contributors?from=2023-06-01&to=2023-12-25&type=c">https://github.com/apache/incubator-hugegraph/graphs/contributors?from=2023-06-01&to=2023-12-25&type=c</a></li><li><a href="https://github.com/apache/incubator-hugegraph-doc/graphs/contributors?from=2023-06-01&to=2023-12-25&type=c">https://github.com/apache/incubator-hugegraph-doc/graphs/contributors?from=2023-06-01&to=2023-12-25&type=c</a></li></ul></li><li>Issue 提交数<ul><li><code>type:issue author:xxx repo:apache/incubator-hugegraph repo:apache/incubator-hugegraph-doc created:>2023-06-01 updated:&lt;2023-12-25</code></li></ul></li><li>Issue 修复数<ul><li>在 Issue 提交数的基础上选取状态为 closed 的 Issues</li></ul></li><li>Issue 参与数<ul><li><code>type:issue involves:xxx repo:apache/incubator-hugegraph repo:apache/incubator-hugegraph-doc created:>2023-06-01 updated:&lt;2023-12-25</code></li></ul></li><li>评论 Issue 数<ul><li><code>type:issue commenter:xxx repo:apache/incubator-hugegraph repo:apache/incubator-hugegraph-doc created:>2023-06-01 updated:&lt;2023-12-25</code></li></ul></li><li>评论 PR 数<ul><li><code>type:pr commenter:xxx repo:apache/incubator-hugegraph repo:apache/incubator-hugegraph-doc created:>2023-06-01 updated:&lt;2023-12-25</code></li></ul></li></ul><p>Mailing Lists 的参与则可使用 <a href="https://lists.apache.org/list?dev@hugegraph.apache.org:lte=10M:xxx">https://lists.apache.org/list?dev@hugegraph.apache.org:lte=10M:xxx</a> 查询。</p><h2 id=2-发起社区邮件投票-vote>2. 发起社区邮件投票 (VOTE)</h2><p>如果讨论邮件在规定时间内没有收到分歧信息,投票发起者需要在 <a href=mailto:private@hugegraph.apache.org>private@hugegraph.apache.org</a> 发起对 Committer 的选举投票。</p><p>下面是对应的邮件模板:</p><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-text data-lang=text><span style=display:flex><span>To: private@hugegraph.apache.org
</span></span><span style=display:flex><span>Subject: [VOTE] xxx as a HugeGraph Committer
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>Hi all:
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>Through the discussion of last week:
</span></span><span style=display:flex><span>[ Discussion Mailing List Link ]
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>We have discussed and listed what xxx participated in the HugeGraph community.
</span></span><span style=display:flex><span>I believe making him/her a Committer will enhance the work for HugeGraph.
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>So, I am happy to call VOTE to accept xxx as a HugeGraph Committer.
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>Voting will continue for at least 72 hours or until the required number of votes is reached.
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>Please vote accordingly:
</span></span><span style=display:flex><span>[ ] +1 approve
</span></span><span style=display:flex><span>[ ] +0 no opinion
</span></span><span style=display:flex><span>[ ] -1 disapprove with the reason
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>Thanks!
</span></span></code></pre></div><p>然后 (P)PMC 成员回复 +1 或 -1 的邮件回复表达意见,一般来说至少需要 ≥3 票 +1 才能结束投票。</p><h2 id=宣布投票结果-result>宣布投票结果 (RESULT)</h2><p>投票邮件结束后,投票发起者需要邮件里提醒投票结束。同时,投票发起者需要发起邮件宣布投票结果,发送至 <a href=mailto:private@hugegraph.apache.org>private@hugegraph.apache.org</a>,邮件模板可参考:</p><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-text data-lang=text><span style=display:flex><span>To: private@hugegraph.apache.org
</span></span><span style=display:flex><span>Subject: [RESULTS][VOTE] xxx as a HugeGraph Committer
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>Hi all: The vote for &#34;xxx&#34; as an HugeGraph Committer has PASSED and closed now.
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>The result is as follows: X PMC +1 Votes:
</span></span><span style=display:flex><span>- A (PMC ID)
</span></span><span style=display:flex><span>- B
</span></span><span style=display:flex><span>- C...
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>Vote thread:
</span></span><span style=display:flex><span>put vote thread link here
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>Then I&#39;m going to invite xxx to join us soon. Thanks for everyone&#39;s support!
</span></span></code></pre></div><h2 id=向候选人发起邮件邀请-invite>向候选人发起邮件邀请 (INVITE)</h2><p>宣布投票结果邮件发出后,投票发起人要给候选人发送邀请邮件。邀请邮件主送候选人,抄送 <a href=mailto:private@hugegraph.apache.org>private@hugegraph.apache.org</a>,被邀请的候选人必须通过指定的邮箱地址回复接受或者拒绝该邀请。</p><p>下面是对应可参考的邮件模板:</p><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-text data-lang=text><span style=display:flex><span>To: [ Candidate&#39;s Email ]
</span></span><span style=display:flex><span>Cc: private@hugegraph.apache.org
</span></span><span style=display:flex><span>Subject: Invitation to become HugeGraph committer: xxx
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>Hello xxx,
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>The HugeGraph Project Management Committee (PPMC)
</span></span><span style=display:flex><span>hereby offers you committer privileges to the project.
</span></span><span style=display:flex><span>These privileges are offered on the understanding that you&#39;ll use them
</span></span><span style=display:flex><span>reasonably and with common sense. We like to work on trust
</span></span><span style=display:flex><span>rather than unnecessary constraints.
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>Being a committer enables you to more easily make
</span></span><span style=display:flex><span>changes without needing to go through the patch
</span></span><span style=display:flex><span>submission process.
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>Being a committer does not require you to
</span></span><span style=display:flex><span>participate any more than you already do. It does
</span></span><span style=display:flex><span>tend to make one even more committed. You will
</span></span><span style=display:flex><span>probably find that you spend more time here.
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>Of course, you can decline and instead remain as a
</span></span><span style=display:flex><span>contributor, participating as you do now.
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>A. This personal invitation is a chance for you to
</span></span><span style=display:flex><span>accept or decline in private. Either way, please
</span></span><span style=display:flex><span>let us know in reply to the private@hugegraph.apache.org
</span></span><span style=display:flex><span>address only.
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>B. If you accept, the next step is to register an iCLA:
</span></span><span style=display:flex><span> 1. Details of the iCLA and the forms are found
</span></span><span style=display:flex><span> through this link: https://www.apache.org/licenses/#clas
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> 2. Instructions for its completion and return to
</span></span><span style=display:flex><span> the Secretary of the ASF are found at
</span></span><span style=display:flex><span> https://www.apache.org/licenses/#submitting
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> 3. When you transmit the completed iCLA, request
</span></span><span style=display:flex><span> to notify the Apache HugeGraph project and choose a
</span></span><span style=display:flex><span> unique Apache ID. Look to see if your preferred
</span></span><span style=display:flex><span> ID is already taken at
</span></span><span style=display:flex><span> https://people.apache.org/committer-index.html
</span></span><span style=display:flex><span> This will allow the Secretary to notify the PMC
</span></span><span style=display:flex><span> when your iCLA has been recorded.
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>When recording of your iCLA is noted, you will
</span></span><span style=display:flex><span>receive a follow-up message with the next steps for
</span></span><span style=display:flex><span>establishing you as a committer.
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>With the expectation of your acceptance, welcome!
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>The Apache HugeGraph(incubating) PPMC
</span></span></code></pre></div><h2 id=候选人接受邀请-accept>候选人接受邀请 (ACCEPT)</h2><p>候选人应回复上述邮件 (选择 <strong>reply all</strong>),表明接受邀请,邮件模板可参考:</p><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-text data-lang=text><span style=display:flex><span>To: [ Sender&#39;s Email ]
</span></span><span style=display:flex><span>Cc: private@hugegraph.apache.org
</span></span><span style=display:flex><span>Subject: Re: Invitation to become HugeGraph committer: xxx
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>Hello Apache HugeGraph(incubating) PPMC,
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>I accept the invitation.
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>Thanks to the Apache HugeGraph Community for recognizing my work, I
</span></span><span style=display:flex><span>will continue to actively participate in the work of the Apache
</span></span><span style=display:flex><span>HugeGraph(incubating).
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>Next, I will follow the instructions to complete the next steps:
</span></span><span style=display:flex><span>Signing and submitting iCLA and registering Apache ID.
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>xxx
</span></span></code></pre></div><p>当然,候选人也可以选择拒绝邀请,这里就没有模板了:)</p><p>一旦邀请被接受,候选人需要完成以下事项:</p><ul><li>订阅 <a href=mailto:dev@hugegraph.apache.org>dev@hugegraph.apache.org</a>,具体步骤/过滤等配置请参考<a href=https://hugegraph.apache.org/docs/contribution-guidelines/subscribe/>文档</a></li><li>签署 <a href=https://www.apache.org/licenses/icla.pdf>ICLA</a>,具体步骤见下↓</li></ul><h3 id=icla-签署流程>ICLA 签署流程</h3><ol><li>下载 <a href=https://www.apache.org/licenses/icla.pdf>ICLA</a></li><li>打开 PDF 并填写相关内容,均需要全英文填写,建议使用 PDF 工具编辑并署名<ol><li><strong>Full name</strong>: 名字在前,姓氏在后</li><li><strong>Public name</strong>: 可以不填,默认和 <code>Full name</code> 相同</li><li>勾选 check this box only if you enter names with your family name first</li><li><strong>Postal Address</strong>: 英文地址,从小地方到大地方的顺序来写,需详细到门牌号</li><li><strong>Country:</strong> 所在国家英文</li><li><strong>E-mail</strong>: 邮箱地址,建议与上述邮件中使用的邮箱相同</li><li><strong>(optional) preferred Apache id(s)</strong>: 选择一个 <a href=http://people.apache.org/committer-index.html>Apache committer</a> 页面不存在的 <strong>SVN ID</strong></li><li><strong>(optional) notify project</strong>:Apache HugeGraph(incubating)</li><li><strong>签名:务必使用 PDF 工具手写</strong></li><li><strong>Date:</strong> 格式 xxxx-xx-xx</li></ol></li><li>签署完之后将 <code>icla.pdf</code> 重命名为 <code>姓名拼音-icla.pdf</code></li><li>发送下述邮件,并附件引用 <code>姓名拼音-icla.pdf</code></li></ol><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-text data-lang=text><span style=display:flex><span>To: secretary@apache.org
</span></span><span style=display:flex><span>Subject: ICLA Information
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>Hello everyone:
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>I have accepted the Apache HugeGraph(incubating) PPMC invitation to
</span></span><span style=display:flex><span>become a HugeGraph committer, the attachment is my ICLA information.
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>(Optional) My GitHub account is https://github.com/xxx. Thanks!
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>xxx
</span></span></code></pre></div><blockquote><p>更多注意事项可参考 <a href=https://github.com/apache/hugegraph/issues/1732>https://github.com/apache/hugegraph/issues/1732</a></p></blockquote><p>PMC 成员将等待 <code>Apache secretary</code> 团队确认 <code>ICLA</code> 备案,候选人和 PMC 成员将收到以下电子邮件:</p><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-text data-lang=text><span style=display:flex><span>Dear xxx,
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>This message acknowledges receipt of your ICLA, which has been filed in the Apache Software Foundation records.
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>Your account (with id xxx) has been requested for you and you should receive email with next steps
</span></span><span style=display:flex><span>within the next few days (this process can take up to a week).
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>Please refer to https://www.apache.org/foundation/how-it-works.html#developers
</span></span><span style=display:flex><span>for more information about roles at Apache.
</span></span></code></pre></div><h3 id=设置-apache-账号和开发环境-config>设置 Apache 账号和开发环境 (CONFIG)</h3><p>备案完成后,候选人将收到来自 <a href=mailto:root@apache.org>root@apache.org</a> 主题为 <code>Welcome to the Apache Software Foundation</code> 的邮件,此时需按照邮件中的步骤设置 Apache 账号和开发环境:</p><ol><li>重置密码 <a href=https://id.apache.org/reset/enter>https://id.apache.org/reset/enter</a></li><li>配置个人信息 <a href=https://whimsy.apache.org/roster/committer/xxx>https://whimsy.apache.org/roster/committer/xxx</a></li><li>关联 GitHub 账号 <a href=https://gitbox.apache.org/boxer>https://gitbox.apache.org/boxer</a><ol><li>这一步需要配置 GitHub 双重身份验证 (2FA)</li></ol></li><li><strong>负责提名的 PMC 成员需通过 <a href=https://whimsy.apache.org/roster/ppmc/hugegraph>Roster</a> 页面,将新的 Committer 添加到官方提交者列表中</strong> (<strong>重要</strong>, 否则仓库权限不生效)<ol><li>在这一步后,候选人即新的 Committer 才拥有对 GitHub HugeGraph 仓库的写权限</li></ol></li><li>(可选) 新的 Committer 可以使用 Apache 账号<a href=https://www.jetbrains.com/shop/eform/apache>申请</a>免费使用 Jetbrains 的全系列产品</li></ol><h2 id=发布公告邮件-announce>发布公告邮件 (ANNOUNCE)</h2><p>当候选人完成上述步骤后,候选人将正式成为 HugeGraph 的 Committer,此时需要向 <a href=mailto:dev@hugegraph.apache.org>dev@hugegraph.apache.org</a> 发送公告邮件,邮件模板可参考:</p><div class=highlight><pre tabindex=0 style=background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-text data-lang=text><span style=display:flex><span>To: dev@hugegraph.apache.org
</span></span><span style=display:flex><span>Subject: [ANNOUNCE] New Committer: xxx
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>Hi everyone, The PPMC for Apache HugeGraph(incubating) has invited xxx to
</span></span><span style=display:flex><span>become a Committer and we are pleased to announce that he/she has accepted.
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>xxx is being active in the HugeGraph community &amp; dedicated to ... modules,
</span></span><span style=display:flex><span>and we are glad to see his/her more interactions with the community in the future.
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>(Optional) His/Her GitHub account is https://github.com/xxx
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>Welcome xxx, and please enjoy your community journey~
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>Thanks!
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>The Apache HugeGraph PPMC
</span></span></code></pre></div><h1 id=参考>参考</h1><ol><li><a href=https://community.apache.org/newcommitter.html>https://community.apache.org/newcommitter.html</a> (ASF 官方文档)</li><li><a href=https://infra.apache.org/new-committers-guide.html>https://infra.apache.org/new-committers-guide.html</a></li><li><a href=https://www.apache.org/dev/pmc.html#newcommitter>https://www.apache.org/dev/pmc.html#newcommitter</a></li><li><a href=https://linkis.apache.org/zh-CN/community/how-to-vote-a-committer-pmc>https://linkis.apache.org/zh-CN/community/how-to-vote-a-committer-pmc</a></li><li><a href=https://www.apache.org/licenses/contributor-agreements.html#submitting>https://www.apache.org/licenses/contributor-agreements.html#submitting</a></li><li><a href=https://www.apache.org/licenses/cla-faq.html#printer>https://www.apache.org/licenses/cla-faq.html#printer</a></li><li><a href=https://linkis.apache.org/zh-CN/community/how-to-sign-apache-icla>https://linkis.apache.org/zh-CN/community/how-to-sign-apache-icla</a></li><li><a href=https://github.com/apache/hugegraph/issues/1732>https://github.com/apache/hugegraph/issues/1732</a> (HugeGraph ICLA related issue)</li></ol></div></main></div></div><footer class="bg-dark py-3 row d-print-none"><div class=footer-container><div class="row bg-dark"><div class=col-1></div><div class="col-4 text-center container-center"><div class=footer-row><a href=https://www.apache.org><div class=footer-apache-logo><svg id="Layer_2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 7127.6 2890" enable-background="new 0 0 7127.6 2890"><path fill="#6d6e71" d="M7104.7 847.8c15.3 15.3 22.9 33.7 22.9 55.2s-7.6 39.9-22.9 55.4c-15.3 15.4-33.8 23.1-55.6 23.1s-40.2-7.6-55.4-22.9c-15.1-15.3-22.7-33.7-22.7-55.2s7.6-39.9 22.9-55.4c15.3-15.4 33.7-23.1 55.4-23.1C7070.9 824.9 7089.4 832.5 7104.7 847.8zM7098.1 951.9c13.3-13.6 20-29.8 20-48.7s-6.6-35-19.8-48.5c-13.2-13.4-29.4-20.1-48.6-20.1-19.2.0-35.4 6.7-48.7 20.2s-19.9 29.7-19.9 48.7 6.6 35.2 19.7 48.6c13.1 13.4 29.3 20.1 48.5 20.1S7084.7 965.4 7098.1 951.9zm-11-63.8c0 14-6.1 22.8-18.4 26.4l22.5 30.5H7073l-20.3-28.3h-18.6V945h-14.7v-84.6h31.8c12.8.0 22 2.2 27.6 6.6C7084.4 871.4 7087.1 878.4 7087.1 888.1zM7068.2 9e2c3-2.4 4.4-6.5 4.4-12s-1.5-9.4-4.5-11.6-8.4-3.2-16-3.2h-18v30.5h17.5C7059.7 903.6 7065.3 902.4 7068.2 9e2z"/><path fill="#6d6e71" d="M1803.6 499.8v155.4h-20V499.8h-56.8v-19.2h133.9v19.2H1803.6z"/><path fill="#6d6e71" d="M2082.2 655.2v-76.9H1977v76.9h-20V480.5h20v78.9h105.2v-78.9h20v174.7h-20z"/><path fill="#6d6e71" d="M2241.4 499.8v57.4h88.1v19.2h-88.1v59.8h101.8v19h-121.8V480.5H2340v19.2H2241.4z"/><path fill="#d22128" d="M1574.5 1852.4l417.3-997.6h80.1l417.3 997.6h-105.4l-129.3-311.9h-448.2l-127.9 311.9H1574.5zM2032.6 970l-205.1 493.2h404.7L2032.6 970z"/><path fill="#d22128" d="M2596.9 1852.4V854.8H3010c171.4.0 295.1 158.8 295.1 313.3.0 163-115.2 316.1-286.6 316.1h-324.6v368.1h-97zm97-455.3h318.9c118 0 193.9-108.2 193.9-229 0-125.1-92.7-226.2-202.3-226.2h-310.5v455.2z"/><path fill="#d22128" d="M3250.5 1852.4l417.3-997.6h80.1l417.3 997.6h-105.4l-129.3-311.9h-448.2l-127.9 311.9H3250.5zM3708.6 970l-205.1 493.2h404.7L3708.6 970z"/><path fill="#d22128" d="M4637.3 849.1c177 0 306.3 89.9 368.1 217.8l-78.7 47.8c-63.2-132.1-186.9-177-295.1-177-238.9.0-369.5 213.6-369.5 414.5.0 220.6 161.6 420.1 373.7 420.1 112.4.0 244.5-56.2 307.7-185.5l81.5 42.1c-64.6 148.9-241.7 231.8-394.8 231.8-274 0-466.5-261.3-466.5-514.2C4163.8 1106.3 4336.6 849.1 4637.3 849.1z"/><path fill="#d22128" d="M5949.1 854.8v997.6h-98.4v-466.5h-591.5v466.5h-96.9V854.8h96.9v444h591.5v-444H5949.1z"/><path fill="#d22128" d="M6844.6 1765.2v87.1h-670.2V854.8H6832v87.1h-560.6v359.7h489v82.9h-489v380.8H6844.6z"/><path fill="#6d6e71" d="M1667.6 2063.6c11.8 3.5 22.2 8.3 31 14.2l-10.3 22.6c-9-6-18.6-10.4-28.9-13.4-10.2-2.9-20-4.4-29.2-4.4-13.6.0-24.5 2.4-32.6 7.3s-12.2 11.8-12.2 20.7c0 7.6 2.3 14 6.8 19s10.2 8.9 17 11.7c6.8 2.8 16.1 6 28 9.6 14.4 4.6 26 8.9 34.7 12.9 8.8 4 16.3 9.9 22.5 17.8 6.2 7.8 9.3 18.2 9.3 31 0 11.7-3.2 21.8-9.5 30.6-6.3 8.7-15.3 15.5-26.8 20.3-11.6 4.8-24.9 7.2-40 7.2s-29.7-2.9-43.9-8.7c-14.2-5.8-26.4-13.6-36.6-23.4l10.7-21.6c9.6 9.4 20.7 16.7 33.3 21.9 12.6 5.2 24.8 7.8 36.8 7.8 15.3.0 27.3-3 36.1-8.9s13.2-13.9 13.2-23.9c0-7.8-2.3-14.3-6.9-19.4-4.6-5.1-10.3-9-17.1-11.9-6.8-2.8-16.1-6-28-9.6-14.2-4.2-25.7-8.3-34.6-12.2-8.9-3.9-16.4-9.7-22.5-17.5-6.1-7.7-9.2-17.9-9.2-30.6.0-10.9 3-20.4 9-28.6s14.6-14.6 25.6-19.1c11.1-4.5 23.8-6.8 38.2-6.8C1643.8 2058.3 1655.7 2060.1 1667.6 2063.6z"/><path fill="#6d6e71" d="M1980.1 2072.8c16.8 9.4 30.2 22.3 40 38.4 9.8 16.2 14.8 33.9 14.8 53.3.0 19.5-4.9 37.4-14.8 53.6-9.8 16.3-23.2 29.1-40 38.6s-35.3 14.3-55.2 14.3c-20.3.0-38.8-4.7-55.7-14.3-16.8-9.5-30.2-22.4-40-38.6-9.8-16.3-14.8-34.1-14.8-53.6s4.9-37.3 14.8-53.5c9.8-16.2 23.2-29 40-38.3 16.8-9.4 35.4-14 55.7-14C1944.8 2058.6 1963.2 2063.3 1980.1 2072.8zM1881.9 2092.7c-13.1 7.4-23.6 17.5-31.4 30.1-7.8 12.6-11.8 26.5-11.8 41.7.0 15.3 3.9 29.3 11.8 42 7.8 12.7 18.3 22.8 31.4 30.2 13.1 7.4 27.4 11.1 42.9 11.1s29.7-3.7 42.7-11.1 23.3-17.4 31.1-30.2c7.7-12.7 11.6-26.7 11.6-42s-3.9-29.2-11.6-41.8c-7.7-12.6-18.1-22.6-31.1-30s-27.2-11.2-42.6-11.2C1909.4 2081.5 1895.1 2085.2 1881.9 2092.7z"/><path fill="#6d6e71" d="M2186.5 2082.4v74h98.4v23.2h-98.4v90.2h-24.1v-210.6h133.8v23.2H2186.5z"/><path fill="#6d6e71" d="M2491.6 2082.4v187.4h-24.1v-187.4h-68.4v-23.2h161.4v23.2H2491.6z"/><path fill="#6d6e71" d="M2871.8 2269.8l-56.8-177.4-57.6 177.4h-24.5l-70.5-210.6h25.9l57.9 182.7 57.1-182.4 24.1-.3 57.7 182.7 57.1-182.7h25l-70.6 210.6H2871.8z"/><path fill="#6d6e71" d="M3087.3 2216.6l-23.5 53.2h-25.6l94.4-210.6h25l94.1 210.6h-26.1l-23.5-53.2H3087.3zM3144.5 2086.6l-46.9 106.8h94.4l-47.5-106.8z"/><path fill="#6d6e71" d="M3461.1 2202.7c-6 .4-10.7.6-14.1.6h-56v66.5h-24v-210.6h80c26.2.0 46.6 6.2 61.2 18.5 14.5 12.3 21.8 29.8 21.8 52.3.0 17.2-4.1 31.7-12.2 43.3-8.1 11.6-19.8 20-35 25l49.2 71.5h-27.3L3461.1 2202.7zM3491.3 2167.6c10.3-8.4 15.5-20.8 15.5-37 0-15.9-5.2-27.9-15.5-36s-25.1-12.2-44.3-12.2h-56v97.8h56C3466.2 2180.2 3481 2176 3491.3 2167.6z"/><path fill="#6d6e71" d="M3688.3 2082.4v69.2h106.2v23.2h-106.2v72.1h122.8v22.9h-146.9v-210.6h142.9v23.2H3688.3z"/><path fill="#6d6e71" d="M4147 2082.4v74h98.4v23.2H4147v90.2h-24.1v-210.6h133.8v23.2H4147z"/><path fill="#6d6e71" d="M4523.3 2072.8c16.8 9.4 30.2 22.3 40 38.4 9.8 16.2 14.8 33.9 14.8 53.3.0 19.5-4.9 37.4-14.8 53.6-9.8 16.3-23.2 29.1-40 38.6s-35.3 14.3-55.2 14.3c-20.3.0-38.8-4.7-55.7-14.3-16.8-9.5-30.2-22.4-40-38.6-9.8-16.3-14.8-34.1-14.8-53.6s4.9-37.3 14.8-53.5c9.8-16.2 23.2-29 40-38.3 16.8-9.4 35.4-14 55.7-14C4488.1 2058.6 4506.5 2063.3 4523.3 2072.8zM4425.2 2092.7c-13.1 7.4-23.6 17.5-31.4 30.1-7.8 12.6-11.8 26.5-11.8 41.7.0 15.3 3.9 29.3 11.8 42 7.8 12.7 18.3 22.8 31.4 30.2 13.1 7.4 27.4 11.1 42.9 11.1s29.7-3.7 42.7-11.1 23.3-17.4 31.1-30.2c7.7-12.7 11.6-26.7 11.6-42s-3.9-29.2-11.6-41.8c-7.7-12.6-18.1-22.6-31.1-30s-27.2-11.2-42.6-11.2C4452.6 2081.5 4438.3 2085.2 4425.2 2092.7z"/><path fill="#6d6e71" d="M4854.7 2247.7c-15.7 15.5-37.3 23.3-64.8 23.3-27.7.0-49.4-7.8-65.1-23.3-15.7-15.5-23.6-37-23.6-64.6v-124h24.1v124c0 20.3 5.8 36.1 17.3 47.5 11.6 11.4 27.3 17.1 47.3 17.1 20.1.0 35.8-5.7 47.1-17 11.4-11.3 17-27.2 17-47.7v-124h24.1v124C4878.2 2210.7 4870.4 2232.2 4854.7 2247.7z"/><path fill="#6d6e71" d="M5169.5 2269.8l-126.3-169.1v169.1h-24.1v-210.6h25l126.3 169.3v-169.3h23.8v210.6H5169.5z"/><path fill="#6d6e71" d="M5478.4 2073.1c16.4 9.3 29.4 21.9 38.9 37.9 9.6 16 14.3 33.9 14.3 53.5s-4.8 37.6-14.3 53.6c-9.5 16.1-22.6 28.7-39.3 37.9-16.6 9.2-35.2 13.8-55.5 13.8h-84.3v-210.6h85.2C5443.7 2059.2 5462 2063.8 5478.4 2073.1zM5362.3 2246.9h61.4c15.5.0 29.6-3.5 42.3-10.6s22.8-16.9 30.2-29.5c7.4-12.5 11.1-26.5 11.1-42s-3.8-29.4-11.3-41.9-17.7-22.3-30.6-29.6c-12.8-7.2-27-10.9-42.6-10.9h-60.5v164.5z"/><path fill="#6d6e71" d="M5668.6 2216.6l-23.5 53.2h-25.6l94.4-210.6h25l94.1 210.6h-26l-23.5-53.2H5668.6zM5725.8 2086.6l-46.9 106.8h94.4l-47.5-106.8z"/><path fill="#6d6e71" d="M5991 2082.4v187.4h-24v-187.4h-68.4v-23.2H6060v23.2h-69z"/><path fill="#6d6e71" d="M6175.9 2269.8v-210.6h24.1v210.6H6175.9z"/><path fill="#6d6e71" d="M6493.7 2072.8c16.8 9.4 30.2 22.3 40 38.4 9.8 16.2 14.8 33.9 14.8 53.3.0 19.5-4.9 37.4-14.8 53.6-9.8 16.3-23.2 29.1-40 38.6s-35.3 14.3-55.2 14.3c-20.3.0-38.8-4.7-55.7-14.3-16.8-9.5-30.2-22.4-40-38.6-9.8-16.3-14.8-34.1-14.8-53.6s4.9-37.3 14.8-53.5c9.8-16.2 23.2-29 40-38.3 16.8-9.4 35.4-14 55.7-14C6458.5 2058.6 6476.9 2063.3 6493.7 2072.8zM6395.6 2092.7c-13.1 7.4-23.6 17.5-31.4 30.1-7.8 12.6-11.8 26.5-11.8 41.7.0 15.3 3.9 29.3 11.8 42 7.8 12.7 18.3 22.8 31.4 30.2 13.1 7.4 27.4 11.1 42.9 11.1s29.7-3.7 42.7-11.1 23.3-17.4 31.1-30.2c7.7-12.7 11.6-26.7 11.6-42s-3.9-29.2-11.6-41.8c-7.7-12.6-18.1-22.6-31.1-30s-27.2-11.2-42.6-11.2C6423 2081.5 6408.8 2085.2 6395.6 2092.7z"/><path fill="#6d6e71" d="M6826.5 2269.8l-126.3-169.1v169.1h-24.1v-210.6h25l126.3 169.3v-169.3h23.8v210.6H6826.5z"/><linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-4516.6152" y1="-2338.7222" x2="-4108.4111" y2="-1861.3982" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"><stop offset="0" style="stop-color:#F69923"/><stop offset=".3123" style="stop-color:#F79A23"/><stop offset=".8383" style="stop-color:#E97826"/></linearGradient><path fill="url(#SVGID_1_)" d="M1230.1 13.7c-45.3 26.8-120.6 102.5-210.5 212.3l82.6 155.9c58-82.9 116.9-157.5 176.3-221.2 4.6-5.1 7-7.5 7-7.5-2.3 2.5-4.6 5-7 7.5-19.2 21.2-77.5 89.2-165.5 224.4 84.7-4.2 214.9-21.6 321.1-39.7 31.6-177-31-258-31-258S1323.4-41.4 1230.1 13.7z"/><path fill="none" d="M1090.2 903.1c.6-.1 1.2-.2 1.8-.3l-11.9 1.3c-.7.3-1.4.7-2.1 1C1082.1 904.4 1086.2 903.7 1090.2 903.1z"/><path fill="none" d="M1005.9 1182.3c-6.7 1.5-13.7 2.7-20.7 3.7C992.3 1185 999.2 1183.8 1005.9 1182.3z"/><path fill="none" d="M432.9 1808.8c.9-2.3 1.8-4.7 2.6-7 18.2-48 36.2-94.7 54-140.1 20-51 39.8-100.4 59.3-148.3 20.6-50.4 40.9-99.2 60.9-146.3 21-49.4 41.7-97 62-142.8 16.5-37.3 32.8-73.4 48.9-108.3 5.4-11.7 10.7-23.2 16-34.6 10.5-22.7 21-44.8 31.3-66.5 9.5-20 19-39.6 28.3-58.8 3.1-6.4 6.2-12.8 9.3-19.1.5-1 1-2 1.5-3.1l-10.2 1.1-8-15.9c-.8 1.6-1.6 3.1-2.4 4.6-14.5 28.8-28.9 57.9-43.1 87.2-8.2 16.9-16.4 34-24.6 51-22.6 47.4-44.8 95.2-66.6 143.3-22.1 48.6-43.7 97.5-64.9 146.5-20.8 48.1-41.3 96.2-61.2 144.2-20 48-39.5 95.7-58.5 143.2-19.9 49.5-39.2 98.7-58 147.2-4.2 10.9-8.5 21.9-12.7 32.8-15 39.2-29.7 77.8-44 116l12.7 25.1 11.4-1.2c.4-1.1.8-2.3 1.3-3.4C396.7 1905.4 414.9 1856.4 432.9 1808.8z"/><path fill="none" d="M980 1186.8c.1.0.1.0.1-.1C980.1 1186.8 980.1 1186.8 980 1186.8z"/><path fill="#be202e" d="M952.6 1323c-10.6 1.9-21.4 3.8-32.5 5.7-.1.0-.1.1-.2.1 5.6-.8 11.2-1.7 16.6-2.6C942 1325.2 947.3 1324.1 952.6 1323z"/><path opacity=".35" fill="#be202e" d="M952.6 1323c-10.6 1.9-21.4 3.8-32.5 5.7-.1.0-.1.1-.2.1 5.6-.8 11.2-1.7 16.6-2.6C942 1325.2 947.3 1324.1 952.6 1323z"/><path fill="#be202e" d="M980.3 1186.7C980.2 1186.7 980.2 1186.7 980.3 1186.7c-.1.1-.2.1-.2.1 1.8-.2 3.5-.5 5.2-.8 7-1 13.9-2.2 20.7-3.7C997.5 1183.8 989 1185.2 980.3 1186.7z"/><path opacity=".35" fill="#be202e" d="M980.3 1186.7C980.2 1186.7 980.2 1186.7 980.3 1186.7c-.1.1-.2.1-.2.1 1.8-.2 3.5-.5 5.2-.8 7-1 13.9-2.2 20.7-3.7C997.5 1183.8 989 1185.2 980.3 1186.7z"/><linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="-7537.7339" y1="-2391.4075" x2="-4625.4141" y2="-2391.4075" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"><stop offset=".3233" style="stop-color:#9E2064"/><stop offset=".6302" style="stop-color:#C92037"/><stop offset=".7514" style="stop-color:#CD2335"/><stop offset="1" style="stop-color:#E97826"/></linearGradient><path fill="url(#SVGID_2_)" d="M858.6 784.7c25.1-46.9 50.5-92.8 76.2-137.4 26.7-46.4 53.7-91.3 80.9-134.7 1.6-2.6 3.2-5.2 4.8-7.7 27-42.7 54.2-83.7 81.6-122.9L1019.5 226c-6.2 7.6-12.5 15.3-18.8 23.2-23.8 29.7-48.6 61.6-73.9 95.5-28.6 38.2-58 78.9-87.8 121.7-27.6 39.5-55.5 80.9-83.5 123.7-23.8 36.5-47.7 74-71.4 112.5-.9 1.4-1.8 2.9-2.6 4.3L789 919.2c22.8-45.6 46.1-90.5 69.6-134.5z"/><linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-7186.1777" y1="-2099.3059" x2="-5450.7183" y2="-2099.3059" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"><stop offset="0" style="stop-color:#282662"/><stop offset=".0954839" style="stop-color:#662E8D"/><stop offset=".7882" style="stop-color:#9F2064"/><stop offset=".9487" style="stop-color:#CD2032"/></linearGradient><path fill="url(#SVGID_3_)" d="M369 1981c-14.2 39.1-28.5 78.9-42.9 119.6-.2.6-.4 1.2-.6 1.8-2 5.7-4.1 11.5-6.1 17.2-9.7 27.4-18 52.1-37.3 108.2 31.7 14.5 57.1 52.5 81.1 95.6-2.6-44.7-21-86.6-56.2-119.1 156.1 7 290.6-32.4 360.1-146.6 6.2-10.2 11.9-20.9 17-32.2-31.6 40.1-70.8 57.1-144.5 53-.2.1-.3.1-.5.2.2-.1.3-.1.5-.2 108.6-48.6 163.1-95.3 211.2-172.6 11.4-18.3 22.5-38.4 33.8-60.6-94.9 97.5-205 125.3-320.9 104.2l-86.9 9.5C374.4 1966.3 371.7 1973.6 369 1981z"/><linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2418.5454" x2="-4461.8428" y2="-2418.5454" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"><stop offset=".3233" style="stop-color:#9E2064"/><stop offset=".6302" style="stop-color:#C92037"/><stop offset=".7514" style="stop-color:#CD2335"/><stop offset="1" style="stop-color:#E97826"/></linearGradient><path fill="url(#SVGID_4_)" d="M409.6 1786.3c18.8-48.5 38.1-97.7 58-147.2 19-47.4 38.5-95.2 58.5-143.2s40.4-96.1 61.2-144.2c21.2-49 42.9-97.8 64.9-146.5 21.8-48.1 44-95.9 66.6-143.3 8.1-17.1 16.3-34.1 24.6-51 14.2-29.3 28.6-58.4 43.1-87.2.8-1.6 1.6-3.1 2.4-4.6L681.4 706.8c-1.8 2.9-3.5 5.8-5.3 8.6-25.1 40.9-50 82.7-74.4 125.4-24.7 43.1-49 87.1-72.7 131.7-20 37.6-39.6 75.6-58.6 113.9-3.8 7.8-7.6 15.5-11.3 23.2-23.4 48.2-44.6 94.8-63.7 139.5-21.7 50.7-40.7 99.2-57.5 145.1-11 30.2-21 59.4-30.1 87.4-7.5 24-14.7 47.9-21.5 71.8-16 56.3-29.9 112.4-41.2 168.3L353 1935.1c14.3-38.1 28.9-76.8 44-116C401.1 1808.2 405.4 1797.3 409.6 1786.3z"/><linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-7161.7642" y1="-2379.1431" x2="-5631.2524" y2="-2379.1431" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"><stop offset="0" style="stop-color:#282662"/><stop offset=".0954839" style="stop-color:#662E8D"/><stop offset=".7882" style="stop-color:#9F2064"/><stop offset=".9487" style="stop-color:#CD2032"/></linearGradient><path fill="url(#SVGID_5_)" d="M243.5 1729.4c-13.6 68.2-23.2 136.2-28 203.8-.2 2.4-.4 4.7-.5 7.1-33.7-54-124-106.8-123.8-106.2 64.6 93.7 113.7 186.7 120.9 278-34.6 7.1-82-3.2-136.8-23.3 57.1 52.5 1e2 67 116.7 70.9-52.5 3.3-107.1 39.3-162.1 80.8 80.5-32.8 145.5-45.8 192.1-35.3C148.1 2414.2 74.1 2645 0 2890c22.7-6.7 36.2-21.9 43.9-42.6 13.2-44.4 100.8-335.6 238-718.2 3.9-10.9 7.8-21.8 11.8-32.9 1.1-3 2.2-6.1 3.3-9.2 14.5-40.1 29.5-81.1 45.1-122.9 3.5-9.5 7.1-19 10.7-28.6.1-.2.1-.4.2-.6l-107.9-213.2C244.6 1724.4 244 1726.9 243.5 1729.4z"/><linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2117.1309" x2="-4461.8428" y2="-2117.1309" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"><stop offset=".3233" style="stop-color:#9E2064"/><stop offset=".6302" style="stop-color:#C92037"/><stop offset=".7514" style="stop-color:#CD2335"/><stop offset="1" style="stop-color:#E97826"/></linearGradient><path fill="url(#SVGID_6_)" d="M805.6 937c-3.1 6.3-6.2 12.7-9.3 19.1-9.3 19.2-18.8 38.8-28.3 58.8-10.3 21.7-20.7 43.9-31.3 66.5-5.3 11.4-10.6 22.9-16 34.6-16.1 35-32.4 71.1-48.9 108.3-20.3 45.8-41 93.4-62 142.8-20 47.1-40.3 95.9-60.9 146.3-19.5 47.9-39.3 97.3-59.3 148.3-17.8 45.4-35.9 92.1-54 140.1-.9 2.3-1.8 4.7-2.6 7-18 47.6-36.2 96.6-54.6 146.8-.4 1.1-.8 2.3-1.3 3.4l86.9-9.5c-1.7-.3-3.5-.5-5.2-.9 103.9-13 242.1-90.6 331.4-186.5 41.1-44.2 78.5-96.3 113-157.3 25.7-45.4 49.8-95.8 72.8-151.5 20.1-48.7 39.4-101.4 58-158.6-23.9 12.6-51.2 21.8-81.4 28.2-5.3 1.1-10.7 2.2-16.1 3.1-5.5 1-11 1.8-16.6 2.6.1.0.1-.1.2-.1 96.9-37.3 158-109.2 202.4-197.4-25.5 17.4-66.9 40.1-116.6 51.1-6.7 1.5-13.7 2.7-20.7 3.7-1.7.3-3.5.6-5.2.8.1.0.1.0.1-.1h.1c33.6-14.1 62-29.8 86.6-48.4 5.3-4 10.4-8.1 15.3-12.3 7.5-6.5 14.7-13.3 21.5-20.5 4.4-4.6 8.6-9.3 12.7-14.2 9.6-11.5 18.7-23.9 27.1-37.3 2.6-4.1 5.1-8.3 7.6-12.6 3.2-6.2 6.3-12.3 9.3-18.3 13.5-27.2 24.4-51.5 33-72.8 4.3-10.6 8.1-20.5 11.3-29.7 1.3-3.7 2.5-7.2 3.7-10.6 3.4-10.2 6.2-19.3 8.4-27.3 3.3-12 5.3-21.5 6.4-28.4-3.3 2.6-7.1 5.2-11.3 7.7-29.3 17.5-79.5 33.4-119.9 40.8l79.8-8.8-79.8 8.8c-.6.1-1.2.2-1.8.3-4 .7-8.1 1.3-12.2 2 .7-.3 1.4-.7 2.1-1l-273 29.9C806.6 935 806.1 936 805.6 937z"/><linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="-7554.8232" y1="-2132.0981" x2="-4642.5034" y2="-2132.0981" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"><stop offset=".3233" style="stop-color:#9E2064"/><stop offset=".6302" style="stop-color:#C92037"/><stop offset=".7514" style="stop-color:#CD2335"/><stop offset="1" style="stop-color:#E97826"/></linearGradient><path fill="url(#SVGID_7_)" d="M1112.9 385.1c-24.3 37.3-50.8 79.6-79.4 127.5-1.5 2.5-3 5.1-4.5 7.6-24.6 41.5-50.8 87.1-78.3 137-23.8 43.1-48.5 89.3-74.3 139C854 839.5 830.8 885.4 807 934l273-29.9c79.5-36.6 115.1-69.7 149.6-117.6 9.2-13.2 18.4-27 27.5-41.3 28-43.8 55.6-92 80.1-139.9 23.7-46.3 44.7-92.2 60.7-133.5 10.2-26.3 18.4-50.8 24.1-72.3 5-19 8.9-36.9 11.9-54.1C1327.9 363.5 1197.6 380.9 1112.9 385.1z"/><path fill="#be202e" d="M936.5 1326.1c-5.5 1-11 1.8-16.6 2.6C925.5 1328 931 1327.1 936.5 1326.1z"/><path opacity=".35" fill="#be202e" d="M936.5 1326.1c-5.5 1-11 1.8-16.6 2.6C925.5 1328 931 1327.1 936.5 1326.1z"/><linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2027.484" x2="-4461.8433" y2="-2027.484" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"><stop offset=".3233" style="stop-color:#9E2064"/><stop offset=".6302" style="stop-color:#C92037"/><stop offset=".7514" style="stop-color:#CD2335"/><stop offset="1" style="stop-color:#E97826"/></linearGradient><path fill="url(#SVGID_8_)" d="M936.5 1326.1c-5.5 1-11 1.8-16.6 2.6C925.5 1328 931 1327.1 936.5 1326.1z"/><path fill="#be202e" d="M980 1186.8c1.8-.2 3.5-.5 5.2-.8C983.5 1186.3 981.8 1186.6 980 1186.8z"/><path opacity=".35" fill="#be202e" d="M980 1186.8c1.8-.2 3.5-.5 5.2-.8C983.5 1186.3 981.8 1186.6 980 1186.8z"/><linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2037.7417" x2="-4461.8433" y2="-2037.7417" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"><stop offset=".3233" style="stop-color:#9E2064"/><stop offset=".6302" style="stop-color:#C92037"/><stop offset=".7514" style="stop-color:#CD2335"/><stop offset="1" style="stop-color:#E97826"/></linearGradient><path fill="url(#SVGID_9_)" d="M980 1186.8c1.8-.2 3.5-.5 5.2-.8C983.5 1186.3 981.8 1186.6 980 1186.8z"/><path fill="#be202e" d="M980.2 1186.7z"/><path opacity=".35" fill="#be202e" d="M980.2 1186.7z"/><linearGradient id="SVGID_10_" gradientUnits="userSpaceOnUse" x1="-5738.0635" y1="-2039.799" x2="-5094.3457" y2="-2039.799" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"><stop offset=".3233" style="stop-color:#9E2064"/><stop offset=".6302" style="stop-color:#C92037"/><stop offset=".7514" style="stop-color:#CD2335"/><stop offset="1" style="stop-color:#E97826"/></linearGradient><path fill="url(#SVGID_10_)" d="M980.2 1186.7z"/></svg></div></a><ul class=footer-link><li><a class=white href=http://www.apache.org>Foundation</a></li><li><a class=white href=http://www.apache.org/licenses/>License</a></li><li><a class=white href=https://www.apache.org/security/>Security</a></li><li><a class=white href=http://www.apache.org/events/current-event>Events</a></li><li><a class=white href=http://www.apache.org/foundation/sponsorship.html>Sponsorship</a></li><li><a class=white href=http://www.apache.org/foundation/thanks.html>Thanks</a></li><li><a class=white href=https://privacy.apache.org/policies/privacy-policy-public.html target=_blank>Privacy</a></li></ul></div></div><div class="col-6 text-white text-center container-center"><p>Copyright &copy; 2024 The Apache Software Foundation, Licensed under the <a class=white href=https://www.apache.org/licenses/LICENSE-2.0>Apache License Version 2.0</a></p><p>Apache and the Apache feather logo are trademarks of The Apache Software Foundation.</p></div><div class=col-1></div></div></div></footer></div><script src=https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js integrity=sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN crossorigin=anonymous></script>
<script src=https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.min.js integrity="sha512-UR25UO94eTnCVwjbXozyeVd6ZqpaAE9naiEUBK/A+QDbfSTQFhPGj5lOR6d8tsgbBk84Ggb5A3EkjsOgPRPcKA==" crossorigin=anonymous></script>
<script src=/js/tabpane-persist.js></script>
<script src=/js/main.min.aa9f4c5dae6a98b2c46277f4c56f1673a2b000d1756ce4ffae93784cab25e6d5.js integrity="sha256-qp9MXa5qmLLEYnf0xW8Wc6KwANF1bOT/rpN4TKsl5tU=" crossorigin=anonymous></script>
<script src=/js/prism.js></script></body></html>