【发布时间】:2018-03-03 06:57:00
【问题描述】:
在将我们的一个项目迁移到 Java 9(build 9+181) 时,我遇到了一个特殊的问题,在使用的某些库中看起来像是不正确的实现与type inference 和java-module 相关。我正在使用 dropwizard-core(1.1.0) 和 guice(4.1.0) 配置如下:
public class CustomService extends io.dropwizard.Application<CustomServiceConfig> {
public static void main(String[] args) throws Exception {
new CustomService().run(args);
}
// other initializations
@Override
public void run(CustomServiceConfig config, io.dropwizard.setup.Environment environment) throws Exception {
com.google.inject.Injector injector = createInjector(config, environment);
environment.jersey().register(injector.getInstance(SomeResource.class)); //line 45
environment.healthChecks().register("DBHealth", injector.getInstance(HealthCheck.class));
environment.servlets().addFilter("Filter-Name", SomeFilter.class)
.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*");
}
private com.google.inject.Injector createInjector(CustomServiceConfig config, Environment environment) {
return com.google.inject.Guice.createInjector(new CustomServiceModule(config, environment));
}
}
public class CustomServiceModule extends com.google.inject.AbstractModule {
private final CustomServiceConfig serviceConfig;
private final Environment environment;
public CustomServiceModule(CustomServiceConfig serviceConfig, Environment environment) {
this.serviceConfig = serviceConfig;
this.environment = environment;
}
@Override
protected void configure() {
bind(SomeInterface.class).to(SomeInterfaceImpl.class);
..
}
}
以下组合对我来说配置很好:
- Java 8 + Maven 3 + Compiler Plugin 3.6.1 [我们的原始设置]
- Java 9 + Maven 3 + Compiler Plugin 3.7.0(命令行和 maven 配置已更新)
但是当我切换到模块结构然后尝试编译由这些类组成的 maven 模块时,我在 mvn clean install 期间遇到了这些错误:
[ERROR] ../service/service/CustomService.java:[45,29] incompatible types: inference variable T has incompatible bounds equality constraints: base.SomeResource upper bounds: java.lang.Class<?>,java.lang.Object [ERROR] ../service/service/CustomService.java:[56,31] no suitable method found for addFilter(java.lang.String,java.lang.Class< SomeFilter >) [ERROR] method io.dropwizard.jetty.setup.ServletEnvironment.addFilter(java.lang.String,javax.servlet.Filter) is not applicable [ERROR] (argument mismatch; java.lang.Class< SomeFilter > cannot be converted to javax.servlet.Filter)
我不确定为什么会出现这些错误,以及它们是否与正在使用的模块结构有关。
第一季度。是否有任何类型推断相关的更改会影响模块结构更改(如果可能的话)的 maven 编译,请记住使用的依赖项?
此外,在迁移时,我主要使用 IntelliJ 建议的自动模块名称来构建 module-info 为:
module service {
// Internal modules which compile successfully
requires model;
requires util;
// Dependent library modules
requires httpcore;
requires guice;
requires guava;
requires dropwizard.core;
requires mongo.java.driver;
requires org.apache.commons.lang3;
requires javax.servlet.api;
}
第二季度。如果这不是迁移时的回归问题,为什么我们之前的设置没有失败?这是否还要求我们更改服务中的代码,或者如果这可能有帮助,我们是否应该等待库迁移到模块?
注意:已尝试查看依赖版本和类实现的使用情况。它们在以前的设置和当前设置中是相同的。
如果有任何我能提供帮助的进一步信息,请告诉我。
更新: 我能够在我创建的 microservice sample 中重现相同的内容,以将其与我的项目的其余部分隔离开来。
【问题讨论】:
-
我看不出模块会如何在编译器方面以任何方式影响泛型;这可能只是这里的 java-9 回归。你能通过一个更简单的测试来隔离这个问题吗?
-
@Eugene 如果这实际上可能是某个地方的回归,那将需要一些时间并提供一个孤立的项目。
-
类型推断*不是参考。
-
别担心,当你这样做的时候请给我加个标签。我真的不知道然后回答这个问题,但很乐意跟踪它。谢谢
-
@Eugene answer 有效。它是
dropwizard-core的传递依赖。虽然恕我直言,但该错误非常具有误导性,我不确定编译器插件是否会更好地报告。
标签: java-module java maven java-8 java-9 java-module