小编Sil*_*rus的帖子

使用Maven构建具有非模块化依赖关系的JDK 9项目需要什么

我有一个简单的Java 9 SE项目,其中一个依赖于非模块化项目(在本例中选择了Weld SE),我正在尝试使用Maven(clean install)构建它.为了使Java 9能够启动,我已经添加了module-info.java.最初,此文件仅包含模块名称,并且没有requires公式.

请记住,我唯一的依赖是不是一个模块化的项目,因此,我认为Maven会放在类路径中(不模块路径),因此它会在结束unnamed module中描述的模块化系统的状态.

现在,我的Maven版本是3.3.9,我知道我需要在版本3.6中使用Maven编译器插件,如此处所述当然我已经使用jigsaw下载了JDK 9 EA bu​​ild并设置了Maven来使用它.

如果我没有构建我的项目module-info.java,一切正常,将东西添加到类路径并构建成功.我想只要你遗漏那个文件,Maven就会坚持旧的方式.

但是,建造它 module-info.java告诉我,从我的依赖的类不能在类路径中找到.所以我在调试模式下运行Maven(使用-X),确实 - 所有jar都在module-path下,classpath为空.这实际上意味着我的所有依赖项都被转移到自动模块中,我需要声明它们module-info.java.

一旦我声明了自动模块要求(链接到项目的module-info),我就可以在JDK 9上构建它.但它有点混乱 - 我唯一的pom.xml依赖是weld-se-core,但我module-info要求我宣布更多的编译要求通过.

这是一个完整的GitHub项目,可以观察到所有这些.

所以我的问题是:

  1. 如果我知道它们没有模块化,我可以告诉Maven在类路径上放置一些工件吗?这样我就可以避免automatic module并且需要声明它们?
  2. 如果我坚持automatic module,我可以告诉Maven以某种方式过渡性地允许我的依赖需要引入的任何东西吗?例如Weld的其他部分,CDI API等.
  3. 实际的原因是什么,为什么我需要声明,我的项目requires模块,我不直接使用?例如weld.environment.common

java maven java-platform-module-system java-9

12
推荐指数
1
解决办法
1836
查看次数

使用 JUnit 5,如何在测试实例之间共享“ExtensionContext.Store”中的信息?

我在使用 JUnit 5(5.0 或 5.1)和自定义扩展时遇到了麻烦。

我们正在使用服务加载器加载所有实现,然后修改我们的扩展如何引导。这些实现只能加载一次,所以我正在考虑使用ExtensionContext.Store并将其放置在那里。然后,每个后续的测试实例都会从而Store不是通过服务加载器加载它。

现在,我什至知道分层上下文结构,并且我知道有一些“根”上下文可以通过ExtensionContext.getRoot(). 但是这个“根”上下文(实例JupiterEngineExtensionContext)并不是真正的根——每个测试实例都有不同的上下文。

假设你有FooTestand BarTest,然后打印出getRoot()每个产量:

org.junit.jupiter.engine.descriptor.JupiterEngineExtensionContext@1f9e9475 org.junit.jupiter.engine.descriptor.JupiterEngineExtensionContext@6c3708b3

因此尝试从中检索先前存储的信息Store失败。

  • 有这个限制吗?它使之间的界线ClassExtensionContextJupiterEngineExtensionContext相当模糊。
  • 还有另一种方法可以通过扩展全局存储一些信息吗?

这是我尝试与商店合作的(非常)简化版本(基本上删除所有其他信息)。我还添加了一些System.out.print()电话来强调我所看到的。在两个测试类上执行这个扩展会产生我上面描述的结果:

    public class MyExtension implements BeforeAllCallback {

    @Override
    public void beforeAll(ExtensionContext context) throws Exception {
        System.out.println(context.getRoot());
        if (context.getRoot().getStore(Namespace.create(MyExtension.class)).get("someIdentifier", String.class) == null) {
            context.getRoot().getStore(Namespace.create(MyExtension.class)).put("someIdentifier", "SomeFooString");
        } else {
            // this is never executed
            System.out.println("Found it, no need to store anything again!"); …
Run Code Online (Sandbox Code Playgroud)

java junit junit5

6
推荐指数
1
解决办法
4370
查看次数

JUnit 5,将信息从测试类传递给扩展

我正在尝试为Junit5编写一个类似于Junit4的扩展,但是我没有意识到在新的(无状态)扩展系统中如何做到这一点.

之前版本中的想法是用户可以将信息传递到扩展类,从而改变其行为方式.这是一个伪代码段,大致显示了以前的用法:

public void MyTest {

  // here I can define different behaviour for my extension
  @Rule MyCustomRule rule = MyCustomRule.of(Foo.class).withPackage(Bar.class.getPackage).alsoUse(Cookies.class);

  @Test
  public void someTest() {
    // some test code already affected by the @Rule
    // plus, user has access to that class and can use it, say, retrieve additional information
    rule.grabInfoAboutStuff();
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,我知道如何操作JUnit 5扩展,使用什么生命周期等等.但我不知道如何让测试编写者有权使用JUnit5修改扩展的行为.任何指针赞赏.

java junit junit5 junit5-extension-model

3
推荐指数
1
解决办法
1188
查看次数