我们都知道,Maven
是一款项目构建管理和依赖管理的工具,但事实上这只是 Maven
的一部分功能,Maven
本身的产品定位是一款项目管理工具。
下面是 spring-boot-starter
的 POM
文件,可以看到:除了熟悉的GAV
坐标标签、dependencies
标签,还有 description
、url
、organization
、licenses
、developers
、scm
、issueManagement
等这些描述项目信息的标签。
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.5.6</version>
<name>spring-boot-starter</name>
<description>Core starter, including auto-configuration support, logging and YAML</description>
<url>https://spring.io/projects/spring-boot</url>
<organization>
<name>Pivotal Software, Inc.</name>
<url>https://spring.io</url>
</organization>
<licenses>
<license>
<name>Apache License, Version 2.0</name>
<url>https://www.apache.org/licenses/LICENSE-2.0</url>
</license>
</licenses>
<developers>
<developer>
<name>Pivotal</name>
<email>[email protected]</email>
<organization>Pivotal Software, Inc.</organization>
<organizationUrl>https://www.spring.io</organizationUrl>
</developer>
</developers>
<scm>
<connection>scm:git:git://github.com/spring-projects/spring-boot.git</connection>
<developerConnection>scm:git:ssh://[email protected]/spring-projects/spring-boot.git</developerConnection>
<url>https://github.com/spring-projects/spring-boot</url>
</scm>
<issueManagement>
<system>GitHub</system>
<url>https://github.com/spring-projects/spring-boot/issues</url>
</issueManagement>
<dependencies>
<dependency>
……
</dependency>
</dependencies>
</project>
从项目管理的角度来看,Maven
提供了如下这些功能:
POM
):将整个项目本身抽象、封装为应用程序中的一个对象,以便于管理和操作。Maven
对整个构建过程进行封装之后,程序员只需要指定配置信息即可完成构建。Maven
提供的标准框架体系内,所有的构件都可以按照统一的规范生成和使用。Maven
定义了构件之间的三种基本关系,让大型应用系统可以使用 Maven
来进行管理
Maven
定义了依赖的范围、依赖的传递、依赖的排除、版本仲裁机制等一系列规范和标准,让大型项目可以有序容纳数百甚至更多依赖Maven
核心程序定义抽象的生命周期,然后将插件的目标绑定到生命周期中的特定阶段,实现了标准和具体实现解耦合,让 Maven
程序极具扩展性POM
中声明项目描述信息,更可以将整个项目相关信息收集起来生成 HTML 页面组成的一个可以直接访问的站点。这些项目描述信息包括:
issue
管理信息SCM
信息该标签用来在根pom
中管理jar
包版本,如果后面的jar
包没有申明版本,会以这里面的版本为主,使用该标签并不会引入jar
包,一般是在父级pom
文件申明,方便管理jar
包版本
在实际使用 Maven
的过程中,会发现 build
标签有时候有,有时候没,这是怎么回事呢?其实通过有效 POM
我们能够看到,build
标签的相关配置其实一直都在,只是在我们需要定制构建过程的时候才会通过配置 build
标签覆盖默认值或补充配置。这一点我们可以通过打印有效 POM
来看到。
完整 build 标签示例在文章末尾,从中能够看到,build
标签的子标签大致包含三个主体部分:
参考附录中的如下部分:
<sourceDirectory>D:\idea\maven-test\src\main\java</sourceDirectory>
<scriptSourceDirectory>D:\idea\maven-test\src\main\scripts</scriptSourceDirectory>
<testSourceDirectory>D:\idea\maven-test\src\test\java</testSourceDirectory>
<outputDirectory>D:\idea\maven-test\target\classes</outputDirectory>
<testOutputDirectory>D:\idea\maven-test\target\test-classes</testOutputDirectory>
<resources>
<resource>
<directory>D:\idea\maven-test\src\main\resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>D:\idea\maven-test\src\test\resources</directory>
</testResource>
</testResources>
<directory>D:\idea\maven-test\target</directory>
能看到各个目录的作用如下:
目录名 | 作用 |
---|---|
sourceDirectory |
主体源程序存放目录 |
scriptSourceDirectory |
脚本源程序存放目录 |
testSourceDirectory |
测试源程序存放目录 |
outputDirectory |
主体源程序编译结果输出目录 |
testOutputDirectory |
测试源程序编译结果输出目录 |
resources |
主体资源文件存放目录 |
testResources |
测试资源文件存放目录 |
directory |
构建结果输出目录 |
pluginManagement
标签存放着几个极少用到的插件:
maven-antrun-plugin
maven-assembly-plugin
maven-dependency-plugin
maven-release-plugin
通过 pluginManagement
标签管理起来的插件就像 dependencyManagement
一样,子工程使用时可以省略版本号,起到在父工程中统一管理版本的效果,看下面例子:
spring-boot-dependencies
管理的插件信息:<build>
<pluginManagement>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.6.2</version>
</plugin>
</pluginManagement>
</build>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
plugins
标签存放的是默认生命周期中实际会用到的插件,这些插件应该都不陌生,所以抛开插件本身不谈,来看看 plugin
标签的结构:
<plugin>
<artifactId>maven-compiler-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
标签,execution
标签内:
id
:指定唯一标识phase
:关联的生命周期阶段goals/goal
:关联指定生命周期的目标
phase元素代表的是绑定的生命周期的阶段
goals元素代表插件的目标,插件是前面artifactId中定义好的,goals相当于该插件中的一个功能,该功能将在phase绑定的生命周期阶段执行
另外,插件目标的执行过程可以进行配置,例如 maven-site-plugin
插件的 site
目标:
<execution>
<id>default-site</id>
<phase>site</phase>
<goals>
<goal>site</goal>
</goals>
<configuration>
<outputDirectory>D:\idea\maven-test\target\site</outputDirectory>
<reportPlugins>
<reportPlugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-project-info-reports-plugin</artifactId>
</reportPlugin>
</reportPlugins>
</configuration>
</execution>
configuration
标签内进行配置时使用的标签是插件本身定义的。
结论:每个插件能够做哪些设置都是各个插件自己规定的。
可以在Maven
的配置文件中 settings.xml
中配置了 JDK
版本,那么将来把 Maven
工程部署都服务器上,脱离了settings.xml
配置,如何保证程序正常运行呢?思路就是直接把 JDK
版本信息告诉负责编译操作的 maven-compiler-plugin
插件,让它在构建过程中,按照指定的信息工作
为了测试对maven-compiler-plugin
插件进行配置的效果,暂时取消配置文件settings.xml
中的 profile
配置。
<!-- 配置Maven工程的默认JDK版本 -->
<!-- <profile>
<id>jdk-1.8</id>
<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> -->
很明显这里用到了 Lambda
表达式,这是 JDK 1.8
才支持的语法
package com.scorpios.maven;
public class Hello {
public void hello() {
new Thread(()->{
System.out.println("thread ...");
}).start();
}
}
<!-- build 标签:意思是告诉 Maven,你的构建行为,我要开始定制了! -->
<build>
<!-- plugins 标签:Maven 你给我听好了,你给我构建的时候要用到这些插件! -->
<plugins>
<!-- plugin 标签:这是我要指定的一个具体的插件 -->
<plugin>
<!-- 插件的坐标。此处引用的 maven-compiler-plugin 插件不是第三方的,是一个 Maven 自带的插件。 -->
<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>
settings.xml
中配置:仅在本地生效,如果脱离当前 settings.xml
能够覆盖的范围,则无法生效Maven
工程 pom.xml
中配置:无论在哪个环境执行编译等构建操作都有效调用 Java
编译器命令时传入的-source
参数。那对编译器来说,-source
参数是啥意思呢?
『提供与指定发行版的源兼容性』这句话理解是:
这个功能还可以通过在 properties
标签中配置 maven.compiler.source
属性来实现。所以也经常会看到类似这样的配置:
<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>
</properties>
调用 Java
编译器命令时传入的-target
参数。那对编译器来说,-target
参数是啥意思呢?
『生成特定 VM
版本的类文件』这句话理解是:
VM
指 JVM
*.class
字节码文件 *.class
字节码文件要符合指定的 JVM
版本很显然 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
封装好了,所以配置非常简单,提供插件坐标即可。
<!-- build 标签:用来配置对构建过程的定制 -->
<build>
<!-- plugins 标签:定制化构建过程中所使用到的插件 -->
<plugins>
<!-- plugin 标签:一个具体插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.5.5</version>
</plugin>
</plugins>
</build>
目标名称 | 作用 |
---|---|
spring-boot:build-image | 使用构建包将应用程序打包到OCI映像中 |
spring-boot:build-info | 生成Actuator使用的构建信息文件build-info.properties |
spring-boot:help | 配置pom.xml文件 |
spring-boot:repackage | 默认goal。在mvn package之后,再次打包可执行的jar/war,同时保留mvn package生成的jar/war为.origin |
spring-boot:run | 运行Spring Boot应用 |
spring-boot:start | 在mvn integration-test阶段,进行Spring Boot应用生命周期的管理 |
spring-boot:stop | 在mvn integration-test阶段,进行Spring Boot应用生命周期的管理 |
使用 Mybatis
的逆向工程需要使用如下配置,MBG
插件的特点是需要提供插件所需的依赖:
<!-- 控制 Maven 在构建过程中相关配置 -->
<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>
通常需要用到 build
标签的时候底层都会封装好,需要自己配置的地方不多。即使有些地方需要自己配置,也不会真的需要自己去写,把现成的案例复制过来就行。
<build>
<!--约定的目录结构-->
<sourceDirectory>D:\idea\maven-test\src\main\java</sourceDirectory>
<scriptSourceDirectory>D:\idea\maven-test\src\main\scripts</scriptSourceDirectory>
<testSourceDirectory>D:\idea\maven-test\src\test\java</testSourceDirectory>
<outputDirectory>D:\idea\maven-test\target\classes</outputDirectory>
<testOutputDirectory>D:\idea\maven-test\target\test-classes</testOutputDirectory>
<resources>
<resource>
<directory>D:\idea\maven-test\src\main\resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>D:\idea\maven-test\src\test\resources</directory>
</testResource>
</testResources>
<directory>D:\idea\maven-test\target</directory>
<finalName>maven-test-1.0-SNAPSHOT</finalName>
<!--备用插件管理-->
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.3</version>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-5</version>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.8</version>
</plugin>
<plugin>
<artifactId>maven-release-plugin</artifactId>
<version>2.5.3</version>
</plugin>
</plugins>
</pluginManagement>
<!--生命周期插件-->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>2.5</version>
<executions>
<execution>
<id>default-clean</id>
<phase>clean</phase>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>default-testResources</id>
<phase>process-test-resources</phase>
<goals>
<goal>testResources</goal>
</goals>
</execution>
<execution>
<id>default-resources</id>
<phase>process-resources</phase>
<goals>
<goal>resources</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<id>default-jar</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compiler-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>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12.4</version>
<executions>
<execution>
<id>default-test</id>
<phase>test</phase>
<goals>
<goal>test</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<id>default-install</id>
<phase>install</phase>
<goals>
<goal>install</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.7</version>
<executions>
<execution>
<id>default-deploy</id>
<phase>deploy</phase>
<goals>
<goal>deploy</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.3</version>
<executions>
<execution>
<id>default-site</id>
<phase>site</phase>
<goals>
<goal>site</goal>
</goals>
<configuration>
<outputDirectory>D:\idea\maven-test\target\site</outputDirectory>
<reportPlugins>
<reportPlugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-project-info-reports-plugin</artifactId>
</reportPlugin>
</reportPlugins>
</configuration>
</execution>
<execution>
<id>default-deploy</id>
<phase>site-deploy</phase>
<goals>
<goal>deploy</goal>
</goals>
<configuration>
<outputDirectory>D:\idea\maven-test\target\site</outputDirectory>
<reportPlugins>
<reportPlugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-project-info-reports-plugin</artifactId>
</reportPlugin>
</reportPlugins>
</configuration>
</execution>
</executions>
<configuration>
<outputDirectory>D:\idea\maven-test\target\site</outputDirectory>
<reportPlugins>
<reportPlugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-project-info-reports-plugin</artifactId>
</reportPlugin>
</reportPlugins>
</configuration>
</plugin>
</plugins>
</build>
文章浏览阅读569次。package com.itheima.tfy.web.servlet;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.List;import javax.ser..._servletfileupload.ismultipartcontent(
文章浏览阅读722次。在 jsp页面加上这句话:<%@page isELIgnored="false" %>_jsp里${a_list}失效,但是${13%2}有效
文章浏览阅读2.4k次,点赞4次,收藏46次。4 PCB设计1.边框及板层设定2.导入网络表到PCB3.布线规则设定4.元器件布局5.布线及补泪滴6.覆铜7.设计规则及DRC检验8.打印设置及拼板9.生成加工文件4.1 怎样创建PCB文件右击工程,添加PCB文件4.2 怎样设置PCB图纸的参数4.3 怎样设定PCB边界及板层先选定机械层,然后划线,定点,然后双击线条,更改长度黑框框看起来不好看,可以先选中图形,然后点击“design”边角太尖,如何画圆弧现将线的两端减小,然后选择圆弧其他个角,复制粘贴
文章浏览阅读702次。paused 规定动画。matrix3d(n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n) 定义 3D转换,使用 16 个值的 4x4 矩阵。ease-in-out 规定以慢速开始和结束的过渡效果 (等于cubic-bezier(0.42,0,0.58,1))。ease-in-out 规定以慢速开始和结束的过渡效果 (等于cubic-bezier(0.42,0,0.58,1))。ease-out 规定以慢速结束的过渡效果 (等于 cubic-bezier(0,0,0.58,1))。_html渐变重复
文章浏览阅读107次。#!/usr/bin/Rscriptlibrary(survival)library(limma)file.create("survive.txt")#filestumors for (tumor in tumors){exp_file #read in filesrna=read.table(exp_file,header=TRUE,row.names=1,sep="t",stringsAsFa..._days_to_new_tumor_event_additional_sur
文章浏览阅读3.1k次。嵌入式UI架构设计漫谈_嵌入式ui设计
文章浏览阅读1.8w次,点赞62次,收藏305次。Ctrl快捷键 介绍Ctrl + F 在当前文件进行文本查找 (必备)Ctrl + R 在当前文件进行文本替换 (必备)Ctrl + Z 撤销 (必备)Ctrl + Y 删除光标所在行 或 删除选中的行 (必备)Ctrl + X 剪切光标所在行 或 剪切选择内容Ctrl + C 复制光标所在行 或 复制选择内容Ctrl + D 复制光标所在行 或 复制选择内容,并把复制内容插入光标位置下面 (必备)Ctrl + W 递进式选择代码块。可选中光标所在的单词或段落,连续按会在原有选中的基础上再_java快捷键
文章浏览阅读4.7k次,点赞2次,收藏17次。最近Bootstrap有点让我糊涂,在使用过程中,下拉菜单(dropdown)、按钮组(btn-group)、导航元素(nav)、导航栏(navbar)容易混淆,遂用闲暇时间琢磨琢磨(本文基于Bootstrap3)。这几者个人理解有点递进的意思:下拉菜单(dropdown)可以用在后3个中,组合起来可以称呼为:“按钮下拉菜单”或“导航下拉菜单”;按钮与导航之间没有“合作使用”价值,所以..._导航栏navbardown作用
文章浏览阅读151次。更多视频,JAVA收徒QQ:9871158853.全套JAVA教程--JavaEE必备 Git&GitHUP视频教程 视频.zip 资料.zip Hibernate视频教程 1. _Hibernate_概述&安装 Hibernatetools 插件.wmv 10. _Hibernate_详解 Hibernate 映射文件(2).wmv ._deferredresult源码分析视频教程
文章浏览阅读2.3k次。在学习C语言函数指针的过程中,我发现了函数的参数列的一些问题:无论参数部分是否填入类型,编译均可通过。查阅资料后发现C语言中有两种函数参数风格:ANSI和K&R。ANSI是我们所学习的风格;K&R则是老式的,是编写Linux内核所使用的风格。int foo(void) 还有 int foo(int a, int b)就是ANSI风格的。它的特点是参数都有类型..._r&k风格
文章浏览阅读532次,点赞3次,收藏2次。tictoc6.ned文件simple Txc6{ parameters: @display("i=block/routing"); gates: input in; output out;}network Tictoc6{ submodules: tic: Txc6 { parameters: @display("i=,cyan"); _tictoc6实例讲解
文章浏览阅读447次。因为工作中需要查看byte[]原始编码,eclipse中debug模式下默认查看byte使用10进制显示,上网查找发现配置为16进制(Hex)显示的办法,记录下来备忘 在debug模式试图下,Variables试图窗内 View Menu->Java Preferences...在打开的对话框中Primative Display Options中选中Display hexadecimal v..._otdebug里面都是 16进制么