在日常的项目中,经常会遇到以下几种情况:
①一个项目中包含有多个工程
②项目中需要导入各种不同的jar包,可能会出现工程中导入的jar包出现重复的现象
③导入的jar包需要自己到官网上下载,并且还需要下载相应的依赖jar包
④部署的时候需要添加到路径中去
这些情况会导致的问题:
项目大,不适合使用package进行管理
自己导入的jar包可能来自于不同的网站,使得jar包不规范,进而会拖延项目的时间
对于自己导入的jar包其依赖的jar包也要记,不然会导致项目运行不了
maven可以解决上述问题,以及其他的一些重复性的操作
以“java源文件”、“jsp”、框架文件”和”HTML“等资源为原材料,生成一个可以运行项目的过程
其中包含了三个过程:
①编译
②部署
③搭建
清理:清理旧的,已经编译好的文件
编译:将新的java文件编译成新的class文件
测试:自动测试,自动调用Junit
报告:生成测试的报告
打包:动态Web 打成 war包、 java项目打成jar包
部署:将动态Web的可运行文件部署到服务器上(将Web项目生成的war包复制到servlet容器在的指定目录下,使其可以运行
自动化构建:编译、测试、打包、部署
一、检查自己的电脑上的JAVA_HOME是否为Java的bin目录的上一级目录
二、解压Maven的核心压缩包(路径下为全英文和没有空格)
三、自己配置好MAVEN_HOME(或M2_HOME)的环境
tips:
HOME 的环境一般配置在bin目录的上一级目录
path 的环境一般配置在bin目录下
规定的目录结构 | 仓库 |
---|---|
POM(Project Object Model) | 生命周期/插件/目标 |
坐标 | 继承 |
依赖 | 聚合 |
重要的:
src: 源码
pom.xml:maven的配置文件,是maven的核心
目的:为了让maven自动的找到这些文件
tips:
如果是自己定义的文件需要配置到maven中:
一、以配置的方式告诉maven:
<param -value>ClassPath</param -value>
二、遵守Maven的内部文件结构规约:
如:log4j.properties
*************
重要: 规约>配置>编码
mvn clean:用于清理已经生成的Target文件(旧的编译好了的文件)
mvn compile:用于执行主程序的编译(批量)
mvn test-compile:用于执行测试程序的编译(批量)
mvn test :执行测试
mvn package : 执行打包操作
mvn install : 将自己的项目导入maven的本地仓库
mvn site :生成站点
mvn deploy : maven自动部署
在maven的核心中仅仅只定义了抽象的生命周期,具体的实现时依靠各种插件来实现的,而插件并不在其核心之中。在执行插件时,maven先会在本地的仓库中进行查找,然后再到中央仓库中去寻找。
本地的仓库地址为(【用户的User目录】\.m2\repository)
maven 仓库中没有就会连接到中央仓库中进行下载,下载的文件会保存在仓库中的特定的目录下(IJ 中需要点击下载源码才能够保存在本地仓库中)
打开maven的安装目录:
conf-->settings.xml
找到<mirrors>标签:
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
添加之后,下载速度会比外网下载快很多
maven的坐标有三个变量:
groupId: [公司组织的倒述].[项目名称]
artifactId:模块名
revision:版本号(snapshot 为快照,不稳定)
maven坐标即显示出了项目在仓库中的地址
本地仓库即用户本地的仓库,可在maven安装目录下的conf下的Settings.xml下配置<localrepository>进行配置。
远程仓库:
局域网仓库
中央仓库
中央仓库的镜像
仓库中包含的内容:
maven 的自身插件
第三方框架的jar包
我们自己开发的maven工程
IJ的pom.xml中的提示只能显示本地仓库中已经有的文件,导入依赖后,点击下载源文件便可以将导入的Jar包放入本地仓库
依赖是通过<dependencys>标签引用本地仓库或中央仓库的jar包。
依赖可以引用仓库中的Jar包可以是:
①自己已经编写好了的项目
②在编译的过程中根据Pom.xml中的依赖查找相对应的Jar包
自己编写的项目,并不会自己导入本地仓库需要:
(1)通过手动的形式创建相对应的目录后进行导入(非常不提倡)
(2)使用mvn install 的命令将自己项目导入maven的本地仓库
依赖的使用范围
依赖的范围 <scop> | 对主程序 | 对测试程序 | 打包 | 部署 |
---|---|---|---|---|
compile | 有效 | 有效 | 参与 | 参与 |
test | 无效 | 有效 | 不参与 | 不参与 |
provided | 有效 | 有效 | 不参与 | 不参与 |
使用依赖范围的例子:
compile 为默认
test 为测试 例如: Junit
provide 例如:servlet-api、jsp-api
maven的各个构建环节都是按照顺序执行的
maven的核心程序中,定义了抽象的生命周期,其实现为各个插件进行实现
maven的核心程序是为了更好的实现自动化构建的这一个特点,按照这一个特点,不论执行生命周期的哪一个阶段,都是从生命周期中最底层开始执行。
插件和目标
目标定义了要执行的目标是什么
各个阶段的插件就是为了完成目标
各个阶段的插件和目标是相对应的
可以将目标看做是插件的方法
在设置maven的时候,installation的时候,要选择自己的maven,系统自带的maven的版本低;User settings为指定maven解压目录下的conf文件下的settings.xml文件。
创建maven版的java:
遇到的问题:
解决方案:
创建maven版的javaweb:
遇到的问题:
解决方案:
执行maven命令:
点击pom.xml文件,右键后,选择run as,除了一些基本的选项外,还可以选择build ...在其中输入其他命令来执行,如:compile、deploy和test等命令
①可以每次手动进行配置、
②通过配置maven文件的配置(一劳永逸)
打开Settings.xml文件
找到profile标签
加入配置
<profile>
<id>jdk-1.8</id><!--Name-->
<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>
在选择打包后的不同的文件格式,java选择jar、javaWeb选择war、父工程则选择pom
<dependencies>
<dependency>
<groupId></groupId>
<artifactId>jsp-api</artifactId>
<version></version>
<scop>provided</scop>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>servlet-api</artifactId>
<version></version>
<scop>provided</scop>
</dependency>
</dependencies>
一个模块的依赖可以传给依赖于这个模块的模块
作用: 可以减少各个模块的重复导包,并且使得传递的依赖并不需要在每个模块中重复声明,在“最下面”的工程声明一次依赖即可。(范围为非compile的依赖是不能传递的),若不能传递的则需要在各个模块中重复声明。
什么时候需要排除依赖的传递?
答:当自己引入某个包的时候,其依赖的包不稳定,为了使得整个系统更加稳定则需要排除依赖的传递。
如何进行排除?
<exclusions>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
</exclusions>
排除同样具有传递性,底层的包排除后(排除包A),依赖其的模块由于传递依赖而导入的排除包也会被排除(即包A)
解决引入的jar包版本不同的问题
相同的包名,版本不同,则模块引入路径最短的那个
相同的包名,版本不同,路径相同,则引入在pom.xml中最先声明的那个
若需要统一一个框架中各部分的包的版本相同,并且容易更改,怎么办?
答:
手动一个个的更改配置(不推荐)
配置方式
<!--声明一个属性,该属性名字即标签中的name,值为版本号-->
<properties>
<name>版本号</name>
</properties>
?
<!--在需要引用版本号的地方使用${name}进行使用-->
<version>${name}</version>
tips: properties标签并不是只能用来声明版本号,凡是统一声明的地方都可以使用该标签
在各个模块中Junit的版本可能不一样,导致最后的测试无法统一
统一管理各个模块工程的Junit依赖版本(由于Junit的范围是test,因此,分散在各个模块中的测试版本很容易不一致
将Junit的依赖版本统一提取到父工程中,在子工程中声明的Junit依赖时,不指定版本。(以父工程中的版本为主,便于修改)
答:
创建一个打包方式为Pom的文件
在各个子工程中声明对付工程的引用
<parent> <groupId>父工程的坐标</groupId> <artifactId>父工程的坐标</artifactId> <version>父工程的坐标</version> <!--以当前工程的pom.xml文件为基准的父工程的pom.xml文件的相对路径--> <relativePath>Path</relativePath> </parent>
将子工程中与父工程相同的内容删除(如本身的<groupId>和<version>)
在父工程中统一Junit的依赖
<dependencyManagement> <dependencies> <dependency> <!--配置子工程中需要的Junit的坐标--> <groupId></groupId> <artifactId>Junit</artifactId> <version></version> </dependency> </dependencies> </dependencyManagement>
在配置完成后,应该先install父工程,再安装子工程
作用:
一键安装各个模块工程
配置方式:
在一个总的聚合模块中配置各个参与聚合的模块
可以在父工程中添加
<modules> <module> <groupId>子工程坐标</groupId> <artifactId>子工程坐标</artifactId> <version>子工程坐标</version> </module> <module> <groupId></groupId> <artifactId></artifactId> <version></version> </module> </modules>
执行:在父工程的pom.xml文件上点击右键,运行install命令
命令 : mvn deploy(在cmd窗口下进行使用)
javaweb:
将war包放到tomcat的webapps的目录下
运行 catalina run (会根据war包,在该路径下生成相对应的解压文件)
<build> <finalName>最终项目的名字</finalName> <plugins> <!--过程中使用的插件--> <plugin> <groupId></groupId> <artifactId></artifactId> <version></version> </plugin> </plugins> <configuration> <container> <continerId>容器名字</continerId> <home>对应的HOME</home> </container> <propertise> <!--设置属性--> </propertise> <executions> <excution> <id>名字</id> <phase>阶段(install...)</phase> </excution> </executions> <goals> <goal>目标(run...)</goal> </goals> </configuration> </build>
cargo是一家专门从事“启动Servet容器”的组织
导入的jre版本过低
答:可以通过配置settings.xml中的<profile>标签进行
在eclipse导入的环境为jre而非是jdk
答:选择project→properties→add Library → JRE Library → 选择默认的jdk文件
(如果没有配置为Jdk的话,mvn test将无法执行)
Test-compile命令 会生成Test的编译文件
而compile命令 不会生成Test的编译文件
注意: 有依赖于自己写的项目时,记得将依赖项目导入maven的本地仓库(使用mvn install命令),如果需要移除自己的项目,只需要找到maven仓库中的文件,删除即可
在eclipse中无法通过编译查看运行结果,只能够使用mvn test来进行测试,所以与IntellJ相比,IJ 更好用
如果引用同一项目的不同版本,那么将会在同一项目的目录下,存储不同版本的文件
<exclusions>是在<dependencise>标签中使用,<exclusion>中的坐标不需要版本号(排除依赖时,使用)
注意:父工程的打包方式必须为"pom"形式,记得在子工程中的<parent>标签中加入坐标后,还应该加入<relativePath>(以当前目录为基准,父工程的pom.xml文件的相对路径)标签
原文:https://www.cnblogs.com/wan123/p/12782108.html