Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Java Module ‘provides’ Error: Is Maven to Blame?

Getting a syntax error using ‘provides’ in module-info.java with Maven? Learn if it’s a Maven bug or Java 25 compatibility issue.
Confused developer faces 'provides' syntax error in module-info.java with Java 25 and Maven Confused developer faces 'provides' syntax error in module-info.java with Java 25 and Maven
  • ⚠️ Java 25 has the same module syntax, but Maven plugins may not work with provides.
  • 🧩 Most maven syntax error messages happen because the maven-compiler-plugin is old.
  • 🧪 Using javac or Gradle by itself often compiles provides without trouble. This shows Maven is the issue.
  • 🔄 It is important to match your Java version, Maven version, and plugin setup to stop build problems.
  • 🛠️ Developers can avoid module-info.java provides errors by updating their tools often.

Java's module system helps developers build applications that are easier to keep up and have their parts separate. But if you use Java 25 and Maven together, you might see a syntax error for provides in module-info.java. This is likely a tool problem, not a code problem. This article looks at why this happens. It also shows how this connects to Java 25 module imports and how to fix your Maven setup to stop this confusing maven syntax error.


Understanding provides in module-info.java

To understand the problem, first know what the provides keyword does in the module-info.java file. Java 9's module system brought this in. It helps with the Service Provider Interface (SPI). And this lets your program find service parts while it runs.

In simple terms:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

  • uses says that the current module needs a service interface.
  • provides ... with ... says which class makes that service happen.

Example Structure

module com.example.consumer {
    requires com.example.service;
    uses com.example.service.MyService;
}

module com.example.provider {
    requires com.example.service;
    provides com.example.service.MyService with com.example.impl.MyServiceImpl;
}

In the provider module, we say which class does the work for MyService. This syntax is correct in current Java. And any tool that says it works with Java 9 and newer should accept it.

But when your Maven build gives an error about this line, it can be confusing. The code is correct. So what is the problem?


Java 25 Module Import Behavior

Java 25 still uses Java’s original module system syntax. And according to the JDK 25 project documentation, there are no changes that break module-info.java declarations.

Small Changes in Java 25

Major syntax ideas have not changed. But Java 25 does bring small changes behind the scenes:

  • Better ways to find services.
  • Better checking of module paths when compiling.
  • Better service loading when programs run. This includes faster finding of services.

These do not change how provides or uses are set up. But they can strain old tools, like Maven plugins. These tools might not be ready to correctly understand the new behavior or full grammar support in Java 25.

Here, Maven is often the problem. This is true when its parsing tools are slower to update than the official javac compiler.


How Maven Reads Java Modules

Maven itself is not a compiler. Instead, it gives the work of compiling to the standard Java compiler (javac). It does this through the maven-compiler-plugin. This plugin must clearly work with new Java versions as they come out.

What Happens

Here's what happens when Maven builds a modular Java application:

  1. Maven calls javac from your JDK setup.
  2. The plugin reads parts like module-info.java with Java tools or other parsing tools.
  3. If the plugin's internal grammar files are not updated for the newest Java version, it might wrongly call correct syntax wrong.

This often happens with new JDKs like Java 25. Maven might not have updated its support for it. But the official JDK already understands provides correctly.


What The Error Looks Like

Most developers get a confusing build error. It says the provides keyword is not valid Java syntax. The error message often looks like this:

[ERROR] .../module-info.java:[7,1] class, interface, enum, or record expected
provides com.example.service.MyService with com.example.impl.MyServiceImpl;

This can be confusing:

  • It implies provides is outside a class body. But it is not.
  • The real problem is Maven's parser. It does not understand the correct instruction.

This can be worrying. Especially when your IDE shows no problems. And the same module-info.java compiles fine using javac right from the command line.


Checking Maven Compiler Plugin Compatibility

The main way to fix the Maven error is to make sure you use a working Maven Compiler Plugin version. For Java 25, you need version 3.11.0 or newer.

How To Set Up The Plugin

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.11.0</version>
    <configuration>
        <release>25</release>
    </configuration>
</plugin>

This setup makes sure:

  • You are compiling with Java 25.
  • The plugin makes sure syntax and APIs fit the chosen Java release.
  • The build uses module-only rules correctly.

Do this and set JAVA_HOME to a real Java 25 JDK. This will usually fix the maven syntax error.

⚠️ Note: If your system uses an older Maven version (like 3.6.x), even the newest plugin may not work well. Always update Maven itself at the same time as your plugin.


How IDEs and Maven CLI Act Differently

