Maven
1、基础
-
maven是一个优秀的项目管理工具。具有依赖管理和一键构建的功能。
-
优点和缺点
优点:简单,上手快;依赖管理优秀,依赖jar,版本升级,冲突管理等;一件构建;适合团队等等。 缺点,慢,网络原因等访问不到。maven采用约定优于配置的策略,一旦出了问题,难于调试。idea经常红线。
-
命令
1. clean清除,将原有的target目录删除。 2. compile编译,生成target目录,里面是字节码文件。 3. test测试,将测试代码也执行了,并生成了字节码文件。 4. package打包,war,jar。 5. install安装,放入本地仓库 6. deploy部署,放入远程仓库
.jar
是可执行jar包,包含了pom中的所有依赖,可以直接用java -jar
命令执行
如果是部署,就用.jar
.jar.original
是普通jar包,不包含依赖如果是给别的项目用,就要给
.jar.original
这个包 -
三种仓库
-
生命周期
clean:在项目构建前,先进行一些清理工作。上面第一个 default:构建的核心部分,编译,测试,打包,部署。其他5个。 site:生成项目报告,站点,发布报告。
-
概念模型图
依赖管理和一键构建
原来的项目需要自己引入各种jar包。项目内存很大。而maven项目是把所有的jar放在本地仓库,项目使用pom文件的jar的坐标信息去获取就可以了,项目本身没有把这些jar复制一份放在自己的项目目录中。
-
scope
项目阶段包括: 编译,测试,运行(打包) compile:默认,全过程都参与 provided:编译和测试,不参与运行,因为打包的时候会把该jar排除exclude。 test:测试过程。 runtime:测试和运行阶段 system:跟系统有关,不常用
scope 编译 测试 运行 传递给子项目 compile Y Y Y Y provided Y Y test Y runtime Y Y optional 假如你的Project A的某个依赖D添加了<optional>true</optional>,当别人通过pom依赖Project A的时候,D不会被传递依赖进来。
-
jar的依赖原则
- 最短路径优先
- 最先声明优先
冲突情况: B->A(1.0版本),而D->C->A(2.0版本)。按照最短路径原则,会引入A的1.0版本,但是项目C使用了A的2.0的新方法或者类,就会报错。 解决冲突: 1.exclusion排除 2.统一版本控制<dependencyManagement>
-
继承和聚合
<parent> <groupId>com.dmsdbj.cloud</groupId> <artifactId>cloud-integral-parent</artifactId> <version>0.0.2-SNAPSHOT</version> </parent>
<modules> <module>e3-manager-pojo</module> <module>e3-manager-dao</module> <module>e3-manager-interface</module> <module>e3-manager-service</module> <module>e3-manager-web</module> </modules>
2、配置
-
安装。安装教程
MAVEN_HOME写maven的安装目录 PATH添加maven安装目录里面的bin目录
-
<?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <!--localRepository 表示本地库的保存位置,也就是maven2主要的jar保存位置,默认在${user.dir}/.m2/repository,如果需要另外设置,就换成其他的路径。 --> <!-- <localRepository>D:\software\apache-maven-3.6.0-bin\localRepository</localRepository> --> <localRepository>D:\software\maven\repository</localRepository> <!-- offline: 如果不想每次编译,都去查找远程中心库,那就设置为true。当然前提是你已经下载了必须的依赖包。 默认false。--> <offline>false</offline> <!--Servers :在POM中的 distributionManagement元素定义了开发库。然而,特定的username和pwd不能使用于pom.xml,所以通过此配置来保存server信息。 id:server 的id,用于匹配distributionManagement库id,比较重要。 username, password:用于登陆此服务器的用户名和密码,前三者即可 privateKey, passphrase:设置private key,以及passphrase filePermissions, directoryPermissions:当库文件或者目录创建后,需要使用权限进行访问。 <servers> <server> <id>server001</id> <username>my_login</username> <password>my_password</password> <privateKey>${usr.home}/.ssh/id_dsa</privateKey> <passphrase>some_passphrase</passphrase> <filePermissions>664</filePermissions> <directoryPermissions>775</directoryPermissions> <configuration></configuration> </server> </servers> --> <!-- Mirrors 表示镜像库,指定库的镜像,用于增加其他库 id,name:唯一的标志,用于区别镜像 url:镜像的url mirrorOf:此镜像指向的服务id --> <!--<mirrorOf> 表示只为central仓库做镜像,如果想为所有的仓库做镜像那么可以改为:<mirrorOf>*</mirrorOf>--> <mirrors> <mirror> <id>alimaven</id> <mirrorOf>central</mirrorOf> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/repositories/central/</url> </mirror> <mirror> <id>central</id> <name>Maven Repository Switchboard</name> <url>http://repo1.maven.org/maven2/</url> <mirrorOf>central</mirrorOf> </mirror> <mirror> <id>repo2</id> <mirrorOf>central</mirrorOf> <name>Human Readable Name for this Mirror.</name> <url>http://repo2.maven.org/maven2/</url> </mirror> </mirrors> <!-- Proxies 此代理设置,主要用于无法直接访问中心的库用户配置。 id:代理的标志 active:是否激活代理 protocol, host, port:protocol://host:port 代理 username, password:用户名和密码 nonProxyHosts: 不需要代理的host <proxies> <proxy> <id>myproxy</id> <active>false</active> <protocol>http</protocol> <host>proxy.somewhere.com</host> <port>8080</port> <username>proxyuser</username> <password>somepassword</password> <nonProxyHosts>*.google.com|ibiblio.org</nonProxyHosts> </proxy> </proxies> --> <proxies /> <!-- Profiles 类似于pom.xml中的profile元素 主要包括activation,repositories,pluginRepositories 和properties元素 刚开始接触的时候,会比较迷惑,这是maven2中比较强大的功能——个性配置。 单独定义profile后,并不会生效,需要通过满足条件来激活。 --> <!-- repositories 和pluginRepositories 依照如下的配置,定义了本地开发库,用于release 发布。 releases, snapshots:每个产品的版本的Release或者snapshot (注:release和snapshot的区别,release一般是比较稳定的版本,而snapshot基本上不稳定,只是作为快照) --> <Profiles> <profile> <id>spring</id> <!--Activation 用于激活此profile jdk:如果匹配指定的jdk版本,将会激活 os:操作系统 property:如果maven能检测到相应的属性 file: 用于判断文件是否存在或者不存在 <activation> <activeByDefault>false</activeByDefault> <jdk>1.5</jdk> <os> <name>Windows XP</name> <family>Windows</family> <arch>x86</arch> <version>5.1.2600</version> </os> <property> <name>mavenVersion</name> <value>2.0.3</value> </property> <file> <exists>${basedir}/file2.properties</exists> <missing>${basedir}/file1.properties</missing> </file> </activation> --> <repositories> <repository> <id>spring</id> <name>release/</name> <url>https://maven.springframework.org/release/</url> <releases> <enabled>true</enabled> <updatePolicy>never</updatePolicy> <checksumPolicy>warn</checksumPolicy> </releases> <snapshots> <enabled>false</enabled> </snapshots> <layout>default</layout> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>repo-local</id> <name>Internal 开发库</name> <url>http://192.168.0.2:8082/repo-local</url> <releases> <enabled>true</enabled> <updatePolicy>never</updatePolicy> <checksumPolicy>warn</checksumPolicy> </releases> <snapshots> <enabled>false</enabled> </snapshots> <layout>default</layout> </pluginRepository> </pluginRepositories> </profile> </Profiles> <!-- 除了使用activation来激活profile,同样可以通过activeProfiles来激活 env-test 表示指定的profile id --> <activeProfiles> <activeProfile>spring</activeProfile> </activeProfiles> <!--interactiveMode:表示是否使用交互模式,默认是true;如果设为false,那么当Maven需要用户进行输入的时候,它会使用一个默认值。--> <interactiveMode>true</interactiveMode> <!--pluginGroups:在pluginGroups元素下面可以定义一系列的pluginGroup元素。表示当通过plugin的前缀来解析plugin的时候到哪里寻找。 pluginGroup元素指定的是plugin的groupId。默认情况下,Maven会自动把org.apache.maven.plugins和org.codehaus.mojo添加到pluginGroups下。 <pluginGroups> <pluginGroup>com.your.plugins</pluginGroup> </pluginGroups>--> </settings>
-
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版本,4.0.0是唯一支持MAVEN 2和3的POM版本 --> <modelVersion>4.0.0</modelVersion> <!-- 组织id,唯一的 --> <groupId>com.wang.pom</groupId> <!-- 项目id --> <artifactId>my-project</artifactId> <!-- 项目版本 --> <version>1.0.0</version> <!-- 项目打包类型 --> <packaging>jar</packaging> <!-- 项目别称,非必须 --> <name>my-project</name> <!-- 项目描述,非必须 --> <description>这个是项目的描述!</description> <!-- 项目url,非必须 --> <url>http://pom.wang.com</url> <!-- MAVEN属性是值占位符,可以使用符号${X}(其中X是属性)在POM中的任何位置访问它们的值。或者它们可以用作插件的默认值。 --> <properties> <maven.compiler.source>1.8</maven.compiler.source> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <!-- 依赖列表 --> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.0</version> <!-- 作用范围:有编译、运行、测试编译、测试运行、打包阶段。 --> <!-- scope的值有:compile、provided、runtime、test、system --> <!-- compile:scope默认值。参与到编译、运行、测试编译、测试运行阶段,会被打包,该依赖关系会传播到依赖项目。 --> <!-- provided:参与到编译、测试编译阶段,不会被打包。该依赖关系不具有传递性。 --> <!-- runtime:参与到运行、测试运行阶段,会被打包。 --> <!-- test:参与到测试编译、测试运行阶段。不会被打包,它不具有传递性。 --> <!-- system: 类似provided,不过依赖不会从maven远程中央仓库下载,而是从本地maven仓库中获取。--> <scope>test</scope> <!-- systemPath 仅仅当依赖范围是 system 时使用 --> <!-- <systemPath>绝对路径</systemPath> --> <!-- optional 默认为 false。true表示当其他项目依赖此项目时不会引入该依赖。--> <optional>true</optional> <!-- 显示排除依赖项 --> <!-- <exclusions> <exclusion> <groupId></groupId> <artifactId></artifactId> </exclusion> </exclusions> --> </dependency> <!-- <dependency>...</dependency> --> </dependencies> <!-- 使用方法参考 https://www.jianshu.com/p/e867ac845e11 --> <dependencyManagement> <dependencies>...</dependencies> </dependencyManagement> <!-- 使用方法参考 定义仓库位置--> <repositories> <repository> <id>xx</id> <name>xxx</name> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> <url>http://xxx.com/repository/fchx-group/</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>xxx</id> <name>xxx</name> <url>http://xxx.com/repository/fchx-group/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> </pluginRepositories> <!-- "Project Build" --> <build> <!-- 项目构建时的名称 --> <finalName>Build Name</finalName> <!-- 资源元素列表 --> <resources> <resource> <!-- 定义资源的位置。默认目录是${basedir}/src/main/resources。 --> <directory>${basedir}/src/main/resources</directory> <!-- 指定包含的资源文件,用 * 号做通配符。 --> <includes> <include>configuration.xml</include> <!-- <include>...</include> --> </includes> <!-- 要排除哪些文件。在包含和排除之间冲突时,排除胜利。 --> <excludes> <exclude>**/*.properties</exclude> <!-- <exclude>...</exclude> --> </excludes> </resource> <!-- <resource>...</resource> --> </resources> <!-- 测试资源元素列表 --> <testResources> <testResource> <!-- 配置与资源元素类似,在测试阶段使用。测试资源默认目录是${basedir}/src/test/resources。测试资源不会被部署。 --> </testResource> <!-- <testResource>...</testResource> --> </testResources> <!-- 插件 --> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.0.2</version> <!-- true或者false,默认是false。是否加载此插件的扩展。--> <extensions>false</extensions> <!-- true或false,默认值为true。这个plugin的配置是否应该应用于从此plugin继承的POM。 --> <inherited>true</inherited> <!-- 配置插件参数 --> <configuration></configuration> <!-- 改变插件的依赖 --> <dependencies></dependencies> </plugin> <!-- <plugin>...</plugin> --> </plugins> </build> <!-- END "Project Build" --> <!--项目分发信息,在执行mvn deploy后表示要发布的位置。 --> <!--有了这些信息就可以把网站部署到远程服务器或者把构件部署到远程仓库。 --> <distributionManagement> <!--部署项目产生的构件到远程仓库需要的信息 --> <repository> <!--是分配给快照一个唯一的版本号(由时间戳和构建流水号),还是每次都使用相同的版本号 --> <!--参见repositories/repository元素 --> <uniqueVersion>true</uniqueVersion> <id> repo-id </id> <name> repo-name</name> <url> </url> <layout /> </repository> <!--构件的快照部署到哪里,如果没有配置该元素,默认部署到repository元素配置的仓库 --> <snapshotRepository> <uniqueVersion /> <id /> <name /> <url /> <layout /> </snapshotRepository> <!--部署项目的网站需要的信息 --> <site> <!--部署位置的唯一标识符,用来匹配站点和settings.xml文件里的配置 --> <id> site-id </id> <!--部署位置的名称 --> <name> site-name</name> <!--部署位置的URL,按protocol://hostname/path形式 --> <url>scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web </url> </site> <!--项目下载页面的URL。如果没有该元素,用户应该参考主页。 --> <!--使用该元素的原因是:帮助定位那些不在仓库里的构件(由于license限制)。 --> <downloadUrl /> <!--如果构件有了新的groupID和artifact ID(构件移到了新的位置),这里列出构件的重定位信息。 --> <relocation> <!--构件新的group ID --> <groupId /> <!--构件新的artifact ID --> <artifactId /> <!--构件新的版本号 --> <version /> <!--显示给用户的,关于移动的额外信息,例如原因。 --> <message /> </relocation> <!--给出该构件在远程仓库的状态。不得在本地项目中设置该元素,因为这是工具自动更新的。 --> <!--有效的值有:none(默认),converted(仓库管理员从Maven 1 POM转换过来), --> <!--partner(直接从伙伴Maven 2仓库同步过来),deployed(从Maven 2实例部署),verified(被核实时正确的和最终的)。 --> <status /> </distributionManagement> </project>
【参考】
- .jar.original的区别:https://blog.csdn.net/u010954818/article/details/105795405
- 安装教程:https://www.runoob.com/maven/maven-setup.html
- settings:https://www.cnblogs.com/zmsn/p/12091586.html
- settings配置:https://www.jianshu.com/p/63f7c94c77f9
- jar引入原则:https://www.cnblogs.com/LaiCuiTing/p/9542525.html
- 题库:https://blog.csdn.net/a303549861/article/details/93752178