相关疑难解决方法(0)

Java 9 + maven + junit:测试代码是否需要自己的module-info.java以及放置它的位置?

假设我有一个使用Maven 3和junit的Java项目.有src/main/javasrc/test/java目录分别包含主要来源和测试来源(一切都是标准的).

现在我想将项目迁移到Java 9. src/main/java内容代表Java 9模块; 有com/acme/project/module-info.java看大约是这样的:

module com.acme.project {
    require module1;
    require module2;
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果测试代码需要module-info.java自己怎么办?例如,添加对某些模块的依赖性,该模块仅用于测试,而不是生产代码.在这种情况下,我必须把module-info.javasrc/test/java/com/acme/project/给模块不同的名称.这样Maven似乎将主要源和测试源视为不同的模块,因此我必须将包从主模块导出到测试模块,并且需要测试模块中的包,如下所示:

主模块(in src/main/java/com/acme/project):

module prod.module {
    exports com.acme.project to test.module;
}
Run Code Online (Sandbox Code Playgroud)

测试模块(in src/test/java/com/acme/project):

module test.module {
    requires junit;
    requires prod.module;
}
Run Code Online (Sandbox Code Playgroud)

这产生了

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:testCompile (default-testCompile) on project test-java9-modules-junit: Compilation failure: Compilation failure:
[ERROR] /home/rpuch/git/my/test-java9-modules-junit/src/test/java/com/acme/project/GreeterTest.java:[1,1] package exists in another module: prod.module
Run Code Online (Sandbox Code Playgroud)

因为一个包在两个模块中定义.所以现在我必须在主模块和测试模块中有不同的项目,这是不方便的.

我觉得我走错了道路,一切都开始看起来非常难看.如何module-info.java在测试代​​码中拥有自己的代码,或者如何在没有测试代码的情况下实现相同的效果(require …

java junit maven java-9 java-module

32
推荐指数
2
解决办法
7404
查看次数

在具有模块间测试依赖性的Maven构建中正确实现Java模块

我有一个使用Maven和Java的多模块项目.我现在正在尝试迁移到Java 9/10/11并实现模块(如JSR 376:Java平台模块系统,JPMS).由于项目已经由Maven模块组成,并且依赖项是直接的,因此为项目创建模块描述符非常简单.

每个Maven模块现在module-info.javasrc/main/java文件夹中都有自己的模块描述符().测试类没有模块描述符.

但是,我偶然发现了一个我无法解决的问题,并没有找到任何关于如何解决的说明:

如何使用Maven和Java模块进行模块间测试依赖?

在我的例子中,我有一个"通用"Maven模块,它包含一些接口和/或抽象类(但没有具体的实现).在相同的Maven模块中,我有抽象测试来确保这些接口/抽象类的实现的正确行为.然后,有一个或多个子模块,接口/抽象类的实现和扩展抽象测试的测试.

但是,在尝试执行testMaven构建阶段时,子模块将失败并显示:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.0:testCompile (default-testCompile) on project my-impl-module: Compilation failure: Compilation failure:
[ERROR] C:\projects\com.example\my-module-test\my-impl-module\src\test\java\com\example\impl\FooImplTest.java:[4,25] error: cannot find symbol
[ERROR]   symbol:   class FooAbstractTest
[ERROR]   location: package com.example.common
Run Code Online (Sandbox Code Playgroud)

我怀疑这是因为测试不是模块的一部分.即使Maven在模块范围内执行测试还有一些"魔力",但它不适用于我依赖的模块中的测试(出于某种原因).我该如何解决?

项目的结构如下所示(此处提供完整的演示项目文件):

????my-common-module
?   ????pom.xml
?   ????src
?       ????main
?       ?   ????java
?       ?       ????com
?       ?       ?   ????example
?       ?       ?       ????common
?       ?       ?           ????AbstractFoo.java (abstract, …
Run Code Online (Sandbox Code Playgroud)

java junit module maven java-9

19
推荐指数
1
解决办法
1390
查看次数

Java9多模块Maven项目测试依赖项

我有三个模块的多模块Maven项目core,utils以及test-utils

Core具有以下依赖项定义

<dependency>
   <groupId>my.project</groupId>
   <artifactId>utils</artifactId>
</dependency>
<dependency>
   <groupId>my.project</groupId>
   <artifactId>test-utils</artifactId>
   <scope>test</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)

module-info.java为所有三个模块添加了Java 9 定义,它们core看起来像这样:

module my.project.core {
   requires my.project.utils;
}
Run Code Online (Sandbox Code Playgroud)

但是我无法弄清楚如何让core测试类能够test-utils在测试执行期间看到类.当maven-surefire-plugin尝试测试运行时,我找不到课程.

如果我添加一个requires my.project.testutils;coremodule-info.java:

module my.project.core {
   requires my.project.utils;
   requires my.project.testutils; //test dependency
}
Run Code Online (Sandbox Code Playgroud)

然后在编译时我得到一个错误,my.project.testutils模块无法找到(大概是因为它只是作为测试依赖项引入).

如何在Java 9模块化世界中使用测试依赖项?出于显而易见的原因,我不希望我的主代码引入测试依赖项.我错过了什么吗?

java maven java-platform-module-system maven-surefire-plugin java-9

7
推荐指数
1
解决办法
923
查看次数

如何打开包并仅对JUnit测试要求依赖于测试范围模块

我正在将使用类路径的jar项目从Java 10迁移到使用Java 9拼图模块的Java 11。该项目有JUnit5测试。测试依赖项由maven在测试范围内提供。当另一个项目使用该模块时,如何使所有程序包打开以进行测试,但不打开?

jar项目只是为其他项目提供了一些类(例如实用程序项目)(因此不需要主类)。

该项目在/ src / main / java / a / b / c /中有5个软件包。使用此jar的项目应该可以访问其中的2个。其他3个仅供内部使用(供可访问者使用)。测试位于/ src / test / java / a / b / c /。这些测试具有测试范围中提供的依赖项(JUnit,mockito,junt-params),因为这些测试与使用此jar的项目无关

<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)

我在/ src / main / java /中提供了一个module-info.java

module moduleName {

requires java.base;

exports a.b.c.package1;
exports a.b.c.package3;
}
Run Code Online (Sandbox Code Playgroud)

因此,现在,第1包和第3包中的公共课程应该可以按预期供其他项目使用(我尚未能够对此进行验证)。

现在运行测试会导致java.lang.reflect.InaccessibleObjectException:无法访问abcpackage1.collections.SomeTest():模块moduleName不会“打开abcpackage1”到未命名的模块@ 6a84a97d

当我打开包装(带有opens)时,一切运行顺利。但是现在所有程序包都已打开。我希望仅在测试期间才能访问包2、4和5,并且不应打开包1和3进行反射(因此只能导出)。

我想到了,因为maven告诉我未命名的模块 @ 6a84a97d,所以这可能是为测试而创建的模块。这使我尝试在/ src / test / java /中添加一个 …

java maven java-platform-module-system junit5

7
推荐指数
1
解决办法
562
查看次数