Maven

1,Maven 简介

项目构件管理工具,提供了一种简洁的方式来定义项目结构、构建过程和依赖管理。

2,常用命令

1. install 安装 jar 包

mvn install:install-file -DgroupId=org.slf4j -DartifactId=slf4j-simple -Dversion=2.0.0 -Dpackaging=jar -Dfile=D:\gaox\software\slf4j-simple-2.0.0.jar

3,pom 文件

1,常用 pom 标签

1. packing

打包类型:pom,jar,war

  • pom:父类型
  • jar:内部调用或者作服务使用(默认)
  • war:打包用在服务器上部署项目

父项目必须是 pom

<packaging>pom</packaging>

2. scope

在dependency标签下有一个scope标签,该标签的作用是可以设置依赖在项目的使用阶段,通常来说,项目包含:编译、运行、测试、打包这些不同的阶段

  • compile:编译依赖范围,默认值,适用于所有阶段,编译、运行、测试、打包都会包含项目中,并且会传递依赖。

  • test:测试依赖范围,只在测试时使用,不会随项目发布,比如 junit,只有在测试代码中可以使用该依赖提供的资源。

将依赖 scope 改为 test

<!--market-common-->
<dependency>
    <groupId>org.example</groupId>
    <artifactId>market-common</artifactId>
    <scope>test</scope>
</dependency>

此时正常 src/main 下的无法找到依赖中的资源

测试可以通过

  • provided:已提供范围依赖,表示环境中(JDK 或者容器)会提供该支持,可以通过编译、测试阶段,打包均能通过,但是打包不会将该依赖打进 war 包,但是运行到该依赖的内容时,需要容器提供,否则会无法找到资源。例如servlet.jar,这个包在 tomcat 容器中 lib 目录已经提供了,因此打包时servlet.jar 无需包含在项目中,当然自己把 jar 包放进 tomcat 的 lib 目录中也是可以的(测试过)。以上针对 war 包,jar 包的时候不知道是不是将依赖打进了内置的容器,运行时依然会通过(测试过)。
<dependency>
    <groupId>org.example</groupId>
    <artifactId>myPackage</artifactId>
    <version>1.0-SNAPSHOT</version>
    <scope>provided</scope>
</dependency>

在 idea 中,由于 provided 会导致运行需要环境提供,所以可能导致 ClassNotFoundException,需要设置一下。

  • runtime:运行时范围依赖,在运行的时候才会用到该依赖,适用运行和测试阶段,编译无法通过。典型的例子时 JDBC 驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。既然运行时也要使用 scope 设为 runtime 的依赖,所以 scope 为 runtime 的依赖在项目打部署包的时候(即构建 artifact)会被一起打包,会放在 WEB-INF/lib 目录下。用的不多,不做深究。

  • system:类似 provided,需要显式提供包含依赖的 jar 的路径(使用 systemPath 标签),Maven 不会在仓库中查找它,而是根据 systemPath 提供的路径去寻找。

当 scope=system 时候依赖不会自动打包进去,需要添加参数:

这个 scope 不推荐使用,不做深究,使用的话可以参考打包方式 2.1 项目引入第三方 jar 包和本地 jar 包

  • import:这个跟上述几个不同,是和 一起用于导入 pom 配置。由于 maven 是单根继承机制,也就是只能有一个 parent 标签,而POM文件的parent标签一般都是继承spring-boot-starter-parent。当我们还想继承其他的父类或者让父类的依赖更加清晰和好管理时,可以通过 scope=import 来实现。scope=import 只能用在 dependencyManagement 里面,且仅用于 type=pom 的 dependency。它的作用就是相当于引入了某个 pom 文件,然后我们可以选择性的使用该 pom 文件下的哪个依赖

以 spring-cloud 依赖举例:

<dependencyManagement>
      <dependencies>
          <dependency>
              <groupId>org.springframework.cloud</groupId>
              <artifactId>spring-cloud-dependencies</artifactId>
              <version>Greenwich.RELEASE</version>
              <type>pom</type>
              <scope>import</scope>
          </dependency>
      </dependencies>
</dependencyManagement>

<!-- 这里引入上面 pom 文件中的某个依赖,可以不指定版本,因为在上面import的文件中已经定义了版本号 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

Scope 总结表格:

2,pom 文件示例

1) 父 pom

<!--
1,xml 版本
2,编码
-->
<?xml version="1.0" encoding="UTF-8"?>

