NET2Java之十二:常见问题
到这里,除了一些常用框架如Spring、MyBatis、Netty需要单独学习,基本上可以上手Java项目了,当然在开发过程中肯定还会遇见各种问题,这里对常见问题做个汇总。
命名
关于命名规范,Java和.Net还是略有不同,建议通读《阿里巴巴Java开发手册》,可以帮你少走很多弯路,比如这条:
- 【强制】所有的相同类型的包装类对象之间值的比较,全部使用 equals方法比较。 说明:对于 Integer var = ? 在-128 至 127 范围内的赋值,Integer对象是在 IntegerCache.cache产生,会复用已有对象,这个区间内的 Integer值可以直接使用==进行 判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑, 推荐使用 equals方法进行判断。
专坑有经验的老doter。
依赖冲突
依赖冲突也是中最常见问题之一,通常都是由于包之间的简介依赖引起的,所以我们需要先定位到冲突的jar,然后将不需要依赖的jar排除。
查看冲突
我们可以通过如下命令查看版本冲突:
mvn -Dverbose dependency:tree
截取部分输入如下:
[INFO] com.lmmplat.net2java:implat-replay:jar:1.0-SNAPSHOT
[INFO] +- junit:junit:jar:3.8.1:test
[INFO] +- org.xerial:sqlite-jdbc:jar:3.34.0:compile
[INFO] +- org.mongodb:mongo-java-driver:jar:3.12.14:compile
[INFO] +- com.fasterxml.jackson.core:jackson-databind:jar:2.12.0:compile
[INFO] | +- com.fasterxml.jackson.core:jackson-annotations:jar:2.12.0:compile
[INFO] | \- com.fasterxml.jackson.core:jackson-core:jar:2.12.0:compile
[INFO] +- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.13.5:compile
[INFO] | +- (com.fasterxml.jackson.core:jackson-annotations:jar:2.13.5:compile - omitted for conflict with 2.12.0)
[INFO] | +- (com.fasterxml.jackson.core:jackson-core:jar:2.13.5:compile - omitted for conflict with 2.12.0)
[INFO] | \- (com.fasterxml.jackson.core:jackson-databind:jar:2.13.5:compile - omitted for conflict with 2.12.0)
[INFO] \- org.projectlombok:lombok:jar:1.18.32:compile
[INFO] ------------------------------------------------------------------------
其中带有omitted for conflict提示表示jar存在依赖冲突,该行的包不会被引入,例如示例中的jackson-core:jar:2.13.5不会被引入,当然,使用mvn命令并不直观,我们可以安装Idea的maven helper插件更为直观的管理依赖冲突。

安装完插件后重启IDE,打开pom.xml就可以在Dependency Analyzer插件中看到冲突的jar:

解决冲突
解决冲突的方式一般有三种,一种是显示声明,因为maven中直接依赖的优先级高于传递依赖,比如直接显示声明slf4j-api的版本为2.0.1,则版本会被锁定:
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.1</version>
</dependency>
</dependencies>
另一种是在引用时主动排除依赖如:
<dependencies>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-java</artifactId>
<version>1.9.3</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java_2.11</artifactId>
<version>1.9.3</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
最后一种是通过dependencyManagement锁定依赖版本,如:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.1</version>
</dependency>
</dependencies>
</dependencyManagement>

浙公网安备 33010602011771号