IDE Setup
The sections below describe how to import the Fluss project into an IDE for the development of Fluss itself.
Whenever something is not working in your IDE, try with the Maven
command line first (mvn clean package -DskipTests
) as it might be your IDE
that has a bug or is not properly set up.
Using the included Maven Wrapper by replacing mvn
with ./mvnw
ensures that the correct Maven version is used.
Preparation: Fork and Clone the Fluss Repository
Fluss uses git for version control. The Git repository is mirrored to GitHub.
The common way to merge code changes on GitHub is to fork the repository (creating a copy of the repository to your personal GitHub account so you can modify the source code) and issue a pull request.
- To fork the Fluss repository, log in with your GitHub account. If you do not have one yet, sign up for free. Then, click the
[Fork]
button on the upper right of the Fluss repository. - Clone the forked version of the repository over HTTPs or SSH. SSH is recommended but needs to be explicitly configured.
# Clone using HTTPs
git clone https://github.com/<your-user-name>/fluss.git
# Clone using SSH
git clone git@github.com:<your-user-name>/fluss.git
IntelliJ IDEA
The following guide has been written for IntelliJ IDEA 2024.3. Some details might differ in other versions. Please make sure to follow all steps
Importing Fluss
- Choose "New" → "Project from Existing Sources".
- Select the root folder of the cloned Fluss repository.
- Choose "Import project from external model" and select "Maven".
- Leave the default options and successively click "Next" until you reach the SDK section.
- If there is no SDK listed, create one using the "+" sign on the top left. Select "JDK", choose the JDK home directory and click "OK". Select the most suitable JDK version. NOTE: A good rule of thumb is to select the JDK version matching the active Maven profile.
- Continue by clicking "Next" until the import is finished.
- Open the "Maven" tab (or right-click on the imported project and find "Maven") and run
"Generate Sources and Update Folders". Alternatively, you can run
mvn clean package -DskipTests
. - Build the Project ("Build" → "Build Project").
Copyright Profile
Every file needs to include the Alibaba license as a header. This can be automated in IntelliJ by adding a Copyright profile:
- Go to "Settings" → "Editor" → "Copyright" → "Copyright Profiles".
- Add a new profile and name it "Alibaba".
- Add the following text as the license text:
Copyright (c) 2025 Alibaba Group Holding Ltd.
Licensed 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.
- Go to "Editor" → "Copyright" and choose the "Alibaba" profile as the default profile for this project.
- Click "Apply".
Required Plugins
Go to "Settings" → "Plugins" and select the "Marketplace" tab. Search for the following plugins, install them, and restart the IDE if prompted:
You will also need to install the google-java-format plugin. However, a specific version of this plugin is required. Download google-java-format v1.7.0.6 and install it as follows. Make sure to never update this plugin.
- Go to "Settings" → "Plugins".
- Click the gear icon and select "Install Plugin from Disk".
- Navigate to the downloaded ZIP file and select it.
Code Formatting
Fluss uses Spotless together with google-java-format to format the Java code.
It is recommended to automatically format your code by applying the following settings:
- Go to "Settings" → "Other Settings" → "google-java-format Settings".
- Tick the checkbox to enable the plugin.
- Change the code style to "Android Open Source Project (AOSP) style".
- Go to "Settings" → "Tools" → "Actions on Save".
- Under "Formatting Actions", select "Optimize imports" and "Reformat code".
- From the "All file types list" next to "Reformat code", select Java and Scala.
For earlier IntelliJ IDEA versions:
- Go to "Settings" → "Other Settings" → "Save Actions".
- Under "General", enable your preferred settings for when to format the code, e.g. "Activate save actions on save".
- Under "Formatting Actions", select "Optimize imports" and "Reformat file".
- Under "File Path Inclusions", add an entry for
.*\.java
to avoid formatting other file types.
You can also format the whole project via Maven by using mvn spotless:apply
.
Checkstyle For Java
Checkstyle is used to enforce static coding guidelines.
- Go to "Settings" → "Tools" → "Checkstyle".
- Set "Scan Scope" to "Only Java sources (including tests)".
- For "Checkstyle Version" select "9.3".
- Under "Configuration File" click the "+" icon to add a new configuration.
- Set "Description" to "Fluss".
- Select "Use a local Checkstyle file" and point it to
tools/maven/checkstyle.xml
located within your cloned repository. - Select "Store relative to project location" and click "Next".
- Configure the property
checkstyle.suppressions.file
with the valuesuppressions.xml
and click "Next". - Click "Finish".
- Select "Fluss" as the only active configuration file and click "Apply".
You can now import the Checkstyle configuration for the Java code formatter.
- Go to "Settings" → "Editor" → "Code Style" → "Java".
- Click the gear icon next to "Scheme" and select "Import Scheme" → "Checkstyle Configuration".
- Navigate to and select
tools/maven/checkstyle.xml
located within your cloned repository.
To verify the setup, click "View" → "Tool Windows" → "Checkstyle" and find the "Check Module" button in the opened tool window. It should report no violations.
Configure Git Commit Username and Email
Verify that the Git commit username is set to your preferred name using
git config user.name
The set username will be shown in the contributor list in Fluss release notes.
To change the username use
git config user.name "<Your username>"
You are free to choose any username you want. In particular, the username does not have to correspond to your GitHub username. A common choice is simply your full name.
Also verify that the Git commit email address is set to your preferred email address using
git config user.email
Make sure that the set email address is an email address that is linked to your GitHub account. If the email address is not linked to your GitHub account, commits in the contribution graph will not be associated with your account.
To change the email address use
git config user.email "<email address>"
If you do not want to expose your email address in Git commits, you can activate GitHub's email privacy setting and set the Git commit email address to the anonymized noreply @users.noreply.github.com
email address.
- When committing from different devices, make sure the username is consistently set on all devices.
- The
git config
commands above only set the username and email address for the current Git repository. If you want to apply the same settings to all Git repositories on a device, execute the commands with the--global
option.
Common Problems
This section lists issues that developers have run into in the past when working with IntelliJ.
Compilation fails with invalid flag: --add-exports=java.base/sun.net.util=ALL-UNNAMED
This happens if the "java11" Maven profile is active, but an older JDK version is used. Go to "View" → "Tool Windows" → "Maven" and uncheck the "java11" profile. Afterwards, reimport the project.
Compilation fails with package sun.misc does not exist
This happens if you are using JDK 11 and compile to Java 8 with the --release
option. This option is currently incompatible with our build setup.
Go to "Settings" → "Build, Execution, Deployment" → "Compiler" → "Java Compiler" and uncheck the "Use '--release' option for cross-compilation (Java 9 and later)".
Examples fail with a NoClassDefFoundError
for Fluss classes.
This happens if Fluss dependencies are set to "provided", resulting in them not being available
on the classpath. You can either check "Include dependencies with 'Provided' scope" in your
run configuration, or create a test that calls the main()
method of the example.