Skip to content

依赖仓库

为方便依赖包的发布,需要维护一个私有仓库。

Nexus

选型

  • Nexus
    • 可使用 Nexus 搭建私有仓库
    • 资金成本相对较大: 消耗一定的服务器资源
    • 维护成本相对较大: 需要较多时间管理
    • 管理灵活: 可灵活划分仓库,可管理权限
    • 速度: 若在局域网内搭建,访问速度非常快
  • 阿里云 maven 仓库
    • 免维护: 只管使用,无需管搭建过程
    • 资源丰富: 无需配置,自动继承了公网各大maven仓库
    • 不灵活: 权限不方便更细致的划分,无法做细节上的配置
    • 速度: 访问速度相对于本地搭建的 Nexus 仓库要慢
  • 建议
    • aliyun: 个人开发者, 或游击小团队
    • Nexus: 有架构师的团队,有局域网服务器的团队/创业

使用

Maven

Maven项目对象模型(Project Object Model, POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。

安装

Idea 插件

  • 在 Idea 中,maven 插件是自带的,无需安装

独立安装

场景:打包环境,需要独立安装

  • 官网:https://maven.apache.org/, 下载最新版本二进制包,并解压到规划的目录下
  • 设置环境变量,MAVEN_HOME,和 PATH, 使得在命令行中能识别 mvn 命令
  • 验证:mvn -v

配置

  • 默认配置路径: ${user.home}/.m2/settings.xml
  • 配置项:后续补充

pom.xml

基本结构示例

xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                             http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <!-- 用于继承一个父项目,实现配置复用(常用于多模块项目) -->
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.5.4</version>
  </parent>

  <!-- 项目基本信息 -->
  <groupId>com.example</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0.0</version>

  <packaging>jar</packaging>
  <name>My Application</name>
  <description>A sample Maven project</description>

  <!-- 定义可重用的变量,便于统一管理版本或配置 -->
  <properties>
    <java.version>21</java.version>
    <maven.compiler.source>21</maven.compiler.source>
    <maven.compiler.target>21</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <!-- 用于聚合多个子模块。 -->
  <modules>
    <module>module-common</module>
    <module>module-web</module>
  </modules>

  <!-- 定义项目所依赖的外部库 -->
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13.2</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <!-- 依赖管理:集中管理依赖版本,不引入实际依赖,子模块可继承版本号而无需指定 version -->
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>5.3.21</version>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <!-- 定义 Maven 下载依赖和插件的远程仓库 -->
  <repositories>
    <repository>
      <id>aliyun-maven</id>
      <url>https://maven.aliyun.com/repository/public</url>
    </repository>
  </repositories>

  <!-- 构建配置 -->
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>21</source>
          <target>21</target>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>

packing

  • 以下列举了常见的 packing 类型
Packaging 类型说明典型使用场景
jarJava Archive,标准的 Java 库打包格式,包含编译后的 class 文件和资源。普通 Java 项目、工具类库、Spring Boot 应用等。
pom不包含实际代码,仅用于项目聚合或作为父 POM 管理依赖和插件。多模块项目的父工程、依赖管理(BOM)项目。
maven-plugin用于打包自定义的 Maven 插件。开发 Maven 插件项目。

scope

  • 以下列举了常见的 scope 类型
Scope 值说明编译时可见测试时可见运行时可见是否参与传递典型使用场景
compile默认范围,依赖在所有阶段都可用。核心业务代码依赖,如 Spring、Guava 等。
provided编译和测试需要,但运行时由 JDK 或容器(如 Tomcat)提供,不打包进最终产物。Servlet API、JSP API 等容器提供的库。
runtime编译不需要,但测试和运行时需要。JDBC 驱动、实现接口的库(如 logback-classic)。
test仅用于测试编译和执行,不打包也不在主代码中使用。JUnit、Mockito、TestNG 等测试框架。
system类似 provided,但依赖不在 Maven 仓库中,需手动指定本地路径(不推荐使用)。使用私有 JAR 包(如某些厂商 SDK),需谨慎管理。
import仅用于 <dependencyManagement> 中,导入其他 POM 的依赖管理配置。统一管理依赖版本(常用于 Spring Boot、BOM 文件)。

optional

  • optional 属性用于控制依赖是否被传递。
属性值描述
true表示依赖不会传递给依赖它的项目。
false默认值,表示依赖会传递给依赖它的项目。

java 版本

为指定 java 的版本,可在 pom 中的多个地方,多个位置指定. 购买以下清单

位置配置内容含义备注
<properties\>java.version自行指定的变量若不被引用,将不产生作用
<properties\>maven.compiler.source指定 java 的源代码版本可被 maven-compiler-plugin 自动识别
<properties\>maven.compiler.target确定 java 的目标版本可被 maven-compiler-plugin 自动识别
<properties\>maven.compiler.release确定 java 的版本Java 9 开始,推荐使用 <release> 参数代替 source 和 target
maven-compiler-pluginconfiguration\>source/target同 properties 中的 source/target优先级高于 properties 中的 source/target
maven-compiler-pluginconfiguration\>release同 properties 中的 release优先级高于 properties 中的 release

Released under the MIT License.