maven-特性

#Maven几个特性和依赖
##一、属性
####内置属性:

  • ${basedir}表示项目根目录,即包含pom.xml文件的目录
  • ${version}表示项目版本
    ####POM属性
    ${project.artifactId}对应了 元素的值,常用的POM属性包括:

${project.build.sourceDirectory}:项目的主源码目录,默认为src/main/java/.

${project.build.testSourceDirectory}:项目的测试源码目录,默认为/src/test/java/.

${project.build.directory}:项目构建输出目录,默认为target/.

${project.outputDirectory}:项目主代码编译输出目录,默认为target/classes/.

${project.testOutputDirectory}:项目测试代码编译输出目录,默认为target/testclasses/.

${project.groupId}:项目的groupId.

${project.artifactId}:项目的artifactId.

p r o j e c t . v e r s i o n : 项 目 的 v e r s i o n , 于 {project.version}:项目的version,于 project.version:version,{version}等价.

p r o j e c t . b u i l d . f i n a l N a m e : 项 目 打 包 输 出 文 件 的 名 称 , 默 认 为 {project.build.finalName}:项目打包输出文件的名称,默认为 project.build.finalName:,{project.artifactId}${project.version}.

p r o j e c t . b a s e d i r : 同 {project.basedir}:同 project.basedir:{basedir}

####Settings属性:
与POM属性同理
${settings.localRepository}指向用户本地仓库的地址
####Java系统属性
所有环境变量都可以使用以env.开头的Maven属性引用
${env.JAVA_HOME}指代了JAVA_HOME环境变量的值。也可以通过命令行mvn help:system查看所有环境变量。
####资源过滤
默认情况下,Maven属性只有在POM中才会被解析。资源过滤就是指让Maven属性在资源文件(src/main/resources、src/test/resources)中也能被解析
在POM中添加下面的配置便可以开启资源过滤
${project.basedir}/src/main/resources
true
${project.basedir}/src/test/resources
true

##依赖
dependency最小信息集是{groupId,artifactId,type,classifier},type默认为jar,classifier默认为null
###依赖类型(type)
1.jar:默认为jar
2.war:会将被依赖war中所有文件复制到项目中。war和被依赖war的重复文件以war中文件为准。
3.pom:将依赖pom中所有dependency
###依赖分类(classifier)
用于从同一POM构建的拥有不同内容的附属构件,可选属性,可以是任意的字符串。附属构件不是项目直接默认生成的,而是由附加的插件帮助生成的。例如:javadoc.jar,源码sources.jar
结合maven-jar-plugin打包不同的构件
###依赖范围(scope)

  1. compile 默认的范围, 编译范围依赖在所有的classpath 中可用,同时它们也会被打包。
		<dependency>
			<groupId>xxxx</groupId>
			<artifactId>xxx</artifactId>
		</dependency>
  1. provided 编译和测试时有效,打包时会被排除。官方举了一个例子。比如在JavaEE web项目中我们需要使用servlet的API,但是呢Tomcat中已经提供这个jar,我们在编译和测试的时候需要使用这个api,但是部署到tomcat的时候,如果还加入servlet构建就会产生冲突,这个时候就可以使用provided。
		<dependency>
			<groupId>xxxx</groupId>
			<artifactId>xxx</artifactId>
			<scope>provided</scope>
		</dependency>
  1. runtime 表示在构建编译阶段不需要,会被打包,只在test和runtime需要。这种主要是指代码里并没有直接引用而是根据配置在运行时动态加载并实例化的情况。虽然用runtime的地方改成compile也不会出大问题,但是runtime的好处是可以避免在程序里意外地直接引用到原本应该动态加载的包。例如JDBC连接池
		<dependency>
			<groupId>xxxx</groupId>
			<artifactId>xxx</artifactId>
			<scope>runtime</scope>
		</dependency>
  1. test 在测试时有效,打包时会被排除。
		<dependency>
			<groupId>xxxx</groupId>
			<artifactId>xxx</artifactId>
			<scope>runtime</scope>
		</dependency>
  1. system system范围依赖与provided 类似,但是你必须显式的提供一个对于本地系统中JAR 文件的路径。这么做是为了允许基于本地对象编译,而这些对象是系统类库的一部分。这样的构件应该是一直可用的,Maven 也不会在仓库中去寻找它。如果你将一个依赖范围设置成系统范围,你必须同时提供一个 systemPath 元素。注意该范围是不推荐使用的(你应该一直尽量去从公共或定制的 Maven 仓库中引用依赖)。
		<dependency>
			<groupId>xxxx</groupId>
			<artifactId>xxx</artifactId>
			<scope>system</scope>
			<systemPath>xxx/xx/xx/xx.jar</systemPath>
		</dependency>
  1. import 导入的范围,它只在使用dependencyManagement中,表示从其他pom中导入dependecy的配置。
		<dependency>
			<groupId>xxxx</groupId>
			<artifactId>xxx</artifactId>
			<scope>import</scope>
		</dependency>
		<dependency>
			<groupId>xxxx</groupId>
			<artifactId>xxx</artifactId>
           <type>pom</type>
           <scope>import</scope>
		</dependency>

