[ 
https://issues.apache.org/jira/browse/MCOMPILER-348?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16545554#comment-16545554
 ] 

Robert Scholte commented on MCOMPILER-348:
------------------------------------------

{noformat}
[DEBUG] Classpath:
[DEBUG]  G:\projets\wires\wires\wires\clientmod\target\test-classes
[DEBUG]  C:\Users\User\.m2\repository\junit\junit\4.12\junit-4.12.jar
[DEBUG]  
C:\Users\User\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar
[DEBUG] Modulepath:
[DEBUG]  G:\projets\wires\wires\wires\clientmod\target\classes
[DEBUG]  
G:\projets\wires\wires\wires\apimod\target\apimod-1.0-SNAPSHOT-tests.jar
[DEBUG]  G:\projets\wires\wires\wires\apimod\target\apimod-1.0-SNAPSHOT.jar
{noformat}
My guess is that apimod-1.0-SNAPSHOT-tests.jar should have been on the 
classpath and not on the modulepath. The only reason I can think of that it was 
added to the modulepath is when its automatic module name is also apimod.
Changing the name to something that doesn't collide with the automatic 
modulename fixes the issue ( e.g. info.example.apimod )

> 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
>         Attachments: MCOMPILER-348-reproduce.7z, 
> mvn-X-clean-install-output.txt
>
>
> 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: Compilation 
> failure:
> [ERROR] 
> /G:/projets/wires/wires/wires/clientmod/src/test/java/qux/DerivedTest.java:[3,11]
>  package api does not exist
> [ERROR] 
> /G:/projets/wires/wires/wires/clientmod/src/test/java/qux/DerivedTest.java:[11,13]
>  cannot find symbol
> [ERROR]   symbol:   class Base
> [ERROR]   location: class qux.DerivedTest
> [ERROR] -> [Help 1]
> {code}
> *That same test {{DerivedTest}} compiles and runs just fine in IntelliJ!* So 
> it's probably worth it to look at the different flags that Maven passes to 
> javac and java compared to IJ? 
> 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: Compilation 
> failure:
> [ERROR] 
> /G:/projets/wires/wires/wires/clientmod/src/test/java/qux/DerivedTest.java:[3,11]
>  package api does not exist
> [ERROR] 
> /G:/projets/wires/wires/wires/clientmod/src/test/java/qux/DerivedTest.java:[11,13]
>  cannot find symbol
> [ERROR]   symbol:   class Base
> [ERROR]   location: class qux.DerivedTest
> [ERROR] -> [Help 1]
> {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}
> //import baz.BaseTest;
> 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)

Reply via email to