[ https://issues.apache.org/jira/browse/MCOMPILER-354?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16561270#comment-16561270 ]
foo bar edited comment on MCOMPILER-354 at 7/29/18 9:12 PM: ------------------------------------------------------------ Mhhhh! I think I get it (but this still seems problematic to me: sounds like test-scoped dependencies and whitebox tests can't work together): * {{DoesntCompile}} is in an exported package * It's method signature references a type of a non-exported package * So javac warns me that it in unusable by any client * {{Compiles}} compiles because it is not in an exported package so no such check is done. ~ So let me see the implications of this. Given a test {{T}} of a class {{C}}, if the following are both true: * {{T}} is in the same package as {{C}} (this is the case of whitebox tests - tests which exercise package-private classes and methods) * {{C}} is in an exported package Then to avoid the warning: * {{T}} must only "visibly reference" classes of exported packages (eg. a public/protected method argument or return type constitutes a visible reference, while a private/package-private does not). Indeed, if I ignore the warning, the support module compiles and runs, but the client module doesn't compile since the test class in support is not visible. ~ To sum it up, the following circumstances can't work: a/ modules {{lib}} and {{client}} are 2 maven and jigsaw modules. {{client}} depends on {{lib}} b/ class {{Clib}} in {{src/main}} of {{lib}} is in an exported package c/ class {{Tlib}} in {{src/test}} of {{lib}} is in the same package as {{Clib}} (eg. because it's a whitebox test who wants to test the package-private methods of {{Clib}}) d/ {{Tlib}} references a class {{Tlibunex}} of an unexported package (ex: a test support class) "in a visible way" (ex: as argument of a public method) e/ {{Tclient}} in {{src/test}} of {{client}} depends on {{Tlib}} --> Step e/ generates a compile error because {{Tlib}} references unexported {{Tlibunex}} (javac just says it can't find {{Tlib}}) ~ Makes sense, since: * We want to run the test with the module system, just like in production * Test classes patched into the module are indistinguishable from the main classes. *+_But _+* * I have no way to export {{Tlibunex}} since it is in {{src/test}}, and therefore not visible from {{module-info.java}} (it doesn't compile if I try to export it) ! * So doesn't that mean that test-scoped dependencies and whitebox tests can't work together? was (Author: vandekeizer): Mhhhh! I think I get it (but this still seems problematic to me: sounds like test-scoped dependencies and whitebox tests can't work together): * {{DoesntCompile}} is in an exported package * It's method signature references a type of a non-exported package * So javac warns me that it in unusable by any client * {{Compiles}} compiles because it is not in an exported package so no such check is done. ~ So let me see the implications of this. Given a test {{T}} of a class {{C}}, if the following are both true: * {{T}} is in the same package as {{C}} (this is the case of whitebox tests - tests which exercise package-private classes and methods) * {{C}} is in an exported package Then to avoid the warning: * {{T}} must only "visibly reference" classes of exported packages (eg. a public/protected method argument or return type constitutes a visible reference, while a private/package-private does not). Indeed, if I ignore the warning, the support module compiles and runs, but the client module doesn't compile since the test class in support is not visible. ~ To sum it up, the following circumstances can't work: a/ modules {{lib}} and {{client}} are 2 maven and jigsaw modules. {{client}} depends on {{lib}} b/ class {{Clib}} in {{src/main}} of {{lib}} is in an exported package c/ class {{Tlib}} in {{src/test}} of {{lib}} is in the same package as {{Clib}} (eg. because it's a whitebox test who wants to test the package-private methods of {{Clib}}) d/ {{Tlib}} references a class {{Tlibunex}} of an unexported package (ex: a test support class) "in a visible way" (ex: as argument of a public method) e/ {{Tclient}} in {{src/test}} of {{client}} depends on {{Tlib}} --> Step e/ generates a compile error because {{Tlib}} references unexported {{Tlibunex}} (javac just says it can't find {{Tlib}}) ~ Makes sense, since: * We want to run the test with the module system, just like in production * Test classes patched into the module are indistinguishable from the main classes. *But I have no way to export {{Tlibunex}} since it is in {{src/test}}, and therefore not visible from {{module-info.java}} (it doesn't compile if I try to export it) ! So doesn't that mean that test-scoped dependencies and whitebox tests can't work together? * > Module patching fails: case of simple single-module project > ----------------------------------------------------------- > > Key: MCOMPILER-354 > URL: https://issues.apache.org/jira/browse/MCOMPILER-354 > 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: 10.0.2, vendor: Oracle Corporation, runtime: C:\Program > Files\Java\jdk-10.0.2 > Default locale: fr_FR, platform encoding: Cp1252 > OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows" > Reporter: foo bar > Priority: Major > Labels: Jigsaw > Attachments: mvn-X-clean-install-FAILURE.log, project.png, wires.zip > > > Sometimes it can be difficult to setup maven test-scoped dependencies in a > Maven multi-module project. But I think I managed to find a simple 1-module > case where module patching doesn't work. > I have a single-module Java 10 project where the testCompile goal complains > that Test Class A doesn't read Test Class B, which is in the same project! > (but in a different package) > Of course, a class shouldn't need to be exported to a class of the same > module. So maybe there is a confusion somewhere between the unnamed module, > automatic modules, and explicit modules. > I think that's because of a bug in the module-patching flags passed by > testCompile to javac. > My project source tree, in its simplified branch to reproduce the issue, > looks shown in the project.png attachment. > Full log is attached as well as a zip of the issue reproduction branch. It > can also be cloned from: > {code:java} > git clone https://github.com/vandekeiser/wires.git > git checkout REPORT-MCOMPILER-2 > mvn clean install > {code} > The flags testCompile pass to javac. > {code:java} > [INFO] --- maven-compiler-plugin:3.7.0:testCompile (default-testCompile) @ > wires-support --- > [DEBUG] Command line options: > -d G:\projets\wires\wires\wires\wires-support\target\test-classes > -classpath G:\projets\wires\wires\wires\wires-support\target\test-classes; > --module-path G:\projets\wires\wires\wires\wires-support\target\classes; > -sourcepath G:\projets\wires\wires\wires\wires-support\src\test\java; > > G:\projets\wires\wires\wires\wires-support\target\generated-test-sources\test-annotations; > -s > G:\projets\wires\wires\wires\wires-support\target\generated-test-sources\test-annotations > -g -deprecation -target 10 -source 10 -encoding UTF-8 -Werror > -Xlint:all,-serial > --patch-module fr.cla.wires.support= > G:\projets\wires\wires\wires\wires-support\target\classes; > G:\projets\wires\wires\wires\wires-support\src\test\java; > > G:\projets\wires\wires\wires\wires-support\target\generated-test-sources\test-annotations; > --add-reads fr.cla.wires.support=ALL-UNNAMED > {code} > The warning I get (which for me is an error): > {code:java} > [WARNING] > /G:/projets/wires/wires/wires/wires-support/src/test/java/fr/cla/wires/support/DoesntCompile.java:[14,20] > class > fr.cla.wires.support.javac_complains_this_is_not_exported.JavacComplainsThisIsNotExported > in module fr.cla.wires.support > is not exported > [ERROR] COMPILATION ERROR : > warnings found and -Werror specified > [INFO] 1 error > {code} -- This message was sent by Atlassian JIRA (v7.6.3#76005)