Maven【[ˈmevən]】这个词能够翻译为"专家","内行"。 做为Apache组织中的一个颇为成功的开源项目,Maven主要服务于基于java平台的项目构建,依赖管理和项目信息管理。 html
不管是小型的开源类库项目,仍是大型的企业级应用; 不管是传统的瀑布式开发,仍是流行的敏捷开发,Maven都能大显身手。java
无论你是否意识到,构建(build)是每一位程序员天天都在作的工做。早上来到公司,咱们作的第一件事就是从源码库签出最新的代码,而后进行单元测试,若是测试失败,会找相关的同事一块儿调试,修复错误代码。 接着回到本身的工做上来,编写本身的单元测试及产品代码。程序员
仔细总结一下,咱们会发现,除了编写源代码,咱们天天有至关一部分时间花在了编译,运行单元测试,生成文档,打包和部署等繁琐且不起眼的工做上,这就是构建。 若是咱们如今还手工这样作,那成本也过高了,因而有人用软件的方法让这一系列工做彻底自动化,使得软件的构建能够像全自动流水线同样,只须要一条简单的命令,全部繁琐的步骤都可以自动完成,很快就能获得最终结果。web
Ant构建spring
最先的构建工具,基于IDE, 大概是2000年有的,当时是最流行java构建工具,不过它的XML脚本编写格式让XML文件特别大。对工程构建过程当中的过程控制特别好shell
Maven【JAVA】数据库
项目对象模型,经过其描述信息来管理项目的构建,报告和文档的软件项目管理工具。它填补了Ant缺点,Maven第一次支持了从网络上下载的功能,仍然采用xml做为配置文件格式。Maven专一的是依赖管理,使用Java编写。apache
**Gradle**
属于结合以上两个的优势,它继承了Ant的灵活和Maven的生命周期管理,它最后被google做为了Android御用管理工具。它最大的区别是不用XML做为配置文件格式,采用了DSL格式,使得脚本更加简洁。api
目前市面上Ant比较老,因此通常是一些比较传统的软件企业公司使用,Maven使用Java编写, 是当下大多数互联网公司会使用的一个构建工具, 中文文档也比较齐全, gradle是用groovy编写,目前比较新型的构建工具一些初创互联网公司会使用,之后会有很大的使用空间。浏览器
Maven为Java世界引入了一个新的依赖管理系统jar包管理 jar 升级时修改配置文件便可。在Java世界中,能够用groupId、artifactId、version组成的Coordination(坐标)惟一标识一个依赖。
任何基于Maven构建的项目自身也必须定义这三项属性,生成的包能够是Jar包,也能够是war包或者jar包。一个典型的依赖引用以下所示:
<dependency> <groupId>javax.servlet</groupId> com.baidu <artifactId>javax.servlet-api</artifactId> ueditor echarts <version>3.1.0</version> </dependency>
坐标属性的理解
Maven坐标为各类组件引入了秩序,任何一个组件都必须明肯定义本身的坐标。
groupId
定义当前Maven项目隶属的实际项目-公司名称。(jar包所在仓库路径) 因为Maven中模块的概念,所以一个实际项目每每会被划分为不少模块。 好比spring是一个实际项目,其对应的Maven模块会有不少,如spring-core,spring-webmvc等。
artifactId
该元素定义实际项目中的一个Maven模块-项目名, 推荐的作法是使用实际项目名称做为artifactId的前缀。 好比: spring-bean、 spring-webmvc等。
version
该元素定义Maven项目当前所处的版本。
项目复查时 dao service controller 层分离将一个项目分解为多个模块已是很通用的一种方式。
在Maven中须要定义一个parent POM做为一组module的聚合POM。在该POM中可使用 <modules> 标签来定义一组子模块。parent POM不会有什么实际构建产出。而parent POM中的build配置以及依赖配置都会自动继承给子module。
Ant时代你们建立Java项目目录时比较随意,而后经过Ant配置指定哪些属于source,那些属于testSource等。而Maven在设计之初的理念就是Conversion over configuration(约定大于配置)。其制定了一套项目目录结构做为标准的Java项目结构,解决不一样ide 带来的文件目录不一致问题。
<plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>maven-jetty-plugin</artifactId> <version>6.1.25</version> <configuration> <scanIntervalSeconds>10</scanIntervalSeconds> <contextPath>/test</contextPath> </configuration> </plugin>
JDK版本1.7及以上版本
下载地址:http://maven.apache.org/downl...
解压后把Maven的根目录配置到系统环境变量中MAVEN_HOME,将bin目录配置到path变量中。
注:maven解压后存放的目录不要包含中文和空格
打开dos窗口,执行 mvn -v[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aNSEjOD4-1607568090193)(/maven_1.png)]
Maven项目目录结构[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dcKONxu1-1607568090199)(/maven_2.png)]
<font color="red">任务:手动建立一个Maven项目,并编译运行成功!</font>
在根目录中建立一个pom.xml文件,内容以下
<?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"> <modelVersion>4.0.0</modelVersion> <groupId>com.xxxx</groupId> <artifactId>maven01</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>maven01</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project>
Ps:标签订义解释
根目录下的第一个子元素 ModelVersion指定当前Pom模型的版本,对于Maven3来讲,它只能是4.0.0 。指定了当前Maven模型的版本号,对于Maven2和Maven3来讲,它只能是4.0.0 groupId定义了项目属于哪一个组, 这个组每每和项目所在的组织和公司存在关联。 好比: com.xxxx artifactId 定义了当前Maven项目在组中惟一的ID。 Version X.X.X-里程碑 好比:1.0.0-SNAPSHOT 第一个X 大版本 有重大变革 第二个X 小版本 修复bug,增长功能 第三个X 更新 里程碑版本: SNAPSHOT (快照,开发版) alpha(内部测试) beta(公开测试) Release | RC( 发布版) GA(正常版本) 使用name标签声明一个对于用户更为友好的项目名称,虽然不是必须的,但仍是推荐为每一个Pom声明name,以方便信息交流。
package com.xxxx.demo; public class Hello{ public static void main(String[] args) { System.out.println("hello maven"); } }
cmd下面,进入项目的根目录
1. 编译java文件
mvn compile
2. 执行main 方法
mvn exec:java -Dexec.mainClass="com.xxxx.demo.Hello"
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XML5lTYt-1607568090209)(/maven_3.png)]
<font color="red">注:第一次下载会比较慢,要修改maven解压以后的conf目录下的settings.xml。</font>
1.1.修改默认仓库位置 打开maven目录 -> conf -> settings.xml 添加仓库位置配置 <localRepository>F:/m2/repository</localRepository> 注:仓库位置改成本身本机的指定目录,"/"不要写反 1.2.更换阿里镜像,加快依赖下载 <mirror> <id>nexus-aliyun</id> <mirrorOf>central</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror>
若是编译不成功,可能出现的问题
1. 不是使用管理员权限执行dos命令 2. JDK环境配置有问题,重装JDK 3. 代码编写时,类里面没设置包名(若是编译时类没加包名,执行时也不须要加包名)
做为开发利器的maven,为咱们提供了十分丰富的命令,了解maven的命令行操做并熟练运用常见的maven命令仍是十分必要的,即便譬如IDEA等工具给我提供了图形界面化工具,但其底层仍是依靠maven命令来驱动的。
Maven的命令格式以下:
mvn [plugin-name]:[goal-name]
命令表明的含义:执行plugin-name
插件的goal-name
目标
命令 | 描述 |
---|---|
mvn –version | 显示版本信息 |
mvn clean | 清理项目生产的临时文件,通常是模块下的target目录 |
mvn compile | 编译源代码,通常编译模块下的src/main/java目录 |
mvn package | 项目打包工具,会在模块下的target目录生成jar或war等文件 |
mvn test | 测试命令,或执行src/test/java/下junit的测试用例. |
mvn install | 将打包的jar/war文件复制到你的本地仓库中,供其余模块使用 |
mvn deploy | 将打包的文件发布到远程参考,提供其余人员进行下载依赖 |
mvn site | 生成项目相关信息的网站 |
mvn eclipse:eclipse | 将项目转化为Eclipse项目 |
mvn dependency:tree | 打印出项目的整个依赖树 |
mvn archetype:generate | 建立Maven的普通java项目 |
mvn tomcat7:run | 在tomcat容器中运行web应用 |
mvn jetty:run | 调用 Jetty 插件的 Run 目标在 Jetty Servlet 容器中启动 web 应用 |
注意:运行maven命令的时候,首先须要定位到maven项目的目录,也就是项目的pom.xml文件所在的目录。不然,必以经过参数来指定项目的目录。
上面列举的只是比较通用的命令,其实不少命令均可以携带参数以执行更精准的任务。
例如:
`mvn package -Dmaven.test.skip=true`
以-D
开头,将maven.test.skip
的值设为true
,就是告诉maven打包的时候跳过单元测试。同理,mvn deploy-Dmaven.test.skip=true
表明部署项目并跳过单元测试。
好比项目开发须要有多个环境,通常为开发,测试,预发,正式4个环境,在pom.xml中的配置以下:
<profiles> <profile> <id>dev</id> <properties> <env>dev</env> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> <profile> <id>qa</id> <properties> <env>qa</env> </properties> </profile> <profile> <id>pre</id> <properties> <env>pre</env> </properties> </profile> <profile> <id>prod</id> <properties> <env>prod</env> </properties> </profile> </profiles> ...... <build> <filters> <filter>config/${env}.properties</filter> </filters> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> ...... </build>
profiles
定义了各个环境的变量id
,filters
中定义了变量配置文件的地址,其中地址中的环境变量就是上面profile
中定义的值,resources
中是定义哪些目录下的文件会被配置文件中定义的变量替换。
经过maven能够实现按不一样环境进行打包部署,例如:
mvn package -Pdev -Dmaven.test.skip=true
表示打包本地环境,并跳过单元测试
选择 "File" —> "Other Settings" —> "Settings for New Projects..." —> 搜索 "Maven"
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-33D17Plc-1607568090216)(/maven_4.png)]
选择下载好的maven版本(目录选到bin目录的上一级目录)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gvwtpJdR-1607568090220)(/maven_5.png)]
设置settings.xml文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y0mg3hEq-1607568090224)(/maven_6.png)]
设置好以后,选择 "Apply" 或者 "OK"
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ENIqjWny-1607568090227)(/maven_7.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V38Oa399-1607568090229)(/maven_8.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vEdndD6s-1607568090231)(/maven_9.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wkb2lKij-1607568090234)(/maven_10.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nvpewVnE-1607568090237)(/maven_11.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZGMyoRJW-1607568090240)(/maven_12.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G6Phzzw9-1607568090242)(/maven_13.png)]
<font color="red">注:右下角弹出的提示框,选择 "Enable Auto-Import"(Maven启动自动导入)</font>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HtQf7bRD-1607568090246)(/maven_15.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-odFlHniH-1607568090248)(/maven_16.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iJlEsjRH-1607568090263)(/maven_18.png)]
注:其余步骤与建立普通的Java项目相同。
<!-- JDN的版本修改成1.8 --> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties>
<!-- junit的版本修改成4.12 --> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies>
<!-- 将这个标签及标签中的内容所有删除 --> <pluginManagement> ... </pluginManagement>
在 build 标签中添加 plugins 标签
Jetty插件
<!-- 设置在plugins标签中 --> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>maven-jetty-plugin</artifactId> <version>6.1.25</version> <configuration> <!-- 热部署,每10秒扫描一次 --> <scanIntervalSeconds>10</scanIntervalSeconds> <!-- 可指定当前项目的站点名 --> <contextPath>/test</contextPath> <connectors> <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector"> <port>9090</port> <!-- 设置启动的端口号 --> </connector> </connectors> </configuration> </plugin>
Tomcat插件
<!-- 设置在plugins标签中 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.1</version> <configuration> <port>8081</port> <!-- 启动端口 默认:8080 --> <path>/test</path> <!-- 项目的站点名,即对外访问路径 --> <uriEncoding>UTF-8</uriEncoding> <!-- 字符集编码 默认:ISO-8859-1 --> <server>tomcat7</server> <!-- 服务器名称 --> </configuration> </plugin>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bO9adwGZ-1607568090273)(/maven_15.png)]
Jetty插件配置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-schUkQXA-1607568090275)(/maven_20.png)]
也能够输入命令指定端口启动
jetty:run -Djetty.port=9090 # 须要将插件配置中的port标签去掉
点击启动图标,启动服务[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1vjfXZRN-1607568090277)(/maven_21.png)]
启动成功[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qd96sTFm-1607568090280)(/maven_22.png)]
浏览器访问效果[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i7w8K5of-1607568090281)(/maven_23.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-76q2tDPn-1607568090283)(/maven_24.png)]
启动方式如上,启动成功[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yTE4UGJo-1607568090285)(/maven_25.png)]
浏览器访问 http://localhost:8080/test [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fnKZMdih-1607568090287)(/maven_26.png)]
当第一次运行Maven命令的时候, 你须要Internet连接, 由于它须要从网上下载一些文件。 那么它从哪里下载呢? 它是从Maven默认的远程库下载的。 这个远程仓库有Maven的核心插件和可供下载的jar文件。
对于Maven来讲, 仓库只分为两类: 本地仓库和远程仓库。
当Maven根据坐标寻找构件的时候,它首先会查看本地仓库,若是本地仓库存在,则直接使用; 若是本地没有,Maven就会去远程仓库查找,发现须要的构件以后,下载到本地仓库再使用。 若是本地仓库和远程仓库都没有,Maven就会报错。
远程仓库分为三种: 中央仓库,私服, 其余公共库。
中央仓库是默认配置下,Maven下载jar包的地方。
私服是另外一种特殊的远程仓库,为了节省带宽和时间,应该在局域网内架设一个私有的仓库服务器,用其代理全部外部的远程仓库。 内部的项目还能部署到私服上供其余项目使用。
通常来讲,在Maven项目目录下,没有诸如lib/这样用来存放依赖文件的目录。 当Maven在执行编译或测试时,若是须要使用依赖文件,它老是基于坐标使用本地仓库的依赖文件。
默认状况下, 每一个用户在本身的用户目录下都有一个路径名为.m2/repository/的仓库目录。 有时候,由于某些缘由(好比c盘空间不足),须要修改本地仓库目录地址。
对于仓库路径的修改,能够经过maven 配置文件conf 目录下settings.xml来指定仓库路径
<!-- 设置到指定目录中,路径的斜杆不要写反 --> <settings> <localRepository>D:/m2/repository</localRepository> </settings>
因为原始的本地仓库是空的,maven必须知道至少一个可用的远程仓库,才能执行maven命令的时候下载到须要的构件。中央仓库就是这样一个默认的远程仓库。
maven-model-builder-3.3.9.jar maven自动的 jar 中包含了一个 超级POM。定义了默认中央仓库的位置。
中央仓库包含了2000多个开源项目,接收天天1亿次以上的访问。
私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务, 私服代理广域网上的远程仓库,供局域网内的maven用户使用。 当maven须要下载构件时, 它去私服当中找,若是私服没有, 则从外部远程仓库下载,并缓存在私服上, 再为maven提供。
此外,一些没法从外部仓库下载的构件也能从本地上传到私服提供局域网中其余人使用
配置方式项目pom.xml 配置
<repositories> <repository> <snapshots> <enabled>true</enabled> </snapshots> <id>public</id> <name>Public Repositories</name> <url>http://192.168.0.96:8081/content/groups/public/</url> </repository> <repository> <id>getui-nexus</id> <url>http://mvn.gt.igexin.com/nexus/content/repositories/releases/</url> </repository> </repositories>
公司内部应该创建私服:
经常使用的阿里云仓库配置
<mirror> <id>nexus-aliyun</id> <mirrorOf>central</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror>
使用maven 提供的多模块构建的特性完成maven 环境下多个模块的项目的管理与构建。
这里以四个模块为例来搭建项目,以达到通俗易懂的初衷 模块 maven_parent —– 基模块,就是常说的parent (pom) 模块 maven_dao —– 数据库的访问层,例如jdbc操做(jar) 模块 maven_service —– 项目的业务逻辑层 (jar) 模块 maven_controller —– 用来接收请求,响应数据 (war)
建立 maven_service 模块的步骤与 maven_dao模块一致。
建立 maven_service 模块的步骤与 maven_dao模块基本一致,只须要将第一步选择Maven模板设置为web项目便可。(模板类型:maven-archetype-webapp)
模块所有建立完毕后,效果以下:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VcQBs1xM-1607568090307)(/maven_45.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WrHDcy4C-1607568090311)(/maven_46.png)]
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PKPjn5Rl-1607568090314)(/maven_47.png)
在类中添加方法
package com.xxxx.dao; public class UserDao { public static void testDao() { System.out.println("UserDao Test..."); } }
添加maven_dao的依赖
<!-- 加入maven_dao模块的依赖 --> <dependency> <groupId>com.xxxx</groupId> <artifactId>maven_dao</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
在项目中添加UserService类,并添加方法
package com.xxxx.service; import com.xxxx.dao.UserDao; public class UserService { public static void testService() { System.out.println("UserService Test..."); // 调用UserDao的方法 UserDao.testDao(); } }
添加 maven_service 模块的依赖
<!-- 加入maven_service模块的依赖 --> <dependency> <groupId>com.xxxx</groupId> <artifactId>maven_service</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
添加Servlet的依赖
<!-- Servlet的依赖 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency>
新建 Java 类,继承 HttpServlet 类,并重写 service方法
package com.xxxx.controller; import com.xxxx.service.UserService; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/user") public class UserServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("UserServlet Test..."); // 调用UserService层的方法 UserService.testService(); } }
添加Tomcat插件
<!-- 添加插件 --> <plugins> <!-- tomcat7插件 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.1</version> <configuration> <!-- <port>8080</port> --> <path>/web</path> <uriEncoding>UTF-8</uriEncoding> <server>tomcat7</server> </configuration> </plugin> </plugins>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NQXxHw3e-1607568090323)(/maven_49.png)]
访问地址:http://localhost:8080/web/user
访问结果:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r3cNFUyV-1607568090325)(/maven_50.png)]
注:若是父项目 install 失败,则先将全部子模块 install 成功后,再 install 父项目。
对于企业级项目,不管是进行本地测试,仍是测试环境测试以及最终的项目上线,都会涉及项目的打包操做。对于每一个环境下的项目打包,对应的项目所须要的配置资源都会有所区别,实现打包的方式有不少种,能够经过ant,或者经过idea 自带的打包功能实现项目打包,但当项目很大而且须要的外界配置不少时,此时打包的配置就会异常复杂,对于maven 项目,咱们能够用过 pom.xml 配置的方式来实现打包时的环境选择,相比较其余形式打包工具,经过maven 只须要经过简单的配置,就能够轻松完成不一样环境下项目的总体打包。
好比下面这样一个项目,项目中配置了不一样环境下项目所须要的配置文件,这时候须要完成不一样环境下的打包操做,此时经过修改pom.xml 以下:
使用idea建立项目,目录结构可能会缺失,须要经过手动添加对应的目录。
选择项目的 main 文件夹,右键选择New,选择Directory
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eTlFa7a8-1607568090336)(/maven_27.png)]
输入文件夹名 "Java",如图:
选择 java 目录,右键选择 Mark Directory as,选择 Sources Root。将文件夹标记为源文件夹。
步骤如上,建立文件夹,命名为 resources,并标记为 Resources Root[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-34KCnpiN-1607568090343)(/maven_32.png)]
<!-- 打包环境配置 开发环境 测试环境 正式环境 --> <profiles> <profile> <id>dev</id> <properties> <env>dev</env> </properties> <!-- 未指定环境时,默认打包dev环境 --> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> <profile> <id>test</id> <properties> <env>test</env> </properties> </profile> <profile> <id>product</id> <properties> <env>product</env> </properties> </profile> </profiles>
<!-- 对于项目资源文件的配置放在build中 --> <resources> <resource> <directory>src/main/resources/${env}</directory> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> <include>**/*.properties</include> <include>**/*.tld</include> </includes> <filtering>false</filtering> </resource> </resources>
打开Run/Debug Configuarations窗口,输入对应的打包命令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yZcVkePu-1607568090347)(/maven_34.png)]
此时对应打包命令
1. `clean compile package -Dmaven.test.skip=true`
打包默认环境(开发环境)而且跳过maven 测试操做
2. `clean compile package -Ptest -Dmaven.test.skip=true`
打包测试环境而且跳过maven 测试操做
3. `clean compile package -Pproduct -Dmaven.test.skip=true`
打包生产环境而且跳过maven 测试操做
打包成功
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dXGUZgs1-1607568090348)(/maven_35.png)]
不一样的项目打包的文件不同,通常来讲,普通java项目打成jar包,web项目打成war包
根元素project下的dependencies能够包含多个 dependence元素,以声明多个依赖。每一个依赖都应该包含如下元素:
Scope: 依赖范围(compile,test,provided,runtime,system)
若是没有指定,就会默认使用该依赖范围。使用此依赖范围的Maven依赖,对于编译、测试、运行三种classpath都有效。
使用此依赖范围的Maven依赖,只对于测试classpath有效,在编译主代码或者运行项目的使用时将没法使用此类依赖。典型的例子就是JUnit,它只有在编译测试代码及运行测试的时候才须要。
使用此依赖范围的Maven依赖,对于编译和测试classpath有效,但在运行时无效。典型的例子是servlet-api,编译和测试项目的时候须要该依赖,但在运行项目的时候,因为容器已经提供,就不须要Maven重复地引入一遍(如:servlet-api)。
使用此依赖范围的Maven依赖,对于测试和运行classpath有效,但在编译主代码时无效。典型的例子是JDBC驱动实现,项目主代码的编译只须要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才须要实现上述接口的具体JDBC驱动。
该依赖与三种classpath的关系,和provided依赖范围彻底一致。可是,使用system范围依赖时必须经过systemPath元素显式地指定依赖文件的路径。因为此类依赖不是经过Maven仓库解析的,并且每每与本机系统绑定,可能形成构建的不可移植,所以应该谨慎使用。
首先须要知道,Maven在编译项目主代码的时候须要使用一套classpath。 好比:编译项目代码的时候须要用到spring-core, 该文件以依赖的方式被引入到classpath中。 其次, Maven在执行测试的时候会使用另一套classpath。 如:junit。
最后在实际运行项目时,又会使用一套classpath, spring-core须要在该classpath中,而junit不须要。
那么依赖范围就是用来控制依赖与这三种classpath(编译classpath,测试classpath,运行时classpath)的关系, Maven有如下几种依赖范围:
传递依赖机制, 让咱们在使用某个jar的时候就不用去考虑它依赖了什么。也不用担忧引入多余的依赖。 Maven会解析各个直接依赖的POM,将那些必要的间接依赖,以传递性依赖的形式引入到当前项目中。
<font color="color">注意: 传递依赖有可能产生冲突!!</font>
冲突场景:
A-->B--->C (2.0) A-->E--->C (1.0)
若是A下同时存在两个不一样version的C,冲突!!(选取同时适合A、B的版本)
<dependencies> <dependency> <groupId>A</groupId> <artifactId>A</artifactId> <version>xxx</version> <exclusions> <exclusion> <groupId>C</groupId> <artifactId>C</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>B</groupId> <artifactId>B</artifactId> </dependency> </dependencies>