You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@maven.apache.org by "John Patrick (Jira)" <ji...@apache.org> on 2020/06/25 19:02:00 UTC

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

John Patrick created MCOMPILER-421:
--------------------------------------

             Summary: multi release jar issue with module-info.java when using provides
                 Key: MCOMPILER-421
                 URL: https://issues.apache.org/jira/browse/MCOMPILER-421
             Project: Maven Compiler Plugin
          Issue Type: Improvement
    Affects Versions: 3.8.1
            Reporter: John Patrick


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

If you have the following code;
{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)
{code}

I expect the following jar structure;
{code}
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)
{code}

Using the following maven configuration;
{code}
					<executions>
						<execution>
							<id>java11-main</id>
							<phase>compile</phase>
							<goals>
								<goal>compile</goal>
							</goals>
							<configuration>
								<release>11</release>
								<jdkToolchain>
									<version>11</version>
								</jdkToolchain>
								<compileSourceRoots>
									<compileSourceRoot>${project.basedir}/src/main/java11</compileSourceRoot>
								</compileSourceRoots>
								<multiReleaseOutput>true</multiReleaseOutput>
							</configuration>
						</execution>
						<execution>
							<id>java14-main</id>
							<phase>compile</phase>
							<goals>
								<goal>compile</goal>
							</goals>
							<configuration>
								<release>14</release>
								<jdkToolchain>
									<version>14</version>
								</jdkToolchain>
								<compileSourceRoots>
									<compileSourceRoot>${project.basedir}/src/main/java14</compileSourceRoot>
								</compileSourceRoots>
								<multiReleaseOutput>true</multiReleaseOutput>
							</configuration>
						</execution>
					</executions>
{code}

But due to needing to use provides and uses in the module-info.java
{code}
module MODULE_A {
    exports PACKAGE_A;
    uses PACKAGE_B.Service;
    provides PACKAGE_B.Service
            with PACKAGE_A.ServiceImpl;
}
{code}

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;
{code}
					<executions>
						<execution>
							<id>java11-main</id>
							<phase>compile</phase>
							<goals>
								<goal>compile</goal>
							</goals>
							<configuration>
								<release>11</release>
								<jdkToolchain>
									<version>11</version>
								</jdkToolchain>
								<compileSourceRoots>
									<compileSourceRoot>${project.basedir}/src/main/java</compileSourceRoot>
									<compileSourceRoot>${project.basedir}/src/main/java11</compileSourceRoot>
								</compileSourceRoots>
								<multiReleaseOutput>true</multiReleaseOutput>
							</configuration>
						</execution>
						<execution>
							<id>java14-main</id>
							<phase>compile</phase>
							<goals>
								<goal>compile</goal>
							</goals>
							<configuration>
								<release>14</release>
								<jdkToolchain>
									<version>14</version>
								</jdkToolchain>
								<compileSourceRoots>
									<compileSourceRoot>${project.basedir}/src/main/java</compileSourceRoot>
									<compileSourceRoot>${project.basedir}/src/main/java11</compileSourceRoot>
									<compileSourceRoot>${project.basedir}/src/main/java14</compileSourceRoot>
								</compileSourceRoots>
								<multiReleaseOutput>true</multiReleaseOutput>
							</configuration>
						</execution>
					</executions>
{code}

Which then produces a jar looking something like this;
{code}
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)
{code}

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



--
This message was sent by Atlassian Jira
(v8.3.4#803005)