当前位置: 首页 > news >正文

Maven知识

文章目录

  • 一、概念
    • 1、官方文档
    • 2、什么是Maven?
  • 二、相关知识
    • 1、Maven生命周期
      • 1.1、clean
      • 1.2、default
      • 1.3、site
    • 2、Pom文件
    • 3、Pom常用元素
      • 3.1、项目基本元素
      • 3.2、<properties\></properties\>
      • 3.3、pom继承相关
      • 3.4、依赖管理相关
      • 3.5、构建管理相关
      • 3.6、<profiles\></profiles\>
  • 三、拓展
    • 1、Maven配置阿里云镜像加速

一、概念

1、官方文档

Maven官方文档

2、什么是Maven?

Maven, a Yiddish word meaning accumulator of knowledge, began as an attempt to simplify the build processes in the Jakarta Turbine project. There were several projects, each with their own Ant build files, that were all slightly different. JARs were checked into CVS. We wanted a standard way to build the projects, a clear definition of what the project consisted of, an easy way to publish project information, and a way to share JARs across several projects.
The result is a tool that can now be used for building and managing any Java-based project. We hope that we have created something that will make the day-to-day work of Java developers easier and generally help with the comprehension of any Java-based project.

大致可以理解为:构建和管理任何基于java的项目的工具

二、相关知识

1、Maven生命周期

Maven生命周期官方解释

Maven有三套生命周期,并且这三套生命周期之间是独立的,互不相关的。每个生命周期都有不同的阶段(Phases),这些不同的阶段之间是有序的,每个阶段必须在前面的阶段执行完后才可执行。
Maven的三套生命周期分别是:clean,default,site

1.1、clean

clean用于清理项目

PhaseDescription
pre-clean在实际的项目清理之前执行所需的过程
clean删除以前构建生成的所有文件
post-clean执行完成项目清理所需的流程

1.2、default

default是开发中经常用到的生命周期,项目的校验、编译、打包、部署等都在这里

PhaseDescription
validate验证项目是否正确,所有必要的信息是否可用
initialize初始化构建状态,例如设置属性或创建目录
generate-sources生成要包含在编译中的任何源代码
process-sources处理源代码,例如过滤任何值
generate-resources生成要包含在包中的资源
process-resources将资源复制并处理到目标目录中,准备打包
compile编译项目的源代码
process-classes对编译生成的文件进行后处理,例如对Java类进行字节码增强
generate-test-sources生成任何测试源代码以包含在编译中
process-test-sources处理测试源代码,例如过滤任何值
generate-test-resources为测试创建资源
process-test-resources将资源复制并处理到测试目标目录中
test-compile将测试源代码编译到测试目标目录中
process-test-classes对测试编译生成的文件进行后处理,例如对Java类进行字节码增强。
test使用合适的单元测试框架运行测试。这些测试不应该要求对代码进行打包或部署
prepare-package在实际包装前,完成包装前的准备工作。这通常会导致软件包的未打包、处理过的版本
package将编译后的代码打包成可分发的格式,比如JAR
pre-integration-test在执行集成测试之前执行所需的操作。这可能涉及诸如设置所需环境之类的事情
integration-test如有必要,将包处理并部署到可以运行集成测试的环境中
post-integration-test执行集成测试后所需的操作。这可能包括清理环境
verify运行任何检查来验证包是有效的并且符合质量标准
install将包安装到本地存储库中,以便在本地其他项目中作为依赖项使用
deploy在集成或发布环境中完成,将最终包复制到远程存储库,以便与其他开发人员和项目共享

1.3、site

site主要用于生成项目的站点

PhaseDescription
pre-site在实际的项目站点生成之前执行所需的过程
site生成项目的站点文档
post-site执行完成站点生成所需的流程,并为站点部署做准备
site-deploy将生成的站点文档部署到指定的web服务器

2、Pom文件

Pom文件官方解释
POM代表“项目对象模型”。它是Maven项目的XML表示形式,保存在名为pom.xml的文件中。pom.xml文件中可以定义项目所需的版本、依赖、插件、构建等等

pom.xml:

