美文网首页
Java 包管理与 Maven

Java 包管理与 Maven

作者: BitterOutsider | 来源:发表于2020-06-06 21:07 被阅读0次

  • JVM的⼯工作被设计地相当简单:

    • 执⾏一个类的字节码。
    • 假如这个过程中碰到了新的类,加载它。
  • 类的全限定类名(目录层级)唯一确定了一个类。

  • 包就是把许多类放在一起打的压缩包。

  • 当多个同名类出现在一个 Classpath 中时,麻烦开始了。

包管理

  • What

    • 包管理的本质就是告诉 JVM 如何找到所需的第三方类库。
    • 成功地解决其中的冲突问题。
  • How

    • ⼿动写命令进行编译运⾏
    • Apache Ant
    • Maven

Maven

  • 首先 Maven 不仅仅是包管理工具,但这里只讨论其包管理能力。
  • Maven 会有中央仓库和本地仓库两个仓库:
    • 本地仓库默认位于~/.m2目录中,里面会放置一些经过下载的第三方包的缓存。
    • 中央仓库一个包会含有 groupIdartifactIdversion 三个字段,在中央仓库中,一个包存放的路径也是以这三个字段来存放的,具体会存放在 groupId/artifactId/version 这个位置。
  • pom.xml 中添加包的信息,Maven 就会自动帮你下载这些包以及其相关依赖包到本地中缓存起来。

Maven 如何解决冲突

包冲突.jpg
  • 常见冲突报错:
    • AbstractMethodError
    • NoClassDefFoundError
    • ClassNotFoundException
    • LinkageError
  • 方法 1 是 Maven 默认解决方式为。
    • 原则:最近的胜出
  • 方法 2 手动忽略最近的包,可由以下代码实现。
    <dependency>
      <groupId>xxx</groupId>
      <artifactId>xxx</artifactId>
      <version>1.0.0</version>
      <exclusions>
        <exclusion>
            <groupId>yyy</groupId>
          <artifactId>yyy</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    
  • 方法 3 则手动创建了最近的包。
  • 使用 Maven Helper 插件,帮助解决冲突。
  • pom.xml 文件中,可以通过设置 scope 标签,来指定一个包是否可以被生产代码和测试代码所引用:
    • complie(生产代码以及测试代码均可见)
    • test(只有测试代码可见)
    • provided(只在编译的生产代码的时候生效,在运行时无效)

完。

相关文章

网友评论

      本文标题:Java 包管理与 Maven

      本文链接:https://www.haomeiwen.com/subject/jfmftktx.html