Python 官方文档:入门教程 => 点击学习
Maven使用说明及规范 此文档主要说明Maven的基础使用方式,以及在使用过程过程中需要遵守哪些默认的准则。 我们工作中会经常写maven的配置,但是很多maven使用细节你可能并
此文档主要说明Maven的基础使用方式,以及在使用过程过程中需要遵守哪些默认的准则。
我们工作中会经常写maven的配置,但是很多maven使用细节你可能并不知道,但你掌握后使用maven会更加上手。
Apache Maven是一个软件项目管理工具。基于项目对象模型(POM)的概念,Maven可以通过一小段描述信息来管理项目的构建,报告和文档。
Maven的核心是一个插件执行框架, 所有工作都是通过插件完成的。
最熟悉的插件如我们比较常用的:
clean
compiler
install
deploy
除了这些默认流程的插件,我们针对Maven的工作机制也制作了自己的插件,如 授权系统抽取api.JSON文件的插件,如通过erm对象描述文件生成Entity实体的插件等。
定义pom模型的基本信息
使用Maven构建的项目,首先需要在pom.xml文件中写明基本信息,如:
<groupId>com.yudianbank.project</groupId> //组织ID
<artifactId>salesAppParent</artifactId>//工程名称
<packaging>pom</packaging>//打包方式,如:jar、war、pom、rar等
<version>1.0-RELEASES</version> //版本号
由groupId、artifactId、version三个元素定位唯一的jar信息,常说的发个Maven坐标也就是这三个元素
modules 节点,聚合子模块
在多模块的项目中使用,用来定义子模块,一般多模块项目中,父模块的packaging都定义为pom
<modules>
<module>api</module>
<module>producer</module>
</modules>
parent节点,继承其他pom模型的属性
如:在Spring Boot项目中,会有如下parent节点,用来继承spring boot已经定义好的pom
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
properties 节点,定义属性信息
这个节点一般用于定义一些属性,用来作为插件的默认值。在这里定义的属性可以贯穿Maven build的整个生命周期,Maven属性是值占位符,可以在pom中通过${XXX}符号来使用
<properties>
<spring-cloud.version>Dalston.SR3</spring-cloud.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<compiler.version>1.8</compiler.version>
<powermock.version>1.6.4</powermock.version>
<checkstyle.version>6.18</checkstyle.version>
</properties>
除了如上手动定义的一些属性,我们还可以通过如下的方式,访问到其他的一些变量,如:
env.X
: 使用“env.”对变量进行前缀。将返回shell的环境变量。例如,$ {env.PATH}包含PATH环境变量。 注意:虽然环境变量本身在windows上不区分大小写,但属性的查找区分大小写。换句话说,当Windows shell为%PATH%和%Path%返回相同的值时,Maven会区分$ {env.PATH}和$ {env.Path}。从Maven 2.1.0开始,为了可靠性,环境变量的名称被归一化为所有大写。project.x
: POM中的标记路径将包含相应元素的值。例如:<project> <version> 1.0 </ version> </ project>可通过$ {project.version}访问。settings.x
: Mavne Home路径的settings.xml将包含相应的元素的值。例如:<settings> <offline> false </ offline> </ settings>可通过$ {settings.offline}访问。dependencies 节点,定义项目依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
</dependency>
</dependencies>
除了基本的groupId、artifactId、version坐标属性外,dependency节点中还包括如下的常用属性设置
type
: 依赖的类型,默认是jarclassifier
: 分类器,额外的jar坐标标记,用来依赖那些从同一个POM中打出的不同的jar包。scope
: 依赖的jar的作用范围,可选(compile,runtime,test,system,provided)compile
: 这是默认范围。所有类路径中都提供了编译依赖项。此外,这些依赖项将传播到依赖项目runtime
: 这很像compile,但表示您希望jdk或容器在运行时提供它。它仅在编译和测试类路径中可用,并且不可传递。test
: 此范围表示正常使用应用程序不需要依赖项,并且仅适用于测试编译和执行阶段。它不是传递性的。provided
:这很像compile,但表示您希望JDK或容器在运行时提供它。它仅在编译和测试类路径中可用,并且不可传递。system
:此范围与provided的类似,只是您必须提供明确包含它的JAR,声明后不会在存储库中查找Systempath
:当scope为system生效,用于定义本地依赖的路径optional
:是否启用依赖传递,默认false需要依赖传递。如A依赖B,B依赖C,默认情况下A中会有C的依赖,如果在依赖B时设置optional为true,则A中不会有C的依赖exclusions
:排除依赖传递dependencies -> exclusions 节点,排除依赖传递
有时候为了解决项目依赖冲突,需要排除依赖的jar包通过Maven依赖传递特性引用的其他jar,如:
<dependency>
<groupId>com.yudianbank.public</groupId>
<artifactId>pdf</artifactId>
<version>1.1-RELEASES</version>
<exclusions>
<exclusion>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
</exclusion>
</exclusions>
</dependency>
关于Maven依赖传递特性,当出现多个jar依赖相同的不同版本jar时,遵循两个原则来引用:
dependencyManagement 节点,声明依赖项
dependencyManagement用来管理声明依赖项,最常见于spring boot项目中,在依赖节点只需要写groupId、artifactId就可以定位一个jar坐标,是因为spring boot的父pom中使用dependencyManagement声明了常用的依赖项,如:
<dependencyManagement>
<dependencies>
<!-- Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot</artifactId>
<version>1.5.7.RELEASE</version>
</dependency>
.......
</dependencies>
</dependencyManagement>
使用dependencyManagement管理的依赖只是声明了,如果没有显示的定义在< dependencies >节点中是不生效的
profiles -> profile 节点,定义不同环境的构建属性
在软件项目迭代中,通常会有开发、测试、生产等不同的运行环境。很多时候不同的环境需要不同的依赖属性,诸如此场景,都可以使用profiles来定义不同环境下的变量,如:
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!--销售平台 api版本-->
<sales.api.version>1.0-SNAPSHOT</sales.api.version>
<!--本地日志存储地址-->
<logging.path>${basedir}/target/logs</logging.path>
</properties>
</profile>
<profile>
<id>uat</id>
<properties>
<sales.api.version>1.0-SNAPSHOT</sales.api.version>
<logging.path>/data/logs/${appName}</logging.path>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<sales.api.version>1.0-RELEASES</sales.api.version>
<logging.path>/data/logs/${appName}</logging.path>
</properties>
</profile>
</profiles>
repositories、pluginRepositories 节点,定义依赖和插件的仓库地址
这里可以定义jar拉取的仓库地址,除了Apache中央仓库外,还有很多其他的开源仓库,如spring的,
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>Http://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<name>Central Repository</name>
<url>http://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
</pluginRepository>
</pluginRepositories>
build 节点,设置输入输出路径
为什么在使用Maven构建的项目中,项目编译后会在pom所在目录下生成target目录?是因为在build构建节点中有如下的默认的配置。
当然,如果你显示配置了如下的属性,就可以指定编译后文件的输出目录
<build>
<sourceDirectory>${basedir}/src/main/java</sourceDirectory>
<scriptSourceDirectory>${basedir}/src/main/scripts</scriptSourceDirectory>
<testSourceDirectory>${basedir}/src/test/java</testSourceDirectory>
<outputDirectory>${basedir}/target/classes</outputDirectory>
<testOutputDirectory>${basedir}/target/test-classes</testOutputDirectory>
...
</build>
build -> resources,定义项目资源
resources用来定义项目的资源路径,默认的路径为${basedir}/src/main/resources,在spring boot环境中,继承了spring boot的父pom属性,它的resources定义如下:
<resources>
<resource>
<directory>${basedir}/src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/application*.yml</include>
<include>**/application*.yaml</include>
<include>**/application*.properties</include>
</includes>
</resource>
<resource>
<directory>${basedir}/src/main/resources</directory>
<excludes>
<exclude>**/application*.yml</exclude>
<exclude>**/application*.yaml</exclude>
<exclude>**/application*.properties</exclude>
</excludes>
</resource>
</resources>
可以看到,spring boot中只定义了三种文件类型的资源,而且通配application开头的文件。
当项目中有其他的文件类型或不是application开头时,Maven就会过滤掉。
而且在spring boot中定义了属性占位符为@符号,所以在资源文件中使用${}时并不会生效。
为了解决这个问题,可以自己在pom中定义resources属性覆盖父pom的行为:如,
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**targetDISCLAIMER</exclude>
<exclude>**/licensesui-licensescodeStyle.xml</exclude>
<!-- IDE files -->
<exclude>**.idea*.classpath</exclude>
<exclude>**/.project</exclude>
<exclude>**/.settingsdependency-reduced-pom.xml</exclude>
<!-- UI IDE configs -->
<exclude>**/skywalking-ui/.editorconfig</exclude>
<!-- UI Compiler configs -->
<exclude>**/skywalking-ui/.webpackrc.js</exclude>
<exclude>**/skywalking-ui/.roadhogrc.mock.js</exclude>
<!-- UI Test configs -->
<exclude>**/skywalking-ui/jest.config.js</exclude>
<!-- UI style check files -->
<exclude>**/skywalking-ui/.eslintrc.js</exclude>
<exclude>**/skywalking-ui/.stylelintrc</exclude>
<exclude>**/skywalking-ui/.prettierignore</exclude>
<exclude>**/skywalking-ui/.prettierrc</exclude>
<!-- UI icon files -->
<exclude>**/skywalking-ui/public/font/iconfont.gitignore</exclude>
<exclude>**/.gitmodules</exclude>
<exclude>**/.git.travis.yml</exclude>
<!-- GitHub files -->
<exclude>**/.github*.md</exclude>
<excldue>***.txt</exclude>
<exclude>**/doCSSrc/test/resources/jsonskywalking-ui/node_modulesskywalking-ui/nodeskywalking-ui/distsrc/main/proto/Gogoproto/gogo.proto</exclude>
<exclude>**/src/main/proto/envoysrc/main/proto/google/protobufsrc/main/proto/prometheus/client_model/metrics.proto</exclude>
<exclude>**/src/main/proto/validate/validate.proto</exclude>
<!-- generated file from antlr -->
<exclude>**/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.tokens</exclude>
<!-- Maven Wrapper generated files -->
<exclude>.mvn/wrapper/maven-wrapper.properties</exclude>
</excludes>
</configuration>
<executions>
<execution>
<phase>verify</phase>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin.version}</version>
<configuration>
<source>${compiler.version}</source>
<target>${compiler.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>${maven-resource-plugin.version}</version>
<configuration>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>Docker-maven-plugin</artifactId>
<version>${docker.plugin.version}</version>
<configuration>
<skipDocker>true</skipDocker>
</configuration>
</plugin>
<plugin>
<!-- 源码插件 -->
<artifactId>maven-source-plugin</artifactId>
<version>${maven-source-plugin.version}</version>
<!-- 发布时自动将源码同时发布的配置 -->
<executions>
<execution>
<id>attach-sources</id>
<phase>none</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>versions-maven-plugin</artifactId>
<version>${versions-maven-plugin.version}</version>
</plugin>
<plugin>
<groupId>org.eluder.coveralls</groupId>
<artifactId>coveralls-maven-plugin</artifactId>
<version>${coveralls-maven-plugin.version}</version>
<configuration>
<repoToken>xFwR2GqmxcMxV7tGEpW2NfwIrbCD4cQCS</repoToken>
<sourceDirectories>
<sourceDirectory>${project.build.sourceDirectory}</sourceDirectory>
</sourceDirectories>
</configuration>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>${jacoco-maven-plugin.version}</version>
<executions>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>${maven-checkstyle-plugin.version}</version>
<dependencies>
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-checkstyle</artifactId>
<version>5.0.0-beta</version>
</dependency>
<dependency>
<groupId>com.puppycrawl.tools</groupId>
<artifactId>checkstyle</artifactId>
<version>8.11</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>validate</id>
<phase>validate</phase>
<configuration>
<configLocation>skywalking/checkStyle.xml</configLocation>
<headerLocation>skywalking/CHECKSTYLE_HEAD</headerLocation>
<encoding>UTF-8</encoding>
<consoleOutput>true</consoleOutput>
<includeTestSourceDirectory>true</includeTestSourceDirectory>
<failsOnError>true</failsOnError>
<excludes>org.apache.skywalking.apm/network*.java,
org.apache.skywalking.apm/collector/remote/grpc*.java,
org.apache.skywalking.apm/agent/core/context/ids/base64/*.java
</excludes>
</configuration>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。
--结束END--
本文标题: 关于Maven的使用,这些你都真的了解么
本文链接: https://lsjlt.com/news/129177.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0