这是直接在POM的项目元素下的元素列表。注意,modelVersion包含4.0.0。这是目前唯一支持的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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><!-- The Basics --><groupId>...</groupId><artifactId>...</artifactId><version>...</version><packaging>...</packaging><dependencies>...</dependencies><parent>...</parent><dependencyManagement>...</dependencyManagement><modules>...</modules><properties>...</properties><!-- Build Settings --><build>...</build><reporting>...</reporting><!-- More Project Information --><name>...</name><description>...</description><url>...</url><inceptionYear>...</inceptionYear><licenses>...</licenses><organization>...</organization><developers>...</developers><contributors>...</contributors><!-- Environment Settings --><issueManagement>...</issueManagement><ciManagement>...</ciManagement><mailingLists>...</mailingLists><scm>...</scm><prerequisites>...</prerequisites><repositories>...</repositories><pluginRepositories>...</pluginRepositories><distributionManagement>...</distributionManagement><profiles>...</profiles>
</project>

3、Pom常用元素

3.1、项目基本元素

    <groupId>xxx</groupId><artifactId>xxx</artifactId><version>xxx</version><packaging>xxx</packaging><name>xxx</name><description>xxx</description>
  • <groupId>xxx</groupId>:通常使用完全限定的包名来将其与具有类似名称的其他项目区分开来(例如:org.springframework.boot)。
  • <artifactId>xxx</artifactId>:该工件的标识符,在由groupId给出的组中是唯一的。工件是由项目产生或使用的东西。(例如:spring-boot-starter-web)
  • <version>xxx</version>:这个项目产生的工件的当前版本。

一个gav(groupId,artifactId,version)可以标识唯一的包或插件
例:

        <groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2021.0.8</version>
  • <packaging></packaging>生成该项目的类型,有jar、war、ear、pom四种类型,默认为jar
  • <name>xxx</name>:项目名称
  • <description>xxx</description>:项目表述文本

3.2、<properties></properties>

可以自定义一些公共的值在这个标签下统一管理,引用方式${xxx}

	<properties><revision>1.0.0-SNAPSHOT</revision><!-- dependent version --><spring-boot.version>2.7.15</spring-boot.version><spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version><spring-cloud.version>2021.0.8</spring-cloud.version><lombok.version>1.18.30</lombok.version></properties><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version><optional>true</optional></dependency></dependencies>

3.3、pom继承相关

pom支持继承的方式复用父pom中的内容,以下是继承规则:

  • 子Pom继承父Pom的所有资源包括依赖、插件、构建方式
  • <dependencyManagement></dependencyManagement>或者<pluginManagement></pluginManagement>中的依赖(dependencies)或插件(plugins)不会被继承到子类,但是子类如果需要使用可以自己引入这里面的依赖(dependencies)或插件(plugins),并且不需要声明<version></version>(会自动继承父类的version)
  • 子pom和父pom声明同一个依赖(dependencies)或插件(plugins),如果子pom声明了<version></version>,子pom声明的version有限生效
    <parent><artifactId>xxx</artifactId><groupId>xxx</groupId><version>xxx</version><relativePath>../pom.xml</relativePath></parent><modules><module>xxx</module><module>xxx</module></modules>
  • <parent>…</parent>:子Pom中标识父Pom相关坐标
  • <relativePath>…/pom.xml</relativePath>:指定父Pom的相对路径,默认为…/pom.xml
  • <modules/module></modules/module>:子模块信息

3.4、依赖管理相关

   <dependencies><dependency><groupId></groupId><artifactId></artifactId><version></version/><type></type><classifier></classifier><scope></scope><systemPath></systemPath><exclusions><exclusion><groupId/></groupId><artifactId></artifactId></exclusion></exclusions><optional/></dependency></dependencies>
  • <dependencies/dependency>…</dependencies/dependency>:依赖信息
  • <type>xxx</type>:依赖类型包括jar、war、pom等等,默认是jar。
  • <classifier>xxx</classifier>:引用附加的工件或区分属于同一POM但构建方式不同的两个工件

