Caleb Cushing created MCOMPILER-597: ---------------------------------------
Summary: exports ... to ... does not create a correct modulePath Key: MCOMPILER-597 URL: https://issues.apache.org/jira/browse/MCOMPILER-597 Project: Maven Compiler Plugin Issue Type: Bug Affects Versions: 3.13.0 Reporter: Caleb Cushing When using a `module-info` with the `exports ... to ...` directive, the `modulePath` is generated incorrectly. Given the following `module-info.java` and the corresponding `pom.xml` files, the following warning is triggered: {code:java} import org.jspecify.annotations.NullMarked; /** * Provide an easy to include {@code TestApplication} implementation for {@code com.xenoterracide} Spring Boot * Applications. Simply include the module on your classpath. */ @NullMarked module com.xenoterracide { exports com.xenoterracide to spring.context, spring.beans; opens com.xenoterracide to spring.core; requires spring.context; requires spring.boot.autoconfigure; requires static org.jspecify; } {code} {code} [DEBUG] Classpath: [DEBUG] /home/xeno/IdeaProjects/spring-app-commons/test-app/target/classes [DEBUG] /home/xeno/.m2/repository/org/springframework/spring-core/6.1.11/spring-core-6.1.11.jar [DEBUG] /home/xeno/.m2/repository/org/springframework/spring-jcl/6.1.11/spring-jcl-6.1.11.jar [DEBUG] /home/xeno/.m2/repository/org/springframework/boot/spring-boot/3.3.2/spring-boot-3.3.2.jar [DEBUG] /home/xeno/.m2/repository/org/springframework/spring-aop/6.1.11/spring-aop-6.1.11.jar [DEBUG] /home/xeno/.m2/repository/org/springframework/spring-expression/6.1.11/spring-expression-6.1.11.jar [DEBUG] /home/xeno/.m2/repository/io/micrometer/micrometer-observation/1.13.2/micrometer-observation-1.13.2.jar [DEBUG] /home/xeno/.m2/repository/io/micrometer/micrometer-commons/1.13.2/micrometer-commons-1.13.2.jar [DEBUG] /home/xeno/.m2/repository/org/springframework/spring-beans/6.1.11/spring-beans-6.1.11.jar [DEBUG] Modulepath: [DEBUG] /home/xeno/.m2/repository/org/jspecify/jspecify/1.0.0/jspecify-1.0.0.jar [DEBUG] /home/xeno/.m2/repository/org/springframework/boot/spring-boot-autoconfigure/3.3.2/spring-boot-autoconfigure-3.3.2.jar [DEBUG] /home/xeno/.m2/repository/org/springframework/spring-context/6.1.11/spring-context-6.1.11.jar [WARNING] /home/xeno/IdeaProjects/spring-app-commons/test-app/src/main/java/module-info.java:[8,54] module not found: spring.beans [WARNING] /home/xeno/IdeaProjects/spring-app-commons/test-app/src/main/java/module-info.java:[9,36] module not found: spring.core {code} {code:xml} <?xml version="1.0" encoding="UTF-8"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion> <groupId>com.xenoterracide</groupId> <artifactId>spring-app-commons</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <name>Common Modules for a Spring Boot Application</name> <modules> <module>test-app</module> </modules> <properties> <java.version>17</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>3.3.2</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.jspecify</groupId> <artifactId>jspecify</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> <version>3.26.3</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement> <build> <pluginManagement> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.13.0</version> <configuration> <release>17</release> <compilerArgs> <compilerArg>-XDcompilePolicy=simple</compilerArg> <compilerArg>-Xplugin:ErrorProne</compilerArg> </compilerArgs> <annotationProcessorPaths> <annotationProcessorPath> <groupId>com.google.errorprone</groupId> <artifactId>error_prone_core</artifactId> <version>2.30.0</version> </annotationProcessorPath> </annotationProcessorPaths> </configuration> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>3.3.1</version> </plugin> </plugins> </pluginManagement> </build> </project> {code} {code:xml} <?xml version="1.0" encoding="UTF-8"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.xenoterracide</groupId> <artifactId>spring-app-commons</artifactId> <version>1.0-SNAPSHOT</version> <relativePath>../pom.yml</relativePath> </parent> <artifactId>test-app</artifactId> <dependencies> <dependency> <groupId>org.jspecify</groupId> <artifactId>jspecify</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-test-autoconfigure</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> <scope>test</scope> </dependency> </dependencies> </project> {code} This issue would not occur if `spring-beans` and `spring-core` were included on the modulepath. I believe that Spring is generating a class that implicitly imports my class, resulting in a scenario where `spring-beans` requires my module, but my module does not require `spring-beans`. Removing this export would result in a build failure. note: I need to make these the right scope again because they are runtime not compile time. Also, I'm migrating from gradle where I did not receive this warning. -- This message was sent by Atlassian Jira (v8.20.10#820010)