package打印会生成target
install打印打印到本地仓库
一.maven的下载_目录结构_IDEA整合
- Idea默认集成maven
- 下载地址:https://maven.apache.org
- Idea集成maven
在settings.xml中配置
①本地仓库的位置
<localRepository>D:\maven_lib\respository</localRepository>
②远程仓库的配置+`
<mirror>
<id>aliyunmaven</id>
<mirrorOf>central</mirrorOf>
<name>central</name>
<url>https://maven.aliyun.com/repository/central</url>
</mirror>
③配置maven项目的环境也就是jdk版本(可选)
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
Maven解压目录介绍
三.Maven仓库
本地仓库:就是在本地存放jar包的文件夹
远程仓库:非本地存放jar包的地址(中央仓库,私人服,其他公共库)
本地仓库:就是Maven在本机存储构件的地方。maven的本地仓库,在安装maven后并不会创建,它是在第一次执行maven命令的时候才被创建。maven本地仓库的默认位置:在用户的目录下都只有一个.m2/repository/的仓库目录;可以修改。
中央仓库:包含了绝大多数流行的开源Java构件,以及源码、作者信息、SCM、信息、许可证信息等。开源的Java项目依赖的构件都可以在这里下载到。
中央仓库的地址:http://repo1.maven.org/maven2/
私服:是一种特殊的远程仓库,它是架设在局域网内的仓库。
四.JDK的配置
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
五.Maven工程类型
【1】POM工程:
POM工程是逻辑工程,用在父级工程或聚合工程中。用来做jar包的版本控制。
【2】JAR工程:
将会打成jar,用作jar包使用。即常见的本地工程-----》Java Project.
【3】WAR工程:
将会打成war,发布在服务器上的工程。
六.在Idea中创建Maven项目
普通的maven项目创建
七.Maven项目结构
目录介绍:
Main/java: 放开发的java代码
Resources: 配置文件
Test/java:放测试代码
Pom.xml: 配置依赖
八.POM模式-Maven工程关系
- 依赖: A工程开发或运行过程中需要B工程支持,在这种情况下,需要在A项目的pom.xml文件中增加下属配置定义依赖关系。
通俗理解:就是导jar包。B工程可以是自己的项目打包后的jar包,也可以是中央仓库的jar包。
【1.1】如何注入依赖呢?在pom.xml文件 根元素project下的 dependencies标签中,配置依赖信息,内可以包含多个dependence元素,以声明多个依赖。每个依赖dependence标签都应该包含以下元素:groupld,artifactld,version:依赖的基本坐标,对于任何一个依赖来说,基本坐标是最重要的,Maven根据坐标才能找到需要的依赖。
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
</dependencies>
【1.2】依赖的好处
省去了程序员动手添加jar包的操作,可以帮我们解决jar包冲突问题:
【2】依赖的传递性
注意:将项目1打包成jar包,再创建项目2,让项目2依赖项目1
传递性两个原则:
【2.1】第一原则:最短路径优先原则
“最短路径优先”意味着项目依赖关系树中路径最短的版本会被使用。
【2.2】第二原则:最先声明原则
依赖路径长度是一样的的时候,在POM中依赖声明的顺序决定了谁会被解析使用。顺序最靠前的那个依赖优胜。
【3】排除依赖
Exclusions:用来排除传递性依赖,其中可配置多个exclusion标签,每个exclusion里面对应的有groupid,artifactid,version三项基本元素
<dependencies>
<dependency>
<groupId>com.tledu</groupId>
<artifactId>mavn-demo1</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
【4】依赖范围
@compile这是默认范围。如果没有指定,就会使用该依赖范围。表示该依赖在编译和运行时都生效。
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
<scope>compile</scope>
</dependency>
</dependencies>
@provided 编译和测试项目的时候需要该依赖,但在运行项目的时候,由于容器已经提供,就不需要Maven重复地引入一遍(如:servlet-api)
@runtime 执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。
@system 系统范围与provided类似,不过你必须显式指定一个本地系统路径的JAR,此类依赖应该一直有效,Maven也不会去仓库中寻找它。但是,使用system范围依赖时必须通过systemPath元素显式地指定依赖文件的路径,
@test 范围表明使用此依赖范围的依赖,只在编译测试代码和运行测试的时候需要,应用的正常运行不需要此类依赖。典型的例子就是JUnit,它只有在编译测试代码及运行测试的时候才需要。Junit的jar包就在测试阶段用就行了,你导出项目的时候没有必要把junit的东西到处去了就,所在在junit坐标下加入scope-test
@import范围只适用于pom文件中的<dependencyManagement>部分。表明指定的POM必须使用<dependencyManagement>部分的依赖, 注意:import只能用在dependencyManagement的scope里。
- 继承关系
如果A工程继承B工程,则代表A工程默认依赖B工程依赖的所有资源,且可以应用B工程中定义的所有资源信息。被继承的工程(B工程)只能是POM工程。注意:在父项目中放在<dependencyManagement>中的内容时不被子项目继承,不可以直接使用放在<dependencyManagement>中的内容主要目的是进行版本管理,里面的内容在子项目中依赖时坐标只需要填写<group id>和<artifact id>即可。(注意:如果子项目不希望使用父项目的版本,可以明确配置version)
父工程pom.xml:
<groupId>com.tledu</groupId>
<artifactId>mavn-demo1</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
子工程pom.xml:
<groupId>com.tledu</groupId>
<artifactId>mvn-demo2</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<parent>
<artifactId>mavn-demo1</artifactId>
<groupId>com.tledu</groupId>
<version>1.0-SNAPSHOT</version>
<relativePath>../mavn-demo1/pom.xml</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</dependency>
</dependencies>
- 聚合关系
2个以上模块,每个模块都是一个独立的功能集合,在创建聚合工程的过程中,总的工程必须是一个POM工程(Maven Project) (聚合项目必须是一个pom类型的项目,jar项目war项目是没有办法做聚合工程的),各子模块可以是任意类型模块(Maven Module)
前提:继承。
聚合包含了继承的特性。
聚合时多个项目的本质还是一个项目。这些项目被一个大的父项目包含。且这时父项目类型为pom类型。同时在父项目的pomxml中出现<modules>表示包含的所有子模块。
父工程pom.xml
<groupId>com.tledu</groupId>
<artifactId>mavn-demo1</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>child-demo</module>
</modules>
<packaging>pom</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<spring.version>5.3.10</spring.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
子模块pom.xml:
<parent>
<artifactId>mavn-demo1</artifactId>
<groupId>com.tledu</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>child-demo</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
</dependencies>
①编译版本插件(可以在不同模块中定义自己的编译环境)
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
②资源拷贝插件
Maven在打包时默认只将src/main/resources里的配置文件拷贝到项目中并做打包处理,而非resource目录下的配置文件在打包时不会添加到项目中。
pom.xml配置片段:
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>