例子:
a、引用附加的工件

	  <dependency><groupId>com.test</groupId><artifactId>mytest</artifactId><version>1.0</version/><classifier>javadoc</classifier></dependency>

这样就会引入两个依赖mytest-1.0.jar和mytest-1.0-javadoc.jar

b、区分属于同一POM但构建方式不同的两个工件

	  <dependency><groupId>com.test</groupId><artifactId>mytest</artifactId><version>1.0</version/><classifier>jdk15</classifier></dependency>

我假设现在项目是jdk8,在mytest包中用的jdk15就可以这样声明

  • <systemPath>xxx</systemPath>:指定引用jar包的路径,例如:D:\a\b
  • <scope>xxx</scope>:指定依赖的作用域,包括compile、runtime、test、system、provided、import,默认是compile
  • compile:这是默认作用域。全程参与当前项目的编译、测试、运行时、打包。这个作用域是可传递的
  • runtime:该依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。
  • test:仅在测试编译和执行阶段可用。这个作用域不是可传递的
  • system:不会从maven库中取依赖,而是从本地文件拿。一般要搭配<systemPath></systemPath>使用
  • provided: 参与编译,测试,运行等周期但不参与打包,希望该依赖是容器或者jdk等提供。这个作用域不是可传递的
  • import:一般只用于<dependencyManagement></dependencyManagement>依赖管理中,把当前依赖下的所有依赖都引入进来。
  • <exclusions/exclusion>…</exclusions/exclusion>:排除相关依赖
  • <optional>xxx</optional>:表示该依赖是否是可选的。值只有true或者false,默认为false。true就是可选的,不会参与传递。
    例如:父pom的某个依赖包dependencyA内部引入了dependencyB,但是dependencyB使用了<optional>true</optional>,那么子pom里引入该依赖包dependencyA时不会一起引入dependencyB

3.5、构建管理相关

包括资源的加载、插件的管理等

    <build><finalName>xxx</finalName><resources><resource><directory>xxx</directory><filtering>false</filtering><includes><include>**/*</include></includes></resource></resources><plugins><plugin><groupId>xxx</groupId><artifactId>xxx</artifactId><version>1.0</version><executions><execution><id>xxx</id><phase>verify</phase><goals><goal>check</goal></goals></execution></executions></plugin></plugins></build>
  • <build>…</build>:包含构建项目所需的信息
  • <finalName>xxx</finalName>:构建项目生成的文件名
  • <resources/resource>…</resources/resource>:类路径资源配置
  • <directory>xxx</directory>:描述资源存储的目录。路径是相对于POM的。
  • <filtering>xxx</filtering>:是否过滤资源以用参数化值替换。值为true或者false,默认为false
  • <includes/include>xxx</includes/include>:要包含的文件路径
  • <excludes/exclude>xxx</excludes/exclude>:要排除的文件路径
  • <plugins/plugin>xxx</plugins/plugin>:插件信息
  • <pluginManagement></pluginManagement>:插件管理,一般用于pom继承时插件的管理,类似<dependencyManagement>
  • <executions/execution>xxx</executions/execution>:在构建生命周期中执行的一组目标的一个或多个规范,每个规范(可能)都有不同的配置。
  • <inherited>xxx</inherited>:插件是否可传递(继承到子类)
  • <id>xxx</id>:用于在构建期间标记目标,默认值:default
  • <phase>xxx</phase>:将此执行中的目标绑定到Maven的default生命周期中的阶段(参见Maven生命周期default)
  • <goals/goal>xxx</goals/goal>:绑定插件的声明周期中的阶段
  • <configuration>xxx</configuration>:可用于配置插件内部所需的配置信息

3.6、<profiles></profiles>

可用于动态环境激活项目

spring:profiles:active: @spring.profiles.active@
    <profiles><profile><id>dev</id><properties><spring.profiles.active>dev</spring.profiles.active></properties><!-- 默认环境 --><activation><activeByDefault>true</activeByDefault></activation></profile><profile><id>test</id><properties><spring.profiles.active>test</spring.profiles.active></properties></profile></profiles>

可在开发(dev)、测试(test)、生产(prod)环境等切换相应配置

三、拓展

1、Maven配置阿里云镜像加速

1、找到maven的setting.xml配置,一般在C:\Users\xxx.m2下
2、找到标签添加以下代码

<mirrors><mirror><id>aliyun</id><mirrorOf>*</mirrorOf><name>aliyun maven</name><url>https://maven.aliyun.com/repository/public</url></mirror><mirror><id>aliyun-nexus</id><mirrorOf>*</mirrorOf><name>aliyun nexus</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url></mirror>
</mirrors>

相关文章:

Maven知识

文章目录 一、概念1、官方文档2、什么是Maven&#xff1f; 二、相关知识1、Maven生命周期1.1、clean1.2、default1.3、site 2、Pom文件3、Pom常用元素3.1、项目基本元素3.2、<properties\></properties\>3.3、pom继承相关3.4、依赖管理相关3.5、构建管理相关3.6、&…...

美颜SDK是什么?视频美颜SDK在直播平台中的集成与接入教程详解

当下&#xff0c;主播们追求更加自然、精致的外观&#xff0c;而观众也期待在屏幕前欣赏到更为清晰、美丽的画面。为了满足这一需求&#xff0c;美颜SDK应运而生&#xff0c;成为直播平台的重要利器之一。 一、什么是美颜SDK&#xff1f; 通过美颜SDK&#xff0c;开发者可以…...

CSS基础面试题

介绍一下标准css盒子模型与低版本IE的盒子模型&#xff1f; 标准盒子模型&#xff1a;宽度内容的宽度&#xff08;content&#xff09; border padding margin 低版本IE盒子模型&#xff1a;宽度内容宽度&#xff08;contentborderpadding&#xff09; margin box-sizing 属性…...

L1-028 判断素数

本题的目标很简单&#xff0c;就是判断一个给定的正整数是否素数。 输入格式&#xff1a; 输入在第一行给出一个正整数N&#xff08;≤ 10&#xff09;&#xff0c;随后N行&#xff0c;每行给出一个小于231的需要判断的正整数。 输出格式&#xff1a; 对每个需要判断的正整数&a…...

Scala多线程爬虫程序的数据可视化与分析实践

一、Scala简介 Scala是一种多种类型的编程语言&#xff0c;结合了针对对象编程和函数式编程的功能。它运行在Java虚拟机上&#xff0c;具有强大的运算能力和丰富的库支持。Scala常用于大数据处理、并发编程和Web应用程序开发。其灵活性和高效性编程成为编写多线程爬虫程序的理…...

YOLOv8加入顶会ICLR2022MobileViT模块

一、原文引入介绍 MOBILEVIT:轻量级、通用型且移动友好的视觉Transformer 论文地址:https://arxiv.org/pdf/2110.02178.pdf MOBILEVIT: LIGHT-WEIGHT, GENERAL-PURPOSE,AND MOBILE-FRIENDLY VISION TRANSFORMER MobileViT是由苹果公司发表在ICLR2022顶会上的一篇文章,这篇文…...

「数据结构」二叉树1

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;C启航 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 文章目录 &#x1f349;树&#x1f349;二叉树&#x1f34c;特殊二叉树&#x1f34c;二叉树的性质&#x1f34c;存储结构 &#x1f349;…...

栈(C语言版)

一.栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。 栈中的数据元素遵守 后进先出 LIFO &#xff08; Last In First Out &#xff09;的原则。…...

聊聊reactor-logback的AsyncAppender

序 本文主要研究一下reactor-logback的AsyncAppender AsyncAppender reactor-logback/src/main/java/reactor/logback/AsyncAppender.java public class AsyncAppender extends ContextAwareBaseimplements Appender<ILoggingEvent>, AppenderAttachable<ILogging…...

Apache SeaTunne简介

Apache SeaTunne简介 文章目录 1.Apache SeaTunne是什么&#xff1f;1.1[官网](https://seatunnel.apache.org/)1.2 项目地址 2.架构3.特性3.1 丰富且可扩展的连接器和插件机制3.2 支持分布式快照算法以确保数据一致性3.3 支持流、批数据处理&#xff0c;支持全量、增量和实时数…...

【开题报告】基于uniapp的IT资讯阅读小程序的设计与实现

1.研究背景 随着信息技术的飞速发展和互联网的普及&#xff0c;IT&#xff08;Information Technology&#xff09;行业成为了当今社会中最活跃和最具前景的领域之一。人们对于IT领域的资讯需求越来越高&#xff0c;希望能够第一时间获取到全面、准确、及时的IT资讯。 传统的…...

Java小案例-SpringBoot火车票订票购票票务系统

目录 前言 详细资料 源码获取 前言 SpringBoot火车票订票购票票务系统 前端使用技术&#xff1a;HTML5,CSS3、JavaScript、VUE等 后端使用技术&#xff1a;Spring boot&#xff08;SSM&#xff09;等 数据库&#xff1a;Mysql数据库 数据库管理工具&#xff1a;phpstud…...

关于获取高级电工职业技能等级证书一些避坑经历

有幸在今年9月份成功通过高级电工职业技能等级认证,以下是我遇到的一些常见问题,以及一些考点内容以及总结 什么是高级电工职业技能等级证书 电工职业技能等级证书是证明持证人电工知识和技能水平高低的&#xff0c;是持证人应聘、求职、任职、开业的资格凭证&#xff0c;是用…...

springboot(ssm在线课程管理系统 网课管理系统Java系统

springboot(ssm在线课程管理系统 网课管理系统Java系统 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#xff09; 数…...

4.1 媒资管理模块 - Nacos与Gateway搭建

文章目录 媒资管理模块 - 媒资项目搭建一、需求分析1.1 介绍1.2 数据模型1.3 分析网关 二、 搭建Nacos2.1 服务发现中心2.2.1 Maven2.2.2 配置Nacos 2.2 配置中心2.2.1 介绍2.2.2 Maven 坐标2.2.3 配置 content-api 工程2.2.4 配置 content-service 工程2.2.5 配置 system-api …...

1641:【例 1】矩阵 A×B

【题目描述】 矩阵 A 规模为 nm &#xff0c;矩阵 B 规模为 mp &#xff0c;现需要你求 AB 。 矩阵相乘的定义&#xff1a;nm 的矩阵与 mp 的矩阵相乘变成 np 的矩阵&#xff0c;令 aik 为矩阵 A 中的元素&#xff0c;bkj 为矩阵 B 中的元素&#xff0c;则相乘所得矩阵 C 中的…...

iOS问题记录 - iOS 17通过NSUserDefaults设置UserAgent无效

文章目录 前言开发环境问题描述问题分析解决方案最后 前言 最近维护一个老项目时遇到的问题。说起这老项目我就有点头疼&#xff0c;一个快十年前的项目&#xff0c;这么说你可能不觉得有什么&#xff0c;但是你想想Swift也才发布不到十年&#xff08;2014年6月发布&#xff0…...

linux的一些典型面试题解读

目录 前言1 Linux 文件系统2 Shell 编程3 进程管理4 用户和权限管理5 软件包管理6 网络配置7 系统监控和日志8 存储管理9 安全性10 常见命令11 系统启动流程12 Linux 进程间通信方式13 Linux 中的 I/O 多路复用14 Shell 脚本优化与调试15 Linux 文件权限与 ACL16 Linux 中的环境…...

tortoisesvn各版本下载链接

https://tortoisesvn.net 无法访问最新版本下载 TortoiseSVN download | SourceForge.net 所有版本下载 TortoiseSVN - Browse Files at SourceForge.net...

[自动化运维工具]ansible简单介绍和常用模块

ansible 源操作主机功能 自动化运维&#xff08;playbook剧本yaml&#xff09; 是基于python开发的一个配置管理和应用部署工具&#xff0c;在自动化运维中&#xff0c;现在还是异军突起 ansible能批量配置&#xff0c;部署&#xff0c;管理上千台主机&#xff0c;类似于xshell…...

记一次渗透测试信息收集-越权

目录 一、信息收集 子域名收集 存活探测 二、越权 越权一 越权二 一、信息收集 子域名收集 使用subfinder进行子域名收集 语法&#xff1a;subfinder.exe -d xx.com -all -o qq1.txt -v //结合自己渗透经验&#xff0c;多渠道收集子域名&#xff0c;汇总去重。 …...

Flink系列之:Table API Connectors之JSON Format

Flink系列之&#xff1a;Table API Connectors之JSON Format 一、JSON Format二、依赖三、创建一张基于 JSON Format 的表四、Format 参数五、数据类型映射关系 一、JSON Format JSON Format 能读写 JSON 格式的数据。当前&#xff0c;JSON schema 是从 table schema 中自动推…...

2018年第七届数学建模国际赛小美赛B题世界杯足球赛的赛制安排解题全过程文档及程序

2018年第七届数学建模国际赛小美赛 B题 世界杯足球赛的赛制安排 原题再现&#xff1a; 有32支球队参加国际足联世界杯决赛阶段的比赛。但从2026年开始&#xff0c;球队的数量将增加到48支。由于时间有限&#xff0c;一支球队不能打太多比赛。因此&#xff0c;国际足联提议改变…...

【为数据之道学习笔记】5-7五类数据主题联接的应用场景

在数字化转型的背景下&#xff0c;华为的数据消费已经不再局限于传统的报表分析&#xff0c;还要支持用户的自助分析、实时分析&#xff0c;通过数据的关联&#xff0c;支持业务的关联影响分析以及对目标对象做特征识别&#xff0c;进行特定业务范围圈定、差异化管理与决策等。…...

得帆信息创始人-张桐,受邀出席 BV百度风投AIGC主题论坛

近日&#xff0c;得帆信息创始人兼CEO张桐&#xff0c;作为百度风投被投代表企业创始人受邀出席“向未来&#xff0c;共成长” BV百度风投AIGC主题论坛。 与包括上海市徐汇区相关部门领导、百度集团相关事业部负责人及代表&#xff0c;以及来自国寿资本、中网投、麦顿投资的投资…...

云原生之深入解析减少Docker镜像大小的优化技巧

一、什么是 Docker&#xff1f; Docker 是一种容器引擎&#xff0c;可以在容器内运行一段代码&#xff0c;Docker 镜像是在任何地方运行应用程序而无需担心应用程序依赖性的方式。要构建镜像&#xff0c;docker 使用一个名为 Dockerfile 的文件&#xff0c;Dockerfile 是一个包…...

记一次java for循环改造多线程的操作

背景 今天在开发质量平台时需要获取某些数据&#xff0c;要请求公司某个工程的OpenAPI接口A。此接口为返回通用数据的接口&#xff0c;且接口本身的RT都在2&#xff5e;3秒之间。使用该接口&#xff0c;需要进行两次循环获取&#xff0c;然后对返回数据进行处理组装&#xff0…...

Java面试整理-Java复制

Java复制 在Java中,复制对象或数据通常涉及不同的场景和方法。以下是几种常见的复制情况及其相关方法: 基本数据类型的复制:基本数据类型(如int, double, char等)在Java中是通过值传递的。当你将一个基本数据类型的值赋给另一个变量时,实际上是创建了一个新的值。 int a …...

wsl kafka的简单应用

安装并配置单机版kafka所需环境 wsl2 环境可用性较高&#xff0c;如下介绍在该环境中安装单机版本kafka的详细过程。 启动命令行工具启动wsl&#xff1a;wsl --user root --cd ~&#xff0c;&#xff08;以root用户启动&#xff0c;进入wsl后当前路径为~“用户主目录”&#…...

2023年国赛高教杯数学建模D题圈养湖羊的空间利用率解题全过程文档及程序

2023年国赛高教杯数学建模 D题 圈养湖羊的空间利用率 原题再现 规模化的圈养养殖场通常根据牲畜的性别和生长阶段分群饲养&#xff0c;适应不同种类、不同阶段的牲畜对空间的不同要求&#xff0c;以保障牲畜安全和健康&#xff1b;与此同时&#xff0c;也要尽量减少空间闲置所…...