maven之pom深入

maven是一款(构建管理)和(依赖管理)的工具。
Maven本身定位是一款(项目管理工具)

有效pom翻译为effective POM,在pom的继承关系中,子pom可以覆盖父pom中的配置;如果子pom没有覆盖,那么父pom中的配置将会被继承。按照这个规则,继承关系中的所有pom叠加到一起,就生成一个最终生效的pom。显然maven实际运行的过程中,执行构建操作是按照这个最终生成的pom运行起来的。

运行有效pom的命令:

mvn help:effective-pom

我们使用和配置的POM其实大致是由四个层次组成的:

1、超级Pom:所有POM默认继承,只是直接和间接之分
2、父POM:这一层可能没有,可能有一层,也可能有很多层
3、当前pom.xml配置的POM:我们最多关注和最多使用的一层
4、有效POM:隐含的一层,但是实际真正生效的一层 

POM的声明和引用:

 

使用help:evalute查看属性值
定义属性
<properties>
   <com.atguigu.hello>good morning maven</com.atguigu.hello>
</properties>

运行命令:

mvn help:evalute

通过Maven访问系统属性
1、java系统属性一览

Properties properties=System.getProperties();
Set<Object> propNameSet = properties.keySet();
for(Object propName : propNameSet){
    String propValue = properties.getProperty((String)propName);
    System.out.print(propName + "="+propValue);
}

运行结果:

java.runtime.name=Java(TM) SE Runtime Environment
	sun.boot.library.path=C:\Program Files\Java\jdk1.8.0_131\jre\bin
	java.vm.version=25.131-b11
	java.vm.vendor=Oracle Corporation
	java.vendor.url=http://java.oracle.com/
	path.separator=;
	java.vm.name=Java HotSpot(TM) 64-Bit Server VM
	file.encoding.pkg=sun.io
	user.country=CN
	user.script=
	sun.java.launcher=SUN_STANDARD
	sun.os.patch.level=
	java.vm.specification.name=Java Virtual Machine Specification
	user.dir=E:\workplace\demo1
	java.runtime.version=1.8.0_131-b11
	java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment
	java.endorsed.dirs=C:\Program Files\Java\jdk1.8.0_131\jre\lib\endorsed
	os.arch=amd64
	java.io.tmpdir=C:\WINDOWS\TEMP\
	line.separator=

	java.vm.specification.vendor=Oracle Corporation
	user.variant=
	os.name=Windows 10
	sun.jnu.encoding=GBK
	java.library.path=C:\Program Files\Java\jdk1.8.0_131\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;F:\硬件开发工具\vmware\bin\;C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;C:\Program Files\Java\jdk1.8.0_131\bin;C:\Program Files\Java\jdk1.8.0_131\jre\bin;C:\Program Files\Git\cmd;F:\开发工具\apache-maven-3.5.2\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;F:\开发工具\py3.9\;F:\开发工具\py3.9\Scripts\;C:\Program Files\Graphviz\bin;F:\开发工具\node.js\;F:\filnk_package\hadoop-2.10.1\bin;F:\开发工具\py3.9\Scripts\;F:\开发工具\py3.9\;F:\硬件开发工具\ffmpeg-N-101988-g988f2e9eb0-win64-gpl-shared\bin;C:\ProgramData\Anaconda3\Scripts;C:\Program Files\Graphviz\bin;C:\Users\思尔\AppData\Roaming\npm;F:\Flink需要的软件包\SSHSecureShellClient-3.2.9\install;.
	java.specification.name=Java Platform API Specification
	java.class.version=52.0
	sun.management.compiler=HotSpot 64-Bit Tiered Compilers
	os.version=10.0
	user.home=C:\Users\思尔
	user.timezone=
	java.awt.printerjob=sun.awt.windows.WPrinterJob
	file.encoding=UTF-8
	java.specification.version=1.8
	java.class.path=C:\Program Files\Java\jdk1.8.0_131\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\rt.jar;E:\workplace\demo1\target\classes;C:\Users\思尔\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.6.6\spring-boot-starter-web-2.6.6.jar;C:\Users\思尔\.m2\repository\org\springframework\boot\spring-boot-starter\2.6.6\spring-boot-starter-2.6.6.jar;C:\Users\思尔\.m2\repository\org\springframework\boot\spring-boot\2.6.6\spring-boot-2.6.6.jar;C:\Users\思尔\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.6.6\spring-boot-autoconfigure-2.6.6.jar;C:\Users\思尔\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.6.6\spring-boot-starter-logging-2.6.6.jar;C:\Users\思尔\.m2\repository\ch\qos\logback\logback-classic\1.2.11\logback-classic-1.2.11.jar;C:\Users\思尔\.m2\repository\ch\qos\logback\logback-core\1.2.11\logback-core-1.2.11.jar;C:\Users\思尔\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.17.2\log4j-to-slf4j-2.17.2.jar;C:\Users\思尔\.m2\repository\org\apache\logging\log4j\log4j-api\2.17.2\log4j-api-2.17.2.jar;C:\Users\思尔\.m2\repository\org\slf4j\jul-to-slf4j\1.7.36\jul-to-slf4j-1.7.36.jar;C:\Users\思尔\.m2\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;C:\Users\思尔\.m2\repository\org\yaml\snakeyaml\1.29\snakeyaml-1.29.jar;C:\Users\思尔\.m2\repository\org\springframework\boot\spring-boot-starter-json\2.6.6\spring-boot-starter-json-2.6.6.jar;C:\Users\思尔\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.13.2.2\jackson-databind-2.13.2.2.jar;C:\Users\思尔\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.13.2\jackson-annotations-2.13.2.jar;C:\Users\思尔\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.13.2\jackson-core-2.13.2.jar;C:\Users\思尔\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.13.2\jackson-datatype-jdk8-2.13.2.jar;C:\Users\思尔\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.13.2\jackson-datatype-jsr310-2.13.2.jar;C:\Users\思尔\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.13.2\jackson-module-parameter-names-2.13.2.jar;C:\Users\思尔\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\2.6.6\spring-boot-starter-tomcat-2.6.6.jar;C:\Users\思尔\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.60\tomcat-embed-core-9.0.60.jar;C:\Users\思尔\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.60\tomcat-embed-el-9.0.60.jar;C:\Users\思尔\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.60\tomcat-embed-websocket-9.0.60.jar;C:\Users\思尔\.m2\repository\org\springframework\spring-web\5.3.18\spring-web-5.3.18.jar;C:\Users\思尔\.m2\repository\org\springframework\spring-beans\5.3.18\spring-beans-5.3.18.jar;C:\Users\思尔\.m2\repository\org\springframework\spring-webmvc\5.3.18\spring-webmvc-5.3.18.jar;C:\Users\思尔\.m2\repository\org\springframework\spring-aop\5.3.18\spring-aop-5.3.18.jar;C:\Users\思尔\.m2\repository\org\springframework\spring-context\5.3.18\spring-context-5.3.18.jar;C:\Users\思尔\.m2\repository\org\springframework\spring-expression\5.3.18\spring-expression-5.3.18.jar;C:\Users\思尔\.m2\repository\org\slf4j\slf4j-api\1.7.36\slf4j-api-1.7.36.jar;C:\Users\思尔\.m2\repository\org\springframework\spring-core\5.3.18\spring-core-5.3.18.jar;C:\Users\思尔\.m2\repository\org\springframework\spring-jcl\5.3.18\spring-jcl-5.3.18.jar;F:\开发工具\idea\IntelliJ IDEA 2017.2.6\lib\idea_rt.jar
	user.name=思尔
	java.vm.specification.version=1.8
	sun.java.command=com.example.demo1.ceta
	java.home=C:\Program Files\Java\jdk1.8.0_131\jre
	sun.arch.data.model=64
	user.language=zh
	java.specification.vendor=Oracle Corporation
	awt.toolkit=sun.awt.windows.WToolkit
	java.vm.info=mixed mode
	java.version=1.8.0_131
	java.ext.dirs=C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext
	sun.boot.class.path=C:\Program Files\Java\jdk1.8.0_131\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\rt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\sunrsasign.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_131\jre\classes
	java.vendor=Oracle Corporation
	file.separator=\
	java.vendor.url.bug=http://bugreport.sun.com/bugreport/
	sun.io.unicode.encoding=UnicodeLittle
	sun.cpu.endian=little
	sun.desktop=windows
	sun.cpu.isalist=amd64

 2、maven访问系统属性

 

访问project属性:


1、使用表达式${project.xxx}可以访问当前POM中的元素

2、访问一级标签
${project.标签名}

访问系统环境变量: 

 

 

7、用途
在当前pom.xml文件中用用属性
资源过滤功能:在非Maven配置文件中引用属性,由Maven在处理资源时将引用属性表达式替换为属性值 