This error is hard to understand because it does not always show up while you develop:

  • IntelliJ IDEA: Uses its own Java parser. This is often updated more often than Maven. It may not show the error at all.
  • Eclipse: Depending on plugins installed, it might show the error or not.
  • Maven CLI: Only uses the versions you set and your local tools. This makes it more likely to have setup problems.

So, code that looks good in your IDE might fail your CI build. That build uses a different Maven or JDK version.

Why This Happens

IDEs often come with a newer Java parser. Or even one still being tested. When modules change (like after Java 9), these environments change faster than slower tools like Maven plugins.


What Is Wrong: Maven Is Not Reading Syntax Correctly

The problem here is not a syntax bug in Java. Java 25’s module syntax, which includes provides, works with older versions. Instead, the main reason is:

  • Old tools misunderstand Java 25 syntax.
  • An old Maven parser does not know keywords or grammar.
  • It defaults to Java versions it does not support, if you do not set <release>.

Maven’s own documentation says this risk exists. It tells you to set the version for both the plugin and Java level. This stops wrong default settings.


Other Ways: Use javac or Gradle Instead

To check if Maven is the problem, do not use Maven. Compile your module by hand:

Using javac

javac --release 25 -d out \
  src/main/java/module-info.java \
  src/main/java/com/example/service/MyService.java \
  src/main/java/com/example/impl/MyServiceImpl.java

If this works, your syntax is correct. And the Maven error is for sure a tool problem.

Using Gradle

Gradle changes with Java faster. This is because of its plugin setup. Here's an example setup:

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(25)
    }
    modularity.inferModulePath = true
}

Add this to your build.gradle and try building again. If Gradle works while Maven fails, the maven syntax error is definitely a Maven problem.


Fixing the Problem: How To Fix It

To avoid module-info.java provides errors in Java 25:

  1. 🛠 Update to Maven Compiler Plugin 3.11.0 or newer.
  2. 🔢 Clearly set <release>25</release> to match your Java version.
  3. ☑ Make sure JAVA_HOME points to Java 25 JDK.
  4. 🧽 Clean your build files (mvn clean) to remove old bytecode or wrongly compiled modules.
  5. 📦 Upgrade your Maven setup to the newest working version.

Optional: Set JDK Toolchains

To get the same results everywhere, set up Java tools like this:

<toolchain>
    <type>jdk</type>
    <provides>
        <version>25</version>
    </provides>
    <configuration>
        <jdkHome>/path/to/jdk-25</jdkHome>
    </configuration>
</toolchain>

Simple Test Template

Setting up a simple test case helps you find problems away from big code projects.

Folder Structure

my-modular-app/
├── pom.xml
└── src/
    └── main/
        └── java/
            ├── module-info.java
            ├── com/example/service/MyService.java
            └── com/example/impl/MyServiceImpl.java

module-info.java

module com.example.provider {
    exports com.example.service;
    provides com.example.service.MyService with com.example.impl.MyServiceImpl;
}

If this fails with Maven but not javac, you have confirmed the problem.


Getting Ready for What's Next

Java releases come out every six months. Tools, especially Maven plugins, often fall behind.

What You Can Do

  • ⏫ Set up Maven and plugin updates to happen on their own in CI/CD. Use Dependabot or Renovate for this.
  • 📆 Check Java release notes and Maven update lists.
  • ✅ Add tests for different versions in your CI pipelines.

Example GitHub Actions matrix:

strategy:
  matrix:
    java: [24, 25]
    build_tool: [maven, gradle]

This helps check that your module-info.java setups will not break with each JDK or build tool update.


Helping Out: Reporting Maven Bugs

If your check leads to a build that fails in a way you cannot repeat and without a clear reason, it might be time to report a bug.

How To Report

  • Submit to: Apache Maven Compiler Plugin JIRA
  • Include:
    • Full module-info.java
    • Plugin and Maven versions
    • Java output: java -version
    • An example repo that shows the problem, if possible

Your help lets the Maven community know about problems with new Java releases. This helps developers and maintainers.


Conclusion: Be Ready For Change With Java & Maven

The Java platform changes. But tools like Maven need time to get updated. When maven syntax error appears on a correct module-info.java provides line, trust your code. And check your build tools.

By knowing the small differences between Java 25 module imports and how ready the Maven parser is, you can stop big work delays later. Keep your tools matched. Look at other options like Gradle if you need to. And report bugs if you need to. This helps the system get faster.


Citations

Oracle. (2023). JDK 25 Early-Access Documentation. Retrieved from https://openjdk.org/projects/jdk/25/

Apache Maven Project. (2024). Apache Maven Compiler Plugin Documentation. Retrieved from https://maven.apache.org/plugins/maven-compiler-plugin/

JetBrains. (2023). Java Module Support. Retrieved from https://www.jetbrains.com/idea/

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading