为什么需要Maven?
添加第三方 jar包
jar 包之间的依赖关系
获取第三方 jar 包
将项目拆分成多个工程模块
这就需要用到 Maven 的依赖管理机制。大家请看 我们的 Survey 调查项目拆分的情况:
上层模块依赖下层,所以下层模块中定义的 API 都可以为上层所调用和访问。
什么是Maven:
市场流行构建工具:Make→Ant→Maven→Gradle
构建简介:
构建并不是创建,创建一个工程并不等于构建一个项目。要了解构建的含义我们应该由浅入深的从 以下三个层面来看:
纯 Java 代码:
Web 工程:
Web 工程和其编译结果的目录结构对比见下图:
实际项目:
构建就是以我们编写的 Java 代码、框架配置文件、国际化等其他资源文件、JSP 页面和图片等静态资源作为“原材料”,去“生产”出一个可以运行的项目的过程。
构建过程各个环节简述:
在本地repository中安装jar(包含mvn compile,mvn package,然后上传到本地仓库)
上传到私服(包含mvn install,然后,上传到私服)
自动化构建:
项目为什么要使用jar或war进行打包发布?区别是什么?
jar
war
服务层和表现层(视图层)
。把服务层打包成jar包
,把视图层的包打成war包
。jar包中包含了你写程序的所有服务或者第三方类库
,它通常是作为幕后工作者,为视图层用户与之交换数据处理的一个服务者,jar文件格式以Zip文件格式为基础,与Zip不同的是,它可以被发布,而且还能用于部署,它封装了库、组件和插件程序,并且可以被编译器和jvm使用,在jar中还包含特殊的文件,如mainfests和部署的应用描述,用于指示工具如何处理特定的jar。一个war文件可以看成一个web应用程序
。与jar封装不同的是:它内聚了很多页面,如html、jsp,Servlet,js,css,icon图片文件等等,当然还包括组成web应用的其他组件,这些文件基本没有复杂业务逻辑的处理,基本上仅仅是用来当做程序的门户负责与使用者交互,仅此而已。war包中的目录结构中包括WEB-INF,而war是一个可以直接运行的web模块,做好一个web项目后,需要打包部署到容器中,一般放置在tomcat的\webapps\目录下,当启动tomcat时,这个包将被解压,即相当于发布了。
jar中一般都是些class文件,声明了Main_cass后就可以用java命令去运行它。
简述:
约定的目录结构简述:
通过配置的形式明确告诉它
基于第三方工具或框架的约定
Maven 对工程目录结构的要求就属于后面的一种。
Maven项目和Java项目本质上没区别,且Maven项目里的子父项目无区别,本质上都是通过Jar包引用。
常用的Maven命令简述:
mvn clean:清理,将根目录下生成的target文件移除。
mvn package:编译代码并打包
mvn install:编译代码并打包、将打好的包放置到本地仓库中(如果还是同一个版本默认会覆盖之前安装的包)
Maven联网的问题简述:
Maven的核心程序中仅仅定义了抽象的生命周期
。但是具体的工作必须由特点的插件来完成。而插件本身并不包含在Maven的核心程序中。
POM简述:
Project Object Model:项目对象模型。
将 Java 工程的相关信息封装为对象作为便于操作和管理的模型。可以说学习 Maven 就是学习 pom.xml 文件中的配置。
Maven坐标:
groupid:公司或组织的域名倒序+当前项目名称
: artifactId:当前项目的模块名称
: version:当前模块的版本
: Snapshot版本和release版本区别:
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project</description>
仓库简介:
本地仓库:为当前本机电脑上的所有 Maven 工程服务。
远程仓库:
私服:架设在当前局域网环境下,为当前局域网范围内的所有 Maven 工程服务。
中央仓库:架设在 Internet 上,为全世界所有 Maven 工程服务。
中央仓库的镜像:架设在各个大洲,为中央仓库分担流量。减轻中央仓库的压力,同时更快的响应用户请求。
Maven 的插件
我们自己开发的项目的模块
第三方框架或工具的 jar 包
安装的命令是:mvn install
依赖的目的是什么:
<dependency>
<groupId>com.mavengroupId>
<artifactId>HelloartifactId>
<version>0.0.1-SNAPSHOTversion>
<scope>compilescope>
<optional>trueoptional>
dependency>
依赖的寻找方式:
当引入父项目时:
①Maven首先在构建当前项目的地方寻找父项目的pom。
②其次在文件系统的这个位置(relativePath位置)。
③然后在本地仓库。
④最后在远程仓库寻找父项目的pom。
当引入普通项目时:
①首先在构建当前项目的地方寻找项目的jar或者war包。(注意:只有加入maven project的才算)
②其次在然后在本地仓库寻找。
③最后在远程仓库寻找。
依赖的范围:
compile范围依赖:
test范围依赖:
provided范围依赖:
provided意味着打包的时候可以不用包进去,别的设施(Web Container)会提供。runntime范围依赖:
runntime表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与,与compile相比,跳过编译而已。比如你可能在编译的时候只需要JDBC API JAR,而只有在运行的时候才需要JDBC驱动实现。
Maven依赖的optional元素:
假如你的Project A的某个依赖D添加了
:true
,当别人通过pom依赖ProjectA的时候,D不会被传递依赖进来
默认为不去除:
在项目中设optional为false
去除optional
maven面板冲突的特征:
依赖传递性:
非complie范围的依赖不能传递
,所以在各个工程模块中,如果有需要就得重复声明依赖。`依赖排除:
<exclusions>
<exclusion>
<groupId>commons-logginggroupId>
<artifactId>commons-loggingartifactId>
exclusion>
exclusions>
依赖的原则:
统一管理所依赖的版本:
一、使用properties标签呃逆使用自定义标签统一声明版本号。
<properties>
<spring-version>4.0.0.RELEASEspring-version>
properties>
二、在需要统一版本的位置,使用$()引用声明的版本号。
<version>$(spring-version)version>
继承简介:
由于非 compile 范围的依赖信息是不能在“依赖链”中传递的,所以有需要的工程只能单独配置
。使用继承机制就可以将这样的依赖信息统一提取到父工程模块中进行统一管理。
dependency management标签:
dependencyManagement不会引入依赖
只会对继承pom有效,对于dependency方式依赖该工程的工程不会起作用
Maven多继承:
import scope依赖
依赖只能放在dependencyManagement中,如果需要被多继承的话。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.xuzimian.global.demogroupId>
<artifactId>spring-coreartifactId>
<version>1.0-SNAPSHOTversion>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
type为pom的理解:
这个时候我们引进来一个type为pom,意味着我们可以将所有的jar包打包成一个pom,然后我们依赖了pom,即可以下载下来所有依赖的jar包
type为pom的依赖一般命名为XX-dependencies-XX。
此外对于父项目也必须为pom,以及多继承也必须为pom。
继承操作步骤:
必须指明这个聚合工程的打包方式为pom
pom格式的意思就是只生成一个pom.xml文件,而不生成其他任何jar,zip文件。
<groupId>com.mavengroupId>
<artifactId>parentartifactId>
<version>0.1.1-SNAPSHOTversion>
<packaging>pompackaging>
指定父工程
:
以当前文件为基准的父工程pom.xml文件的相对路径,相对路径允许你选择一个不同的路径,默认值是../pom.xml
。<parent>
<groupId>com.mavengroupId>
<artifactId>parentartifactId>
<version>0.1.1-SNAPSHOTversion>
<relativePath>../parent/pom.xmlrelativePath>
parent>
<groupId>com.mavengroupId>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.9version>
<scope>testscope>
dependency>
dependencies>
dependencyManagement>
<version>4.0/version>
聚合简介:
将多个工程拆分为模块后,需要手动逐个安装到仓库后依赖才能够生效。修改源码后也需要逐个手动进行 clean 操作。
而使用了聚合之后就可以批量进行 Maven 工程的安装、清理工作。
<modules>
<module>../Hello</module>
<module>../HelloFriend</module>
<module>../MakeFriends</module>
</modules>
Maven 的生命周期:
Maven 有三套相互独立的生命周期:
Clean Lifecycle 在进行真正的构建之前进行一些清理工作
: Clean 生命周期一共包含了三个阶段:
①pre-clean 执行一些需要在 clean 之前完成的工作
②clean 移除所有上一次构建生成的文件
③post-clean 执行一些需要在 clean 之后立刻完成的工作
Site Lifecycle 生成项目报告,站点,发布站点
:Site 生命周期一共包含了四个阶段:
①pre-site 执行一些需要在生成站点文档之前完成的工作
②site 生成项目的站点文档
③post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
④site-deploy 将生成的站点文档部署到特定的服务器上
<1>这里经常用到的是 site 阶段和 site-deploy 阶段,用以生成和发布 Maven 站点,这可是 Maven 相当强大的功能,Manager 比较喜欢,文档及统计数据自动生成,很好看。
Default Lifecycle 构建的核心部分,编译,测试,打包,安装,部署等等。
①Default 生命周期是 Maven 生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。这里只解释一些比较重要和常用的阶段:
validate
generate-sources
process-sources
generate-resources
process-resources 复制并处理资源文件,至目标目录,准备打包。
compile 编译项目的源代码。
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources 复制并处理资源文件,至目标测试目录。
test-compile 编译测试源代码。
process-test-classes
test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
prepare-package
package 接受编译好的代码,打包成可发布的格式,如 JAR。
pre-integration-test
integration-test
post-integration-test
verify
install 将包安装至本地仓库,以让其它项目依赖。
deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享或部署到服务器上运行。
总结:
生命周期与自动化构建:
插件和目标:
生命周期阶段 | 插件目标 | 插件 |
---|---|---|
compile | compile | maven-compile-plugin |
test-compile | test-compile | maven-compile-plugin |
maven之build标签概述:
即使不添加默认也会引入以下插件:
:全局配置(project build)
:针对整个项目的所有情况都有效配置(profile build)
:`针对不同的profile配置
<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/maven-v4_0_0.xsd">
…
<!– "Project Build" contains more elements than just the BaseBuild set –>
<build>…build>
<profiles>
<profile>
<!– "Profile Build" contains a subset of "Project Build"s elements –>
<build>…build>
profile>
profiles>
基本元素:
${basedir}/target目录
${artifactId}-${version}
定义*.properties文件,包含一个properties列表,该列表会应用到支持filter的resources中。
也就是说定义在filter的文件中的name=value键值对,会在build时代替${name}
值应用到resources中。maven的默认filter文件夹为${basedir}/src/main/filters
。<build>
<defaultGoal>installdefaultGoal>
<directory>${basedir}/targetdirectory>
<finalName>${artifactId}-${version}finalName>
<filters>
<filter>filters/filter1.propertiesfilter>
filters>
...
build>
plugins标签
: 用于指定使用的插件是否加载plugin的extensions,默认为false
inherited:true/false,这个plugin是否应用到该pom的孩子pom,默认为true。(继承)
作为plugin的依赖
plugin可以有多个目标
,每一个目标都可以有一个分开的配置,可以将一个plugin绑定到不同的阶段,假如绑定antrun:run目标到verify阶段。<build>
...
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-jar-pluginartifactId>
<version>2.0version>
<extensions>falseextensions>
<inherited>trueinherited>
<configuration>
<classifier>testclassifier>
configuration>
<dependencies>...dependencies>
<executions>...executions>
plugin>
plugins>
build>
---------------------------编译插件示例:---------------------------
<<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<version>2.3.2version>
<configuraation>
<source>1.7source>
<target>1.7target>
configuraation>
plugin>
plugins>
<build>
pluginManagement配置
:pluginManagement的配置和plugins的配置是一样的,只是用于继承,使得可以在孩子pom中使用。resources标签
:主要用于打包资源文件
<build>
...
<resources>
<resource>
<targetPath>META-INF/plexustargetPath>
<filtering>truefiltering>
<directory>${basedir}/src/main/plexusdirectory>
<includes>
<include>configuration.xmlinclude>
includes>
<excludes>
<exclude>**/*.propertiesexclude>
excludes>
resource>
resources>
<testResources>
...
testResources>
...
build>
resources标签举例
:设置build_resources。
使用build-helper-maven-plugin插件。
使用maven-resources-plugin插件。
一般情况下我们用到的资源文件(各种xml,properties,xsd文件)都放在src/main/resources下面,利用maven打包时,maven能把这些资源文件打包到相应的jar或者war里。
maven认为src/main/java只是java的源代码路径
)<build>
<finalName>testfinalName>
<resources>
<resource>
<directory>src/main/resourcesdirectory>
<includes>
<include>**/*.propertiesinclude>
<include>**/*.xmlinclude>
<include>**/*.tldinclude>
includes>
<filtering>falsefiltering>
resource>
<resource>
<directory>src/main/javadirectory>
<includes>
<include>**/*.propertiesinclude>
<include>**/*.xmlinclude>
<include>**/*.tldinclude>
includes>
<filtering>falsefiltering>
resource>
resources>
build>
maven上侧面板使用:
maven下侧面板使用:
maven右侧选项按钮:
(project或module中已经有了此依赖)
(模块中没有此依赖,需要在pom文件中引入)
右键pom.xml->Maven->Show Dependencies
在这个所有依赖的界面搜索,:按crtl + f 然后输入字符。
您可以使用忽略项目选项停用 Maven 项目。在这种情况下,IntelliJ IDEA 将忽略的 Maven 项目和子项目保留在Maven工具窗口中,但停止将它们(模块、内容根、目标等)导入到项目中。但是,IntelliJ IDEA 会将忽略的项目与当前项目同步。
当您处理具有多个子项目并需要跳过不相关的项目时,这可能会有所帮助。忽略项目就是还在IDEA中显示但是不导入。
链接 Maven 项目
取消链接 Maven 项目:当您取消链接 Maven 项目时,IntelliJ IDEA 会删除所有相关项目和内容根,从Maven工具窗口和项目工具窗口中删除 Maven 项目,并停止其同步。如果您需要从当前的 IntelliJ IDEA 项目中完全删除之前链接的 Maven 项目,这可能会有所帮助。
链接与取消链接等同于加入与移除。
冲突的本质:
同一个Jar包出现了多个不同版本:
应用程序依赖的同一个Jar包出现了多个不同版本,并选择了错误的版本而导致JVM加载不到需要的类或加载了错误版本的类,为了叙述的方便,笔者称之为第一类Jar包冲突问题。同一个类出现在多个不同Jar包中:
同样的类(类的全限定名完全一样)出现在多个不同的依赖Jar包中,即该类有多个版本,并由于Jar包加载的先后顺序导致JVM加载了错误版本的类,称之为第二类Jar包问题。冲突的表象:
问题排查和解决:
简介:
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-surefire-pluginartifactId>
<version>2.19version>
<configuration>
<excludes>
<exclude>**/TestConstants.javaexclude>
excludes>
<forkMode>alwaysforkMode>
<parallel>methodsparallel>
<threadCount>4threadCount>
configuration>
plugin>
Maven属性事实上有六种类型的Maven属性:
内置属性:
POM属性
:pom中对应元素的值。例如${project.artifactId}对应了元素的值,常用的POM属性包括:自定义属性
:在pom中元素下自定义的Maven属性。例如<project>
<properties>
<my.prop>hello</my.prop>
</properties>
</project>
Settings属性
:与POM属性同理。如${settings.localRepository}指向用户本地仓库的地址。Java系统属性
:所有Java系统属性都可以使用Maven属性引用,例如${user.home}指向了用户目录。可以通过命令行mvn help:system查看所有的Java系统属性环境变量属性
:所有环境变量都可以使用以env.开头的Maven属性引用。例如${env.JAVA_HOME}指代了JAVA_HOME环境变量的值。也可以通过命令行mvn help:system查看所有环境变量。简述:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.2.17.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.2.17.RELEASE</version>
</dependency>
Aspects
则引入spring-aspects(spring-aop无需单独引入
)jdbc api
则引入spring-jdbc(包含spring-tx)
orm
则引入spring-orm(包含spring-tx)
tx
则引入spring-tx简介:
archetype的意思就是模板原型的意思,原型是一个Maven项目模板工具包。
cocoon-22-archetype-webapp
maven-archetype-quickstart
maven-archetype-webapp
maven-archetype-webapp
(一般使用这个)建好项目后,项目的结构如下:Maven 命令深度理解:
一种必须在项目中运行,视为项目命令;
另外一种则不需要,视为全局命令。
插件与命令的关系:
Maven 实际上是一个依赖插件执行的框架,每个任务实际上是由插件完成。所以,Maven 命令都是由插件来执行的。
Maven 命令格式解读:
mvn [plugin-name]:[goal-name]
这个命令采用了缩写的形式:
mvn help:effective-pom
其全称是这样的:
org.apache.maven.plugins:maven-help-plugin:2.2:effective-pom
总结:
此命令以分号为分隔符,包含了 groupId,artifactId,version,goal 四部分。若 groupId 为
org.apache.maven.plugins 则可以使用上述的简写形式。
help:effective-pom
命令详解:
mvn archetype:create 创建Maven项目
mvn compile 编译源代码
mvn test-compile 编译测试代码
mvn test 运行测试
mvn site 生成项目相关信息的网站
mvn clean 清除项目的生成结果
mvn package 打包项目生成jar/war文件
mvn install 安装jar至本地库
mvn deploy 上传至私服
mvn eclipse:eclipse 生成Eclipse项目文件
mvn ieda:ieda 生成IDEA项目文件
mvn archetype:generate 反向生成maven项目的骨架
mvn -Dtest package 只打包不测试
mvn jar:jar 只打jar包
mvn test -skipping compile -skipping test-compile 只测试不编译也不编译测试
mvn eclipse:clean 清除eclipse的一些系统设置
mvn dependency:list 查看当前项目已被解析的依赖
mvn clean install -U 强制检查更新
mvn source:jar 打包源码
mvn jetty:run 运行项目于jetty上
mvn tomcat:run 运行项目于tomcat上
mvn -e 显示详细错误 信息:
mvn validate 验证工程是否正确,所有需要的资源是否可用
mvn integration-test 在集成测试可以运行的环境中处理和发布包
mvn verify 运行任何检查,验证包是否有效且达到质量标准
mvn generate-sources 产生应用需要的任何额外的源代码
mvn help:describe -Dplugin=help 输出Maven Help插件的信息
mvn help:describe -Dplugin=help -Dfull 输出完整的带有参数的目标列
mvn help:describe -Dplugin=compiler -Dmojo=compile -Dfull 获取单个目标的信息
mvn help:describe -Dplugin=exec -Dfull 列出所有Maven Exec插件可用的目标
mvn help:effective-pom 查看Maven的默认设置
mvn install -X 想要查看完整的依赖踪迹,打开 Maven 的调试标记运行
mvn install assembly:assembly 构建装配Maven Assembly
mvn dependency:resolve 打印已解决依赖的列表
mvn dependency:tree 打印整个依赖树
mvn dependency:sources 获取依赖源代码
-Dmaven.test.skip=true 跳过测试
-Dmaven.tomcat.port=9090 指定端口
-Dmaven.test.failure.ignore=true 忽略测试失败
常用打包命令:
mvn clean install package -Dmaven.test.skip=true #清理之前项目生成结果并构建然后将依赖包安装到本地仓库跳过测试
mvn clean deploy package -Dmaven.test.skip=true #构建并将依赖放入私有仓库
mvn --settings /data/settings.xml clean package -Dmaven.test.skip=true #指定maven配置文件构建
maven仓库设置 settings.xml与pom.xml 优先级:
三者的级先是 pom.xml > /home_dir/.m2/settings.xml >/maven_dir/conf/settings.xml 。
MAVEN最常用的远程仓库:
仓库名称 | 阿里云仓库地址 | 阿里云仓库地址(老版) | 源地址 |
---|---|---|---|
central |
https://maven.aliyun.com/repository/central | https://maven.aliyun.com/nexus/content/repositories/central | https://repo1.maven.org/maven2/ |
jcenter |
https://maven.aliyun.com/repository/public | https://maven.aliyun.com/nexus/content/repositories/jcenter | http://jcenter.bintray.com/ |
public |
https://maven.aliyun.com/repository/public | https://maven.aliyun.com/nexus/content/groups/public | central仓和jcenter仓的聚合仓 |
google |
https://maven.aliyun.com/repository/google | https://maven.aliyun.com/nexus/content/repositories/google | https://maven.google.com/ |
gradle-plugin | https://maven.aliyun.com/repository/gradle-plugin | https://maven.aliyun.com/nexus/content/repositories/gradle-plugin | https://plugins.gradle.org/m2/ |
spring | https://maven.aliyun.com/repository/spring | https://maven.aliyun.com/nexus/content/repositories/spring | http://repo.spring.io/libs-milestone/ |
spring-plugin | https://maven.aliyun.com/repository/spring-plugin | https://maven.aliyun.com/nexus/content/repositories/spring-plugin | http://repo.spring.io/plugins-release/ |
grails-core | https://maven.aliyun.com/repository/grails-core | https://maven.aliyun.com/nexus/content/repositories/grails-core | https://repo.grails.org/grails/core |
apache snapshots | https://maven.aliyun.com/repository/apache-snapshots | https://maven.aliyun.com/nexus/content/repositories/apache-snapshots | https://repository.apache.org/snapshots/ |
pom.xml简介:
<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.0http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<artifactId />
<groupId />
<version />
<relativePath />
parent>
<modelVersion>4.0.0modelVersion>
<groupId>asia.banseongroupId>
<artifactId>banseon-maven2artifactId>
<packaging>jarpackaging>
<version>1.0-SNAPSHOTversion>
<name>banseon-mavenname>
<url>http://www.baidu.com/banseonurl>
<description>A maven project to study maven.description>
<prerequisites>
<maven />
prerequisites>
<issueManagement>
<system>jirasystem>
<url>http://jira.baidu.com/banseonurl>
issueManagement>
<ciManagement>
<system />
<url />
<notifiers>
<notifier>
<type />
<sendOnError />
<sendOnFailure />
<sendOnSuccess />
<sendOnWarning />
<address />
<configuration />
notifier>
notifiers>
ciManagement>
<inceptionYear />
<mailingLists>
<mailingList>
<name>Demoname>
<post>[email protected]post>
<subscribe>[email protected]subscribe>
<unsubscribe>[email protected]unsubscribe>
<archive>http:/hi.baidu.com/banseon/demo/dev/archive>
mailingList>
mailingLists>
<developers>
<developer>
<id>HELLO WORLDid>
<name>banseonname>
<email>[email protected]email>
<url />
<roles>
<role>Project Managerrole>
<role>Architectrole>
roles>
<organization>demoorganization>
<organizationUrl>http://hi.baidu.com/banseonorganizationUrl>
<properties>
<dept>Nodept>
properties>
<timezone>-5timezone>
developer>
developers>
<contributors>
<contributor>
<name />
<email />
<url />
<organization />
<organizationUrl />
<roles />
<timezone />
<properties />
contributor>
contributors>
<licenses>
<license>
<name>Apache 2name>
<url>http://www.baidu.com/banseon/LICENSE-2.0.txturl>
<distribution>repodistribution>
<comments>A business-friendly OSS licensecomments>
license>
licenses>
<scm>
<connection>
scm:svn:http://svn.baidu.com/banseon/maven/banseon/banseon-maven2-trunk(dao-trunk)
connection>
<developerConnection>
scm:svn:http://svn.baidu.com/banseon/maven/banseon/dao-trunk
developerConnection>
<tag />
<url>http://svn.baidu.com/banseonurl>
scm>
<organization>
<name>demoname>
<url>http://www.baidu.com/banseonurl>
organization>
<build>
<sourceDirectory />
<scriptSourceDirectory />
<testSourceDirectory />
<outputDirectory />
<testOutputDirectory />
<extensions>
<extension>
<groupId />
<artifactId />
<version />
extension>
extensions>
<defaultGoal />
<resources>
<resource>
<targetPath />
<filtering />
<directory />
<includes />
<excludes />
resource>
resources>
<testResources>
<testResource>
<targetPath />
<filtering />
<directory />
<includes />
<excludes />
testResource>
testResources>
<directory />
<finalName />
<filters />
<pluginManagement>
<plugins>
<plugin>
<groupId />
<artifactId />
<version />
<extensions />
<executions>
<execution>
<id />
<phase />
<goals />
<inherited />
<configuration />
execution>
executions>
<dependencies>
<dependency>
......
dependency>
dependencies>
<inherited />
<configuration />
plugin>
plugins>
pluginManagement>
<plugins>
<plugin>
<groupId />
<artifactId />
<version />
<extensions />
<executions>
<execution>
<id />
<phase />
<goals />
<inherited />
<configuration />
execution>
executions>
<dependencies>
<dependency>
......
dependency>
dependencies>
<goals />
<inherited />
<configuration />
plugin>
plugins>
build>
<profiles>
<profile>
<id />
<activation>
<activeByDefault />
<jdk />
<os>
<name>Windows XPname>
<family>Windowsfamily>
<arch>x86arch>
<version>5.1.2600version>
os>
<property>
<name>mavenVersionname>
<value>2.0.3value>
property>
<file>
<exists>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/
exists>
<missing>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/
missing>
file>
activation>
<build>
<defaultGoal />
<resources>
<resource>
<targetPath />
<filtering />
<directory />
<includes />
<excludes />
resource>
resources>
<testResources>
<testResource>
<targetPath />
<filtering />
<directory />
<includes />
<excludes />
testResource>
testResources>
<directory />
<finalName />
<filters />
<pluginManagement>
<plugins>
<plugin>
<groupId />
<artifactId />
<version />
<extensions />
<executions>
<execution>
<id />
<phase />
<goals />
<inherited />
<configuration />
execution>
executions>
<dependencies>
<dependency>
......
dependency>
dependencies>
<goals />
<inherited />
<configuration />
plugin>
plugins>
pluginManagement>
<plugins>
<plugin>
<groupId />
<artifactId />
<version />
<extensions />
<executions>
<execution>
<id />
<phase />
<goals />
<inherited />
<configuration />
execution>
executions>
<dependencies>
<dependency>
......
dependency>
dependencies>
<goals />
<inherited />
<configuration />
plugin>
plugins>
build>
<modules />
<repositories>
<repository>
<releases>
<enabled />
<updatePolicy />
<checksumPolicy />
releases>
<snapshots>
<enabled />
<updatePolicy />
<checksumPolicy />
snapshots>
<id />
<name />
<url />
<layout />
repository>
repositories>
<pluginRepositories>
<pluginRepository>
<releases>
<enabled />
<updatePolicy />
<checksumPolicy />
releases>
<snapshots>
<enabled />
<updatePolicy />
<checksumPolicy />
snapshots>
<id />
<name />
<url />
<layout />
pluginRepository>
pluginRepositories>
<dependencies>
<dependency>
......
dependency>
dependencies>
<reports />
<reporting>
......
reporting>
<dependencyManagement>
<dependencies>
<dependency>
......
dependency>
dependencies>
dependencyManagement>
<distributionManagement>
......
distributionManagement>
<properties />
profile>
profiles>
<modules />
<repositories>
<repository>
<releases>
<enabled />
<updatePolicy />
<checksumPolicy />
releases>
<snapshots>
<enabled />
<updatePolicy />
<checksumPolicy />
snapshots>
<id>banseon-repository-proxyid>
<name>banseon-repository-proxyname>
<url>http://192.168.1.169:9999/repository/url>
<layout>defaultlayout>
repository>
repositories>
<pluginRepositories>
<pluginRepository>
......
pluginRepository>
pluginRepositories>
<dependencies>
<dependency>
<groupId>org.apache.mavengroupId>
<artifactId>maven-artifactartifactId>
<version>3.8.1version>
<type>jartype>
<classifier>classifier>
<scope>testscope>
<systemPath>systemPath>
<exclusions>
<exclusion>
<artifactId>spring-coreartifactId>
<groupId>org.springframeworkgroupId>
exclusion>
exclusions>
<optional>trueoptional>
dependency>
dependencies>
<reports>reports>
<reporting>
<excludeDefaults />
<outputDirectory />
<plugins>
<plugin>
<groupId />
<artifactId />
<version />
<inherited />
<configuration />
<reportSets>
<reportSet>
<id />
<configuration />
<inherited />
<reports />
reportSet>
reportSets>
plugin>
plugins>
reporting>
<dependencyManagement>
<dependencies>
<dependency>
......
dependency>
dependencies>
dependencyManagement>
<distributionManagement>
<repository>
<uniqueVersion />
<id>banseon-maven2id>
<name>banseon maven2name>
<url>file://${basedir}/target/deployurl>
<layout />
repository>
<snapshotRepository>
<uniqueVersion />
<id>banseon-maven2id>
<name>Banseon-maven2 Snapshot Repositoryname>
<url>scp://svn.baidu.com/banseon:/usr/local/maven-snapshoturl>
<layout />
snapshotRepository>
<site>
<id>banseon-siteid>
<name>business api websitename>
<url>
scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web
url>
site>
<downloadUrl />
<relocation>
<groupId />
<artifactId />
<version />
<message />
relocation>
<status />
distributionManagement>
<properties />
project>
settings.xml文件元素详解:
LocalRepository:
该值表示构建系统本地仓库的路径。InteractiveMode:
表示maven是否需要和用户交互以获得输入。UsePluginRegistry:
maven是否需要使用plugin-registry.xml文件来管理插件版本。Offline:
这个属性表示在Maven进行项目编译和部署等操作时是否允许Maven进行联网来下载所需要的信息。PluginGroups:
在pluginGroups元素下面可以定义一系列的pluginGroup元素。表示当通过plugin的前缀来解析plugin的时候到哪里寻找。pluginGroup元素指定的是plugin的groupId。
默认情况下,Maven会自动把org.apache.maven.plugins 和 org.codehaus.mojo 添加到pluginGroups下。<localRepository>${user.home}/.m2/repositorylocalRepository>
<interactiveMode>trueinteractiveMode>
<usePluginRegistry>falseusePluginRegistry>
<offline>falseoffline>
<pluginGroups>
<pluginGroup>org.codehaus.mojopluginGroup>
pluginGroups>
Servers:
一般情况时仓库的下载和部署是在pom.xml文件中的repositories 和distributionManagement 元素中定义的。然而一般类似用户名、密码(有些仓库访问是需要安全认证的)等信息不应该在pom.xml文件中配置,这些信息可以配置在 settings.xml 中。
<servers>
<server>
<id>server001id>
<username>my_loginusername>
<password>my_passwordpassword>
<privateKey>${usr.home}/.ssh/id_dsaprivateKey>
<passphrase>some_passphrasepassphrase>
<filePermissions>664filePermissions>
<directoryPermissions>775directoryPermissions>
server>
servers>
Mirrors
:用于定义一系列的远程仓库的镜像。
mirror相当于一个拦截器,它会拦截maven对remote repository的相关请求,把请求里的remote repository地址,重定向到mirror里配置的地址。
我们知道,默认情况下配置多个mirror的情况下,只有第一个生效。那么我们可以将最后一个作为默认值,前面配置的使用环境变量动态切换。
<mirrors>
<mirror>
<id>mirrorIdid>
<name>PlanetMirror Australianame>
<url>http://downloads.planetmirror.com/pub/maven2url>
<mirrorOf>repositoryIdmirrorOf>
mirror>
<mirror>
<id>alimavenid>
<name>aliyun mavenname>
<url>http://maven.aliyun.com/nexus/content/groups/public/url>
<mirrorOf>centralmirrorOf>
mirror>
mirrors>
Proxies
:用来配置不同的代理。
<proxies>
<proxy>
<id>myproxyid>
<active>trueactive>
<protocol>httpprotocol>
<host>proxy.somewhere.comhost>
<port>8080port>
<username>proxyuserusername>
<password>somepasswordpassword>
<nonProxyHosts>*.google.com|ibiblio.orgnonProxyHosts>
proxy>
proxies>
Profiles
:根据环境参数来调整构建配置的列表。
<profiles>
<profile>
<id>testid>
<activation>
<activeByDefault>falseactiveByDefault>
<jdk>1.6jdk>
<os>
<name>Windows 7name>
<family>Windowsfamily>
<arch>x86arch>
<version>5.1.2600version>
os>
<property>
<name>mavenVersionname>
<value>2.0.3value>
property>
<file>
<exists>${basedir}/file2.propertiesexists>
<missing>${basedir}/file1.propertiesmissing>
file>
activation>
<properties />
<repositories />
<pluginRepositories />
...
profile>
profiles>
ActiveProfiles
:手动激活profiles的列表,按照profile被应用的顺序定义activeProfile。
<activeProfiles>
<activeProfile>env-testactiveProfile>
activeProfiles>
Maven的jar包报错问题:
首先在任何报错问题前先clean一下,再查看控制台报的错误
。或者打开Project structure的Module的Dependencies,再edit某个依赖
然后:Reload All Maven Projects或者Reload Project
或者在Project Structure的Module的Dependencies中进行添加。
当前 Maven 最新版本 Maven 3.6.2 有可能与最新版的 IDEA 有冲突或兼容问题
进入到.idea/misc.xm文件中,删除option元素中set元素中的全部内容。
删除之后单击右键maven工程 点击Reimport会自动加入模块。
因此需要将依赖的模块先安装到本地库
。具体步骤:直接clean并install父模块(父模块聚合了其他子模块)。
Maven在下载仓库中找不到相应资源时,会生成一个.lastUpdated为后缀的文件:
注意检查版本号和jar包名称是否写错。
提供一个小工具,只要运行可以自动检测删除你下载未完整的依赖文件:
首先创建一个txt文档,复制一下代码,记得路径修改为你自己所在依赖包的位置,然后把.txt文件后缀改为.bat ,双击运行即可跳出窗口去自动删除。set REPOSITORY_PATH=E:\repository
rem 正在搜索...
for /f "delims=" %%i in ('dir /b /s "%REPOSITORY_PATH%\*lastUpdated*"') do (
del /s /q %%i
)
rem 搜索完毕
pause
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<configuration>
<source>1.8source>
<target>1.8target>
configuration>
plugin>
plugins>
build>
Maven 酷站: