maven-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Robert Scholte (JIRA)" <j...@apache.org>
Subject [jira] [Comment Edited] (MCOMPILER-348) Can't make test-scoped dependencies work with Java 9 modules
Date Mon, 16 Jul 2018 18:00:00 GMT

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

Robert Scholte edited comment on MCOMPILER-348 at 7/16/18 5:59 PM:
-------------------------------------------------------------------

{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 )
In general, please pick a more unique modulename, it *must* be globally unique (just like
the classes on the classpath). Add reverseDNS or the shared package.


was (Author: rfscholte):
{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)

Mime
View raw message