| .. Licensed to the Apache Software Foundation (ASF) under one | |
| .. or more contributor license agreements. See the NOTICE file | |
| .. distributed with this work for additional information | |
| .. regarding copyright ownership. The ASF licenses this file | |
| .. to you under the Apache License, Version 2.0 (the | |
| .. "License"); you may not use this file except in compliance | |
| .. with the License. You may obtain a copy of the License at | |
| .. http://www.apache.org/licenses/LICENSE-2.0 | |
| .. Unless required by applicable law or agreed to in writing, | |
| .. software distributed under the License is distributed on an | |
| .. "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
| .. KIND, either express or implied. See the License for the | |
| .. specific language governing permissions and limitations | |
| .. under the License. | |
| .. highlight:: console | |
| ====================== | |
| Development Guidelines | |
| ====================== | |
| .. contents:: | |
| Logger Abstraction | |
| ================== | |
| Apache Arrow Java uses the SLF4J API, so please configure SLF4J to see logs (e.g. via Logback/Apache Log4j): | |
| 1. If no jar dependencies are added by the user via Logback or Apache Log4j then SLF4J will default | |
| to no-operation (NOP) logging. | |
| 2. If a user adds any dependencies via Logback or Apache Log4j but does not configure/add/define | |
| logback.xml/log4j2.xml, then logs will default to DEBUG mode. | |
| 3. To disable debug logs, the user must define their own rules within their logback.xml/log4j2.xml | |
| and define their own loggers. | |
| Unit Testing | |
| ============ | |
| Unit tests are run by Maven during the build. | |
| To speed up the build, you can skip them by passing -DskipTests. | |
| .. code-block:: | |
| $ cd arrow/java | |
| $ mvn \ | |
| -Darrow.cpp.build.dir=../java-dist/lib -Parrow-jni \ | |
| -Darrow.c.jni.dist.dir=../java-dist/lib -Parrow-c-data \ | |
| clean install | |
| Performance Testing | |
| =================== | |
| The ``arrow-performance`` module contains benchmarks. | |
| Let's configure our environment to run performance tests: | |
| - Install `benchmark`_ | |
| - Install `archery`_ | |
| In case you need to see your performance tests on the UI, then, configure (optional): | |
| - Install `conbench`_ | |
| Lets execute benchmark tests: | |
| .. code-block:: | |
| $ cd benchmarks | |
| $ conbench java-micro --help | |
| $ conbench java-micro | |
| --iterations=1 | |
| --commit=e90472e35b40f58b17d408438bb8de1641bfe6ef | |
| --java-home=<absolute path to your java home> | |
| --src=<absolute path to your arrow project> | |
| --benchmark-filter=org.apache.arrow.adapter.AvroAdapterBenchmarks.testAvroToArrow | |
| Benchmark Mode Cnt Score Error Units | |
| AvroAdapterBenchmarks.testAvroToArrow avgt 725545.783 ns/op | |
| Time to POST http://localhost:5000/api/login/ 0.14911699295043945 | |
| Time to POST http://localhost:5000/api/benchmarks/ 0.06116318702697754 | |
| Then go to: http://127.0.0.1:5000/ to see reports: | |
| UI Home: | |
| .. image:: img/conbench_ui.png | |
| UI Runs: | |
| .. image:: img/conbench_runs.png | |
| UI Benchmark: | |
| .. image:: img/conbench_benchmark.png | |
| Integration Testing | |
| =================== | |
| Integration tests can be run :ref:`via Archery <running_integration_tests>`. | |
| For example, assuming you only built Arrow Java and want to run the IPC | |
| integration tests, you would do: | |
| .. code-block:: console | |
| $ archery integration --run-ipc --with-java 1 | |
| Code Style | |
| ========== | |
| The current Java code follows the `Google Java Style`_ with Apache license headers. | |
| Java code style is checked by `Spotless`_ during the build, and the continuous integration build will verify | |
| that changes adhere to the style guide. | |
| Automatically fixing code style issues | |
| -------------------------------------- | |
| - You can check the style without building the project with ``mvn spotless:check``. | |
| - You can autoformat the source with ``mvn spotless:apply``. | |
| Example: | |
| .. code-block:: bash | |
| The following files had format violations: | |
| src/main/java/org/apache/arrow/algorithm/rank/VectorRank.java | |
| @@ -15,7 +15,6 @@ | |
| ·*·limitations·under·the·License. | |
| ·*/ | |
| - | |
| package·org.apache.arrow.algorithm.rank; | |
| import·java.util.stream.IntStream; | |
| Run 'mvn spotless:apply' to fix these violations. | |
| Code Formatter for Intellij IDEA and Eclipse | |
| -------------------------------------------- | |
| Follow the instructions to set up google-java-format for: | |
| - `Eclipse`_ | |
| - `IntelliJ`_ | |
| Checkstyle | |
| ---------- | |
| Checkstyle is also used for general linting. The configuration is located at `checkstyle`_. | |
| You can also just check the style without building the project. | |
| This checks the code style of all source code under the current directory or from within an individual module. | |
| .. code-block:: | |
| $ mvn checkstyle:check | |
| Maven ``pom.xml`` style is enforced with Spotless using `Apache Maven pom.xml guidelines`_ | |
| You can also just check the style without building the project. | |
| This checks the style of all pom.xml files under the current directory or from within an individual module. | |
| .. code-block:: | |
| $ mvn spotless:check | |
| This applies the style to all pom.xml files under the current directory or from within an individual module. | |
| .. code-block:: | |
| $ mvn spotless:apply | |
| .. _benchmark: https://github.com/ursacomputing/benchmarks | |
| .. _archery: https://github.com/apache/arrow/blob/main/dev/conbench_envs/README.md#L188 | |
| .. _conbench: https://github.com/conbench/conbench | |
| .. _checkstyle: https://github.com/apache/arrow/blob/main/java/dev/checkstyle/checkstyle.xml | |
| .. _Apache Maven pom.xml guidelines: https://maven.apache.org/developers/conventions/code.html#pom-code-convention | |
| .. _Spotless: https://github.com/diffplug/spotless | |
| .. _Google Java Style: https://google.github.io/styleguide/javaguide.html | |
| .. _Eclipse: https://github.com/google/google-java-format?tab=readme-ov-file#eclipse | |
| .. _IntelliJ: https://github.com/google/google-java-format?tab=readme-ov-file#intellij-android-studio-and-other-jetbrains-ides | |
| Build Caching | |
| ============= | |
| Build caching is done through Develocity (formerly Maven Enterprise). To force | |
| a build without the cache, run:: | |
| mvn clean install -Ddevelocity.cache.local.enabled=false -Ddevelocity.cache.remote.enabled=false | |
| This can be useful to make sure you see all warnings from ErrorProne, for example. | |
| ErrorProne | |
| ========== | |
| ErrorProne should be disabled for generated code. |