<!-- project是pom文件的根元素  是标签:根标签,表示对当前工程进行配置、管理 -->
<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">
    
    <!-- 描述pom文件遵循从哪个版本的项目描述符  modelVersion 标签:从Maven 2 开始就固定为4.0.0 -->
    <modelVersion>4.0.0</modelVersion>
    
    <!--
      描述坐标信息
      groupId:项目组织唯一标识
      artifactId:项目唯一标识
      version:版本
    -->
    <groupId>org.example</groupId>
    <artifactId>market</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!--
     描述信息
     name:项目名称,仅是描述标识
     url:链接地址
     description: 描述信息
     -->
    <name>market</name>
    <url>http://www.baidu.com</url>
    <description>管理系统</description>
    
    <!-- 子模块信息 -->
    <modules>
        <module>market-gateway</module>
        <module>market-config</module>
    </modules>

    <!-- 打包类型 -->
    <packaging>pom</packaging>
  
    <!-- 一些自定义属性,一般用来定义依赖版本,使用 ${} 引用 -->
    <properties>
        <spring-cloud.version>Hoxton.SR9</spring-cloud.version>
        <servlet-version>3.1.0</servlet-version>
        <jackson-version>2.11.1</jackson-version>
        <webflux-version>2.3.2.RELEASE</webflux-version>
    </properties>
  
    <!-- 引入的依赖 -->
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit}</version>
        </dependency>

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>${hutool.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>${springboot.version}</version>
            
            <!--依赖作用范围-->
            <scope>test</scope>
            
            <!-- 引入时需要排除的依赖 -->
            <exclusions>
                <exclusion>
                    <artifactId>junit</artifactId>
                    <groupId>junit</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>junit-jupiter-api</artifactId>
                    <groupId>org.junit.jupiter</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>slf4j-api</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
   
    <!--声明依赖但不引入,一般在父 pom 中才有-->
    <dependencyManagement>
        <dependencies>

            <dependency>
                <groupId>org.example</groupId>
                <artifactId>market-common</artifactId>
                <version>${project.version}</version>
            </dependency>

            <!-- MySql -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>

        </dependencies>
    </dependencyManagement>
</project>

2)子 pom

<?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">

    <!-- 父 pom 依赖 -->
    <parent>
        <artifactId>market</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    
    <!--打包方式-->
    <packaging>war</packaging>
    <modelVersion>4.0.0</modelVersion>
    
    <!--定位信息默认继承父 pom-->
    <artifactId>market-gateway</artifactId>
    
    <properties>
        <failOnMissingWebXml>false</failOnMissingWebXml>
    </properties>

    <!-- 
      1,默认会继承父 pom 的 dependencies 标签的依赖包,当然也可以在这里覆盖掉
      2,如果引用父 pom 的 dependencyManager 声明的依赖,可以忽略版本,使用父 pom 声明的版本,这样就做到版本同一管理
      -->
    <dependencies>
        
        <!-- MySql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!-- redis -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <!-- servlet -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
        </dependency>

    </dependencies>
    
    <build>
        <!-- 打包插件 -->
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

4. 远程仓库配置

    <mirror>
        <id>nexus-aliyun</id>
        <mirrorOf>central</mirrorOf>
        <name>Nexus aliyun</name>
        <url> http://maven.aliyun.com/nexus/content/groups/public </url>
	</mirror>

	<mirror>  
		 <id>ibiblio</id>  
		 <mirrorOf>central</mirrorOf>  
		 <name>ibiblio Mirror of  [http://repo1.maven.org/maven2/](http://repo1.maven.org/maven2/) </name>  
		 <url> http://mirrors.ibiblio.org/pub/mirrors/maven2/ </url>  
	</mirror>  

	<mirror>  
		 <id>jboss-public-repository-group</id>  
		 <mirrorOf>central</mirrorOf>  
		 <name>JBoss Public Repository Group</name>  
		 <url> http://repository.jboss.org/nexus/content/groups/public </url>  
	</mirror>

	<mirror>
	  <id>repo2</id>
	  <mirrorOf>central</mirrorOf>
	  <name>Human Readable Name for this Mirror.</name>
	  <url> http://repo2.maven.org/maven2/ </url>
	</mirror>


	<mirror>
	  <id>ui</id>
	  <mirrorOf>central</mirrorOf>
	  <name>Human Readable Name for this Mirror.</name>
	 <url> http://uk.maven.org/maven2/</url>
	</mirror>
		

/conf/settings.xml 文件配置远程仓库,这里修改成阿里云的。

参考文件

Maven 和 Git 学习笔记
阿里云仓库:https://developer.aliyun.com/mvn/guide

posted @ 2024-08-07 17:29  primaryC  阅读(1)  评论(0编辑  收藏  举报