###聚合与继承
####聚合
Maven的聚合特性能够把项目的各个模块聚合在一起构建,而Maven的继承特性则能帮助抽取各模块相同的依赖和插件等配置。
只能聚合pom

pom元素

  • dependencyManagement

####继承
父模块的POM,其打包类型也必须为pom
哪些POM元素可以被继承:

  • groupId 项目组ID,项目坐标的核心元素
  • version 项目版本,项目坐标的核心元素
  • description 项目的描述信息
  • organization:项目的组织信息
  • inceptionYear 项目的创始年份
  • url 项目的URL地址
  • developers 项目的开发者
  • contributions项目的贡献者信息
  • distributionManagement:项目的部署配置,只能够通过父子传递
  • issueManagement:项目的缺陷跟踪系统信息
  • ciManagement项目的持续集成系统系统信息
  • scm 项目的版本控制系统信息
  • maillingLists:项目的邮件列表信息
  • properties:自定义Maven属性
  • dependencies:项目的依赖配置
  • dependencyManagement:项目的依赖管理配置
  • repositories项目的仓库配置
  • build 包括项目的源码目录配置,输出目录配置,插件配置,插件管理配置等
  • reporting:包括项目的报告输出目录,报告插件配置等
  • pluginManagement:插件依赖管理配置,只能够通过父子传递
  • Maven提供的dependencyManagement元素既能让子模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活性。
    在dependencyManagement元素下的依赖声明不会引入实际的依赖
    ###依赖传递
    假如有Maven项目A,项目B依赖A,项目C依赖B。那么我们可以说 C依赖A。也就是说,依赖的关系为:C—>B—>A。
    那么我们执行项目C时,会自动把B、A都下载导入到C项目的jar包文件夹中。排除依赖使用exclusions

####去除包的依赖传递性

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.1.0</version>
    <configuration>
        <archive>
            <addMavenDescriptor>false</addMavenDescriptor>
        </archive>
    </configuration>
</plugin>

####依赖冲突与解决:
1、如果依赖路径的长度不同,则“短路优先”:

A—>B—>C—>D—>E—>X(version 0.0.1)

A—>F—>X(version 0.0.2)

则A依赖于X(version 0.0.2)。

2:依赖路径长度相同情况下,则“先声明优先”:

A—>E—>X(version 0.0.1)

A—>F—>X(version 0.0.2)

则在项目A的<depencies></depencies>中,E、F那个在先则A依赖哪条路径的X。

##动态配置文件

<profiles>
        <profile>
            <!-- 本地开发环境 -->
            <id>dev</id>
            <!--默认激活-->
            <activeByDefault>true</activeByDefault>
            <properties>
                <profiles.active>dev</profiles.active>
            </properties>
            <activation>
                <!-- 设置默认激活这个配置 -->
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <!-- 发布环境 -->
            <id>release</id>
            <properties>
                <profiles.active>release</profiles.active>
            </properties>
        </profile>
        <profile>
            <!-- 测试环境 -->
            <id>beta</id>
            <properties>
                <profiles.active>beta</profiles.active>
            </properties>
        </profile>
    </profiles> 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值