build标签详解:
本质上来说:我们配置的build标签都是对超级POM的配置的叠加。我们为什么要在默认的基础上叠加呢?很简单在默认标签无法满足的时候定制构建过程。

build标签组成大概三个部分:
1、定义约定的目录结构

 2、备用插件管理

pluginManagement标签存放着几个极少用到的插件:
maven-antrun-plugin
maven-assembly-plugin
maven-dependency-plugin
maven-release-plugin

 被springboot-dependenciens管理的插件

<plugin>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

 子工程使用的插件管理:

<!--build 标签:用来配置对构建过程的定制-->
<build>
   <!--plugins 标签:定制化构建过程中所使用到的插件-->
   <plugins>
      <!--plugin标签:一个具体插件-->
      <plugin>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
   </plugins>
</build>

生命周期插件:

<plugin>
   <artifactId>maven-cpmpiler-plugin</artifactId>
             <version>3.1</version>
   <executions>
      <execution>
         <id>default-compile</id>
         <phase>compile</phase>
         <goals>
            <goal>
               compile
            </goal>
         </goals>

      </execution>
      <execution>
         <id>default-testCompile</id>
         <phase>test-compile</phase>
         <goals>
            <goal>
               testCompile
            </goal>
         </goals>
      </execution>
   </executions>
</plugin>

坐标部分


artifactId和version标签定义了插件的坐标,作为Maven的自带插件这里省略了groupId

执行部分


executions标签内可以配置多个execution标签,executions标签内:
id:指定唯一标识
phase:关联生命周期阶段
goals/goal:关联指定生命周期的目标

     可以配置多个goal标签,表示一个生命周期可以对应多个目标
 

 

build标签典型应用,指定jdk版本
我们子啊settings.xml中配置了JDK版本,那么将来把Maven工程部书到服务器上,脱离settings.xml配置,如何保证正常运行,我们的思路就是直接把JDK版本信息高速maven-compiler-plugin插件,让他在构建过程中,按照我们指定的信息工作。

我们先取消settings.xml配置

<!--build 标签:用来配置对构建过程的定制-->
<build>
   <!--plugins 标签:定制化构建过程中所使用到的插件-->
   <plugins>
      <!--plugin标签:一个具体插件-->
      <plugin>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>


      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-compiler-plugin</artifactId>
         <version>3.1</version>
                <!--configuration标签:配置maven-compiler-plugin插件-->
         <configuration>
            <!--具体配置信息会因为插件不同、需求不同而有所差异-->
            <source>1.8</source>
            <target>1.8</target>
            <encoding>UTF-8</encoding>
         </configuration>
      </plugin>
   </plugins>


</build> 

也可以通过peoperty来设定

<properties>
   <maven.compiler.source>1.8</maven.compiler.source>
   <maven.compiler.target>1.8</maven.compiler.target>
   <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   <java.version>8</java.version>
</properties>

build应用springboot定制化打包 :

需求:
很显然spring-boot-maven-plugin并不是Maven自带的插件,而是SpringBoot提供的,用来改变Maven默认时构建行为。具体来说是改变打包行为。
默认情况下Maven调用maven-jar-plugin插件的jar目标,生成普通的jar包。
普通的jar包没办法使用 java -jar xxx.jar这样的命令来启动、运行,但是SpringBoot设计理念就是每一个(为服务到处一个jar包,这个jar包可以使用java -jar xxx.jar这样的命令来直接启动运行)。这样一来,打包的方式肯定要进行调整。所以SpringBoot提供了spring-boot-maven-plugin这个插件来定制打包行为。

springboot打包插件: 

<!--plugins 标签:定制化构建过程中所使用到的插件-->
<plugins>
   <!--plugin标签:一个具体插件-->
   <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
   </plugin>

 </plugins>

七个插件目标:

 

我们所使用的就是spring-boot-repackage

build的另外一个列子就是mybatis的逆向工程:

 

<build>
    <plugins>
        <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.3.0</version>


            <dependencies>
                <!--逆向工程核心-->
                <dependency>
                    <groupId>org.mybatis.generator</groupId>
                    <artifactId>mybatis-generator-core</artifactId>
                    <version>1.3.2</version>
                </dependency>
                <!--数据库连接池-->
                <dependency>
                    <groupId>com.mchange</groupId>
                    <artifactId>c3p0</artifactId>
                    <version>0.9.2</version>
                </dependency>
                <!--Mysql驱动-->
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>5.1.8</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

 依赖配置补充:

import:
管理依赖最基本的办法就是继承父工程,但是和java类一样,maven也是单继承。如果不同体系的依赖信息封装在不同的POM中,没办法继承多个父工程杂么办?这时可以使用import依赖范围。

典型案例就是项目中引入SpringBoot、SpringCloud依赖:

<dependencyManagement>
    <dependencies>
        <!--springCloud的依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Hoxton.SR9</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!--SpringCloud Alibab 依赖导入-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.2.6.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

import依赖范围使用要求:
打包类型必须是pom
必须放在dependencyManagement中

system
以Windows系统环境开发为例,假设现在D:tempare\huitao-test-1.0-SNAPSHOT.jar想要引入到我们的项目中,此时我们就可以将依赖配置为system范围: 

<dependency>
<groupId>com.huitao.maven</groupId>
<artifactId>huitao-test</artifactId>
<version>1.0-SNAPSHOT</version>
<systemPath>D:tempare\huitao-test-1.0-SNAPSHOT.jar</systemPath>
<scope>system</scope>
</dependency>

这样引入不具备可移植性,不建议使用。

runtime
专门用于编译时不需要,但是运行时需要的jar包。比如:编译时我们根据接口调用的方法,但是实际运行时需要的是接口的实现类。典型案例是: 热部署依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>

 optional解释:可选的

 版本仲裁:

 自定义插件流程:

1、创建工程
2、设定打包方式
<packaging>maven-plugin</packaging>
3、引入依赖(二选一)

一、文档注释中使用注解

<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-pllugin-api</artifactId>
<version>3.5.2</version>
</dependency>

二、将来直接使用注解

<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-pllugin-annotations</artifactId>
<version>3.5.2</version>
</dependency> 

安装插件:
要在后续使用插件,就必须至少将插件安装到本地仓库

注册插件
我们需要将插件坐标中的groupId部分注册到settings.xml中

<pluginGroups>

<pluginGroup>com.huitao.spring</pluginGroup>

</pluginGroups> 

自定义插件:

<!--配置使用自定义标签-->
<build>
    <plugins>
        <plugin>
            <groupId>com.atguigu.maven</groupId>
            <artifactId>hello-maven-plugin</artifactId>
            <version>1.0-SNAPSHOT</version>
            <executions>
                <execution>
                    <id>hello-plugin</id>
                    <phase>validate</phase>
                    <goals>
                        <goal>
                            SayHello
                        </goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SSM三层架构是指在Java Web开发中,使用Spring+SpringMVC+MyBatis组合实现的一种三层架构模式,其中: - Spring作为整个应用的基础框架,负责管理整个应用的Bean、事务、AOP等。 - SpringMVC作为Web层的框架,负责处理HTTP请求和响应,以及控制器和视图的管理。 - MyBatis作为持久层的框架,负责数据库的操作和数据的存取。 下面是SSM三层架构的实现过程: 1. 搭建项目结构 在Eclipse或者IDEA中创建一个Maven项目,选择Web项目,然后将Spring、SpringMVC和MyBatis的依赖加入到pom.xml文件中。 2. 配置Spring 在Spring配置文件中,定义需要注入的Bean和数据源等信息。Spring主要负责管理整个应用的Bean、事务、AOP等。 3. 配置SpringMVC 在SpringMVC配置文件中,定义控制层的Bean和视图解析器等信息。SpringMVC主要负责处理HTTP请求和响应,以及控制器和视图的管理。 4. 配置MyBatis 在MyBatis配置文件中,定义数据库连接池、数据源、Mapper配置文件的位置等信息。MyBatis主要负责数据库的操作和数据的存取。 5. 实现业务逻辑 在Service层实现业务逻辑,操作Model层的数据,并将结果返回给Controller层。 6. 实现控制器 在Controller层实现控制器,接收HTTP请求,调用Service层的业务逻辑,将结果封装成Model层的数据,最后返回视图信息。 7. 实现视图 在JSP或者HTML页面中,使用EL表达式或JSTL标签等方式获取Controller层返回的Model数据,并展示在页面上。 以上就是SSM三层架构的实现过程,通过使用Spring、SpringMVC和MyBatis三个框架,将整个应用划分为View、Controller、Service和Dao四个层次,实现了代码的分层和解耦。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值