apache / apache/maven-compiler-plugin

[MCOMPILER-421] multi release jar issue with module-info.java when using provides

Open
#642 13 comments 0 reactions 0 assignees View on GitHub
enhancement priority:major
Dominant language
Java
Stars
261
Forks
191
Avg merge
1d 5h
Merged PRs (30d)
8

Description

**[John Patrick](https://issues.apache.org/jira/secure/ViewProfile.jspa?name=nhoj.patrick)** opened **[MCOMPILER-421](https://issues.apache.org/jira/browse/MCOMPILER-421?redirect=false)** and commented

If you have the following structure you have to recompile everything for each version supported.

If you have the following code;

```
src/main/java/package/Service.java (1)
src/main/java/package/Example.java (2)
src/main/java/package/Java1dot8.java (3)
src/main/java11/package/Example.java (4)
src/main/java11/package/Java11.java (5)
src/main/java11/module-info.java (6)
src/main/java14/package/Example.java (7)
src/main/java14/package/Java14.java (8)
src/main/java14/module-info.java (9)
```

I expect the following jar structure;

```
package/Service.class (1)
package/Example.class (2)
package/Java1dot8.class (3)
META-INF/versions/11/package/Example.java (4)
META-INF/versions/11/package/Java11.java (5)
META-INF/versions/11/module-info.java (6)
META-INF/versions/14/package/Example.java (7)
META-INF/versions/14/package/Java14.java (8)
META-INF/versions/14/module-info.java (9)
```

Using the following maven configuration;

```


java11-main
compile

compile


11

11


${project.basedir}/src/main/java11

true



java14-main
compile

compile


14

14


${project.basedir}/src/main/java14

true

```

But due to needing to use provides and uses in the module-info.java

```
module MODULE_A {
exports PACKAGE_A;
uses PACKAGE_B.Service;
provides PACKAGE_B.Service
with PACKAGE_A.ServiceImpl;
}
```

I get compile errors with src/main/java11/module-info.java as that class is under src/main/java. So I need to change it to something like this so the compile see classes already compiled that are in target/classes;

```


java11-main
compile

compile


11

11


${project.basedir}/src/main/java
${project.basedir}/src/main/java11

true



java14-main
compile

compile


14

14


${project.basedir}/src/main/java
${project.basedir}/src/main/java11
${project.basedir}/src/main/java14

true

```

Which then produces a jar looking something like this;

```
package/Service.class (1)
package/Example.class (2)
package/Java1dot8.class (3)
META-INF/versions/11/package/Java1dot8.class (3)
META-INF/versions/11/package/Example.java (4)
META-INF/versions/11/package/Java11.java (5)
META-INF/versions/11/module-info.java (6)
META-INF/versions/14/package/Java1dot8.class (3)
META-INF/versions/14/package/Java11.java (5)
META-INF/versions/14/package/Example.java (7)
META-INF/versions/14/package/Java14.java (8)
META-INF/versions/14/module-info.java (9)
```

One of the projects that needs this is https://github.com/nhojpatrick/nhojpatrick-cucumber/tree/feature/surefire-3.0.0-M5

The actual module-info.java using provides is https://github.com/nhojpatrick/nhojpatrick-cucumber/blob/feature/surefire-3.0.0-M5/json-transformations/remove/src/main/java11/module-info.java

---

**Affects:** 3.8.1

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.