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)

Reply via email to