NET2Java之十二:常见问题

到这里,除了一些常用框架如Spring、MyBatis、Netty需要单独学习,基本上可以上手Java项目了,当然在开发过程中肯定还会遇见各种问题,这里对常见问题做个汇总。

命名

关于命名规范,Java和.Net还是略有不同,建议通读《阿里巴巴Java开发手册》,可以帮你少走很多弯路,比如这条:

  1. 【强制】所有的相同类型的包装类对象之间值的比较,全部使用 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>
posted @ 2024-06-20 13:42  古法编程  阅读(32)  评论(0)    收藏  举报