[ https://issues.apache.org/jira/browse/MCOMPILER-348?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
foo bar updated MCOMPILER-348: ------------------------------ Description: h1. In short With Java 9 if I declare both the test-scoped dependency and the Java 9 modules the test doesn't compile anymore (mvn clean install output): {code:java} [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:testCompile (default-testCompile) on project clientmod: Compilation failure [ERROR] /G:/projets/wires/wires/wires/clientmod/src/test/java/client/test/DerivedTest.java:[8,22] cannot access api.Base [ERROR] class file for api.Base not found {code} h1. Explanation of the 2 modules, and what fails I have a java 9 maven project with 2 modules: {{apimod}} and {{clientmod}}. Module {{clientmod}} depends on module {{apimod}} (those modules are both Maven modules and Java 9 modules). Also, i want module {{clientmod}} to be able to reuse not only production code from {{apimod}}, *but also test code*. This is a common pattern, that I used many times with Java 8. With Java 9 (it's the same with Java 10) it also works fine, as long as i don't declare module-info.java (that is, as long as I don't run with the module system). But as soon as I do, enabling the test dependency seems to disable the production dependency: {{api.Base}} (an {{src/main}} class of module {{apimod}}) is no longer visible from {{qux.DerivedTest}} (an {{src/test}} class of module {{clientmod}}). The test doesn't compile anymore. (_Note that every class is in a different package to eliminate split packages as a cause of the problem_) This is with: Java 9.0.4 (it's the same with Java 10), Maven 3.5.3, maven-compiler-plugin 3.7.0 h1. A project to reproduce the issue h2. The code I "dichotomized" the issue with a failing test in a branch: {code:java} git clone https://github.com/vandekeiser/wires.git git checkout MCOMPILER_ISSUE2 mvn clean install{code} -> BUILD FAIL (compilation error in the test of {{clientmod}}) h2. The Maven test-scoped dependency I want module {{clientmod}} to be able to reuse not only production code from {{apimod}} but also test code. With Maven you do it like that ({{clientmod/pom.xml}}): {code:java} <dependency> <groupId>fr.cla</groupId> <artifactId>apimod</artifactId> <version>${project.version}</version> <classifier>tests</classifier> <scope>test</scope> </dependency> {code} h2. The Java 9 modules {code:java} module apimod { exports api; } module clientmod { requires apimod; } {code} h2. The failure when trying to enable both module systems With Java 9 if I declare both the test-scoped dependency and the Java 9 modules the test doesn't compile anymore ({{mvn clean install}} output): {code:java} [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:testCompile (default-testCompile) on project clientmod: Compilation failure [ERROR] /G:/projets/wires/wires/wires/clientmod/src/test/java/client/test/DerivedTest.java:[8,22] cannot access api.Base [ERROR] class file for api.Base not found {code} h1. My analysis so far h2. It works if i remove the test-scope dependency If i comment the test-dependency, {{mvn clean install}} passes: {code:java} DerivedTest /*extends BaseTest*/ {code} {code:java} <!--Comment the following to make mvn clean install pass (but then you can't have DerivedTest extends BaseTest)-–> <!--<dependency>--> <!--<groupId>fr.cla</groupId>--> <!--<artifactId>apimod</artifactId>--> <!--<version>${project.version}</version>--> <!--<classifier>tests</classifier>--> <!--<scope>test</scope>--> <!--</dependency>--> {code} h2. Trying to pass explicit module flags to the JVM After asking here: [https://stackoverflow.com/questions/50122838/cant-make-maven-test-scoped-dependencies-work-with-java-9-nor-10-modules] I tried the following flags to move {{apimod-1.0-SNAPSHOT-tests.jar}} from {{--module-path}} to {{--patch-module clientmod}}, it compiles but then surefire fails so it must not be right either (anyway passing all those flags is fragile): {code:java} <!--This makes the test compile even with the test-scoped dependency present, but then surefire fails (so probably those flags are incorrect too)--> <compilerArgs> <arg>--module-source-path=./*/src/main/java;./*/src/test/java/;</arg> <arg> --source-path=/G/projets/wires/wires/wires/apimod/src/main/java;/G/projets/wires/wires/wires/apimod/src/test/java;/G/projets/wires/wires/wires/clientmod/src/test/java;/G/projets/wires/wires/wires/clientmod/src/main/java; </arg> <arg>-Xlint:all</arg> <arg> --patch-module=clientmod=/G/projets/wires/wires/wires/clientmod/target/classes;/G/projets/wires/wires/wires/clientmod/src/test/java;/G/projets/wires/wires/wires/apimod/target/apimod-1.0-SNAPSHOT.jar;/G/projets/wires/wires/wires/apimod/target/apimod-1.0-SNAPSHOT-tests.jar; </arg> <arg>--add-reads=apimod=ALL-UNNAMED</arg> <arg>--add-reads=clientmod=ALL-UNNAMED</arg> <arg>--add-exports=apimod/api=ALL-UNNAMED</arg> <arg>--add-exports=clientmod/client=ALL-UNNAMED</arg> <arg>--add-modules=apimod</arg> </compilerArgs> {code} Just mentioning this in case the problem would be wrong javac flags. was: h1. In short With Java 9 if I declare both the test-scoped dependency and the Java 9 modules the test doesn't compile anymore (mvn clean install output): {code:java} [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:testCompile (default-testCompile) on project clientmod: Compilation failure [ERROR] /G:/projets/wires/wires/wires/clientmod/src/test/java/client/test/DerivedTest.java:[8,22] cannot access api.Base [ERROR] class file for api.Base not found {code} h1. Explanation of the 2 modules, and what fails I have a java 9 maven project with 2 modules: {{apimod}} and {{clientmod}}. Module {{clientmod}} depends on module {{apimod}} (those modules are both Maven modules and Java 9 modules). Also, i want module {{clientmod}} to be able to reuse not only production code from {{apimod}}, *but also test code*. This is a common pattern, that I used many times with Java 8. With Java 9 (it's the same with Java 10) it also works fine, as long as i don't declare module-info.java (that is, as long as I don't run with the module system). But as soon as I do, enabling the test dependency seems to disable the production dependency: {{api.Base}} (an {{src/main}} class of module {{apimod}}) is no longer visible from {{qux.DerivedTest}} (an {{src/test}} class of module {{clientmod}}). The test doesn't compile anymore. (_Note that every class is in a different package to eliminate split packages as a cause of the problem_) This is with: Java 9.0.4 (it's the same with Java 10), Maven 3.5.3, maven-compiler-plugin 3.7.0 h1. A project to reproduce the issue h2. The code I "dichotomized" the issue with a failing test in a branch: {code:java} git clone https://github.com/vandekeiser/wires.git git checkout MCOMPILER_ISSUE2 mvn clean install{code} -> BUILD FAIL (compilation error in the test of {{clientmod}}) h2. The Maven test-scoped dependency I want module {{clientmod}} to be able to reuse not only production code from {{apimod}} but also test code. With Maven you do it like that ({{clientmod/pom.xml}}): {code:java} <dependency> <groupId>fr.cla</groupId> <artifactId>apimod</artifactId> <version>${project.version}</version> <classifier>tests</classifier> <scope>test</scope> </dependency> {code} h2. The Java 9 modules {code:java} module apimod { exports api; } module clientmod { requires apimod; } {code} h2. The failure when trying to enable both module systems With Java 9 if I declare both the test-scoped dependency and the Java 9 modules the test doesn't compile anymore ({{mvn clean install}} output): {code:java} [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:testCompile (default-testCompile) on project clientmod: Compilation failure [ERROR] /G:/projets/wires/wires/wires/clientmod/src/test/java/client/test/DerivedTest.java:[8,22] cannot access api.Base [ERROR] class file for api.Base not found {code} h1. My analysis so far h2. It works if i remove the test-scope dependency If i comment the test-dependency, {{mvn clean install}} passes: {code:java} DerivedTest /*extends BaseTest*/ {code} {code:java} {color}{color:#808080}(but then you can't have DerivedTest extends BaseTest)–>{color} {color:#808080} <!--Comment the following to make mvn clean install pass {color}{color:#808080}<!--<dependency>--> {color}{color:#808080} <!--<groupId>fr.cla</groupId>--> {color}{color:#808080} <!--<artifactId>apimod</artifactId>--> {color}{color:#808080} <!--<version>${project.version}</version>--> {color}{color:#808080} <!--<classifier>tests</classifier>--> {color}{color:#808080} <!--<scope>test</scope>--> {color}{color:#808080}<!--</dependency>-->{color} {code} h2. Trying to pass explicit module flags to the JVM After asking here: [https://stackoverflow.com/questions/50122838/cant-make-maven-test-scoped-dependencies-work-with-java-9-nor-10-modules] I tried the following flags to move {{apimod-1.0-SNAPSHOT-tests.jar}} from {{\--module-path}} to {{\--patch-module clientmod}}, it compiles but then surefire fails so it must not be right either (anyway passing all those flags is fragile): {code:java} <!--This makes the test compile even with the test-scoped dependency present, but then surefire fails (so probably those flags are incorrect too)--> <compilerArgs> <arg>--module-source-path=./*/src/main/java;./*/src/test/java/;</arg> <arg> --source-path=/G/projets/wires/wires/wires/apimod/src/main/java;/G/projets/wires/wires/wires/apimod/src/test/java;/G/projets/wires/wires/wires/clientmod/src/test/java;/G/projets/wires/wires/wires/clientmod/src/main/java; </arg> <arg>-Xlint:all</arg> <arg> --patch-module=clientmod=/G/projets/wires/wires/wires/clientmod/target/classes;/G/projets/wires/wires/wires/clientmod/src/test/java;/G/projets/wires/wires/wires/apimod/target/apimod-1.0-SNAPSHOT.jar;/G/projets/wires/wires/wires/apimod/target/apimod-1.0-SNAPSHOT-tests.jar; </arg> <arg>--add-reads=apimod=ALL-UNNAMED</arg> <arg>--add-reads=clientmod=ALL-UNNAMED</arg> <arg>--add-exports=apimod/api=ALL-UNNAMED</arg> <arg>--add-exports=clientmod/client=ALL-UNNAMED</arg> <arg>--add-modules=apimod</arg> </compilerArgs> {code} Just mentioning this in case the problem would be wrong javac flags. > Can't make test-scoped dependencies work with Java 9 modules > ------------------------------------------------------------ > > Key: MCOMPILER-348 > URL: https://issues.apache.org/jira/browse/MCOMPILER-348 > Project: Maven Compiler Plugin > Issue Type: Bug > Affects Versions: 3.7.0 > Environment: $ mvn -version > Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; > 2018-06-17T20:33:14+02:00) > Maven home: G:\software\apache-maven-3.5.4-bin\apache-maven-3.5.4 > Java version: 9.0.4, vendor: Oracle Corporation, runtime: C:\Program > Files\Java\jdk-9.0.4 > Default locale: fr_FR, platform encoding: Cp1252 > OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows" > Reporter: foo bar > Priority: Major > Labels: Java9, jigsaw, scope, test > > h1. In short > With Java 9 if I declare both the test-scoped dependency and the Java 9 > modules the test doesn't compile anymore (mvn clean install output): > {code:java} > [ERROR] Failed to execute goal > org.apache.maven.plugins:maven-compiler-plugin:3.7.0:testCompile > (default-testCompile) on project clientmod: Compilation failure > [ERROR] > /G:/projets/wires/wires/wires/clientmod/src/test/java/client/test/DerivedTest.java:[8,22] > cannot access api.Base > [ERROR] class file for api.Base not found > {code} > > h1. Explanation of the 2 modules, and what fails > I have a java 9 maven project with 2 modules: {{apimod}} and {{clientmod}}. > Module {{clientmod}} depends on module {{apimod}} (those modules are both > Maven modules and Java 9 modules). > Also, i want module {{clientmod}} to be able to reuse not only production > code from {{apimod}}, *but also test code*. This is a common pattern, that I > used many times with Java 8. With Java 9 (it's the same with Java 10) it also > works fine, as long as i don't declare module-info.java (that is, as long as > I don't run with the module system). > But as soon as I do, enabling the test dependency seems to disable the > production dependency: {{api.Base}} (an {{src/main}} class of module > {{apimod}}) is no longer visible from {{qux.DerivedTest}} (an {{src/test}} > class of module {{clientmod}}). The test doesn't compile anymore. (_Note that > every class is in a different package to eliminate split packages as a cause > of the problem_) > This is with: Java 9.0.4 (it's the same with Java 10), Maven 3.5.3, > maven-compiler-plugin 3.7.0 > > h1. A project to reproduce the issue > h2. The code > I "dichotomized" the issue with a failing test in a branch: > {code:java} > git clone https://github.com/vandekeiser/wires.git > git checkout MCOMPILER_ISSUE2 > mvn clean install{code} > -> BUILD FAIL (compilation error in the test of {{clientmod}}) > h2. The Maven test-scoped dependency > I want module {{clientmod}} to be able to reuse not only production code from > {{apimod}} but also test code. With Maven you do it like that > ({{clientmod/pom.xml}}): > {code:java} > <dependency> > <groupId>fr.cla</groupId> > <artifactId>apimod</artifactId> > <version>${project.version}</version> > <classifier>tests</classifier> > <scope>test</scope> > </dependency> > {code} > h2. The Java 9 modules > {code:java} > module apimod { > exports api; > } > module clientmod { > requires apimod; > } > {code} > h2. The failure when trying to enable both module systems > With Java 9 if I declare both the test-scoped dependency and the Java 9 > modules the test doesn't compile anymore ({{mvn clean install}} output): > {code:java} > [ERROR] Failed to execute goal > org.apache.maven.plugins:maven-compiler-plugin:3.7.0:testCompile > (default-testCompile) on project clientmod: Compilation failure > [ERROR] > /G:/projets/wires/wires/wires/clientmod/src/test/java/client/test/DerivedTest.java:[8,22] > cannot access api.Base > [ERROR] class file for api.Base not found > {code} > h1. My analysis so far > h2. It works if i remove the test-scope dependency > If i comment the test-dependency, {{mvn clean install}} passes: > {code:java} > DerivedTest /*extends BaseTest*/ > {code} > {code:java} > <!--Comment the following to make mvn clean install pass (but then you can't > have DerivedTest extends BaseTest)-–> > <!--<dependency>--> > <!--<groupId>fr.cla</groupId>--> > <!--<artifactId>apimod</artifactId>--> > <!--<version>${project.version}</version>--> > <!--<classifier>tests</classifier>--> > <!--<scope>test</scope>--> > <!--</dependency>--> > {code} > > h2. Trying to pass explicit module flags to the JVM > After asking here: > [https://stackoverflow.com/questions/50122838/cant-make-maven-test-scoped-dependencies-work-with-java-9-nor-10-modules] > I tried the following flags to move {{apimod-1.0-SNAPSHOT-tests.jar}} from > {{--module-path}} to {{--patch-module clientmod}}, it compiles but then > surefire fails so it must not be right either (anyway passing all those flags > is fragile): > {code:java} > <!--This makes the test compile even with the test-scoped dependency > present, but then surefire fails (so probably those flags are incorrect > too)--> > <compilerArgs> > <arg>--module-source-path=./*/src/main/java;./*/src/test/java/;</arg> > <arg> > > --source-path=/G/projets/wires/wires/wires/apimod/src/main/java;/G/projets/wires/wires/wires/apimod/src/test/java;/G/projets/wires/wires/wires/clientmod/src/test/java;/G/projets/wires/wires/wires/clientmod/src/main/java; > </arg> > <arg>-Xlint:all</arg> > <arg> > > --patch-module=clientmod=/G/projets/wires/wires/wires/clientmod/target/classes;/G/projets/wires/wires/wires/clientmod/src/test/java;/G/projets/wires/wires/wires/apimod/target/apimod-1.0-SNAPSHOT.jar;/G/projets/wires/wires/wires/apimod/target/apimod-1.0-SNAPSHOT-tests.jar; > </arg> > <arg>--add-reads=apimod=ALL-UNNAMED</arg> > <arg>--add-reads=clientmod=ALL-UNNAMED</arg> > <arg>--add-exports=apimod/api=ALL-UNNAMED</arg> > <arg>--add-exports=clientmod/client=ALL-UNNAMED</arg> > <arg>--add-modules=apimod</arg> > </compilerArgs> > {code} > Just mentioning this in case the problem would be wrong javac flags. -- This message was sent by Atlassian JIRA (v7.6.3#76005)