我有一个简单的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 build并设置了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项目,可以观察到所有这些.
所以我的问题是:
automatic module并且需要声明它们?automatic module,我可以告诉Maven以某种方式过渡性地允许我的依赖需要引入的任何东西吗?例如Weld的其他部分,CDI API等.requires模块,我不直接使用?例如weld.environment.common我在使用 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失败。
ClassExtensionContext和JupiterEngineExtensionContext相当模糊。这是我尝试与商店合作的(非常)简化版本(基本上删除所有其他信息)。我还添加了一些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) 我正在尝试为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修改扩展的行为.任何指针赞赏.