Maven 使用教程(二)

一、如何创建JAR并将其安装在本地存储库中?

制作JAR文件非常简单,可以通过执行以下命令来完成:

mvn package

现在可以查看${project.basedir}/target目录,您将看到生成的JAR文件。
现在,您需要将生成的工件(JAR文件)安装在本地存储库中(${user.home}/.m2/repository是默认位置)。有关存储库的更多信息,您可以参考我们的存储库简介,但让我们继续安装我们的工件!为此,请执行以下命令:

mvn install

执行此命令时,您应该看到以下输出:

[INFO] Scanning for projects...
[INFO]
[INFO] ----------------------< com.mycompany.app:my-app >----------------------
[INFO] Building my-app 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:3.0.2:resources (default-resources) @ my-app ---
...
[INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ my-app ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:3.0.2:testResources (default-testResources) @ my-app ---
...
[INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) @ my-app ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.22.1:test (default-test) @ my-app ---
[INFO]
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.mycompany.app.AppTest
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.025 s - in com.mycompany.app.AppTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO]
[INFO] --- maven-jar-plugin:3.0.2:jar (default-jar) @ my-app ---
[INFO] Building jar: <dir>/my-app/target/my-app-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- maven-install-plugin:2.5.2:install (default-install) @ my-app ---
[INFO] Installing <dir>/my-app/target/my-app-1.0-SNAPSHOT.jar to <local-repository>/com/mycompany/app/my-app/1.0-SNAPSHOT/my-app-1.0-SNAPSHOT.jar
[INFO] Installing <dir>/my-app/pom.xml to <local-repository>/com/mycompany/app/my-app/1.0-SNAPSHOT/my-app-1.0-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.678 s
[INFO] Finished at: 2020-07-12T12:04:45+01:00
[INFO] ------------------------------------------------------------------------

请注意,surefire插件(执行测试)查找包含在具有特定命名约定的文件中的测试。默认情况下,包括的测试包括:

  • **/*Test.java
  • **/Test*.java
  • **/*TestCase.java

默认排除为:

  • **/Abstract*Test.java
  • **/Abstract*TestCase.java

您已经完成了设置、构建、测试、打包和安装典型Maven项目的过程。这很可能是项目使用Maven所做的绝大多数工作,如果您注意到了,到目前为止您所能做的一切都是由18行文件驱动的,即项目的模型或POM。如果您查看一个典型的Ant构建文件,该文件提供了我们迄今为止实现的相同功能,您会注意到它已经是POM的两倍,我们才刚刚开始!您可以从Maven获得更多的功能,而不需要像目前那样对POM进行任何添加。为了从示例Ant构建文件中获得更多功能,您必须不断添加容易出错的内容。

那么你还能免费得到什么呢?有许多Maven插件可以开箱即用,即使是像我们上面这样的简单POM。我们将在这里特别提到一个,因为它是Maven的一个非常宝贵的功能:在您的部分没有任何工作的情况下,这个POM有足够的信息来为您的项目生成一个网站!您很可能希望自定义Maven站点,但如果时间紧迫,则需要执行以下命令来提供有关项目的基本信息:

mvn site

 还有许多其他独立的目标也可以执行,例如:

mvn clean

这将在启动之前删除包含所有生成数据的目标目录,以便它是新的。

二、什么是快照(SNAPSHOT)版本?

请注意,下面所示的pom.xml文件中版本标记的值具有后缀:-SNAPSHOT。

<project xmlns="http://maven.apache.org/POM/4.0.0"...<groupId>...</groupId><artifactId>my-app</artifactId>...<version>1.0-SNAPSHOT</version><name>Maven Quick Start Archetype</name>...

SNAPSHOT值是指开发分支上的“最新”代码,并不能保证代码是稳定的或不变的。相反,“release”版本中的代码(没有后缀SNAPSHOT的任何版本值)是不变的。
换句话说,SNAPSHOT版本是最终“发布”版本之前的“开发”版本。SNAPSHOT比其版本“旧”。
在发布过程中,x.y-SNAPSHOT的版本更改为x.y.发布过程还将开发版本增加到x.(y+1)-SNAPSHOT。例如,版本1.0-SNAPSHAT作为版本1.0发布,新的开发版本为版本1.1-SNAPSHOT。

三、如何使用插件?

每当您想要为Maven项目定制构建时,可以通过添加或重新配置插件来完成。
对于这个例子,我们将配置Java编译器以允许JDK5.0源代码。这就像将其添加到POM一样简单:

...
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.3</version><configuration><source>1.5</source><target>1.5</target></configuration></plugin></plugins>
</build>
...

您会注意到Maven中的所有插件都很像一个依赖项——在某些方面,它们也是。该插件将自动下载和使用-如果您请求,则包括特定版本(默认为使用最新的可用版本)。

配置元素将给定的参数应用于编译器插件的每个目标。在上述情况下,编译器插件已经用作构建过程的一部分,这只是更改配置。还可以向流程添加新目标,并配置特定目标。

要了解插件的可用配置,您可以查看插件列表,并导航到您正在使用的插件和目标。有关如何配置插件的可用参数的一般信息,请参阅《配置插件指南》。

四、如何将资源添加到JAR?

另一个可以满足的常见用例是将资源打包到JAR文件中,它不需要对上面的POM进行任何更改。对于这个常见的任务,Maven再次依赖于标准目录布局,这意味着通过使用标准Maven约定,您可以将资源打包到JAR中,只需将这些资源放置在标准目录结构中即可。

您可以在下面的示例中看到,我们已经添加了目录${project.basedir}/src/main/resources,我们将希望打包的任何资源放置在该目录中的JAR中。Maven采用的简单规则是:放置在${project.basedir}/src/main/resources目录中的任何目录或文件都以从JAR底部开始的完全相同的结构打包在JAR中。

my-app
|-- pom.xml
`-- src|-- main|   |-- java|   |   `-- com|   |       `-- mycompany|   |           `-- app|   |               `-- App.java|   `-- resources|       `-- META-INF|           `-- application.properties`-- test`-- java`-- com`-- mycompany`-- app`-- AppTest.java

因此,您可以在我们的示例中看到,我们有一个META-INF目录,该目录中有一个application.properties文件。如果您打开Maven为您创建的JAR并查看它,您会看到以下内容:

|-- META-INF
|   |-- MANIFEST.MF
|   `-- application.properties
|   `-- maven
|       `-- com.mycompany.app
|           `-- my-app
|               |-- pom.properties
|               `-- pom.xml
`-- com`-- mycompany`-- app`-- App.class

 正如您所看到的,${project.basedir}/src/main/resources的内容可以从JAR的底部开始找到,我们的application.properties文件位于META-INF目录中。您还会注意到其他一些文件,如META-INF/MMANIFEST.MF,以及pom.xml和pom.properties文件。这些都是在Maven中生成JAR的标准配置。如果您愿意,您可以创建自己的清单,但如果您不这样做,Maven将默认生成一个清单。(您也可以修改默认清单中的条目。我们稍后会讨论这个问题。)pom.xml和pom.properties文件被打包在JAR中,这样Maven生成的每个工件都是自我描述的,如果需要,还可以在自己的应用程序中使用元数据。一个简单的用法可能是检索应用程序的版本。对POM文件进行操作需要使用一些Maven实用程序,但可以使用标准Java API使用这些属性,如下所示:

#Generated by Maven
#Tue Oct 04 15:43:21 GMT-05:00 2005
version=1.0-SNAPSHOT
groupId=com.mycompany.app
artifactId=my-app

要将资源添加到单元测试的类路径中,除了将资源放置在${project.basedir}/src/test/resources的目录之外,您可以使用与向JAR添加资源相同的模式:

my-app
|-- pom.xml
`-- src|-- main|   |-- java|   |   `-- com|   |       `-- mycompany|   |           `-- app|   |               `-- App.java|   `-- resources|       `-- META-INF|           |-- application.properties`-- test|-- java|   `-- com|       `-- mycompany|           `-- app|               `-- AppTest.java`-- resources`-- test.properties

 在单元测试中,您可以使用下面这样的简单代码片段来访问测试所需的资源:

...// Retrieve resource
InputStream is = getClass().getResourceAsStream( "/test.properties" );// Do something with the resource...

五、如何筛选资源文件?

有时,资源文件需要包含一个只能在构建时提供的值。要在Maven中实现这一点,请使用语法${<property name>}将对将包含该值的属性的引用放入资源文件中。该属性可以是pom.xml中定义的值之一、用户的settings.xml中定义的一个值、外部属性文件中定义的属性或系统属性。
要在复制时让Maven过滤资源,只需将pom.xml中的资源目录的过滤设置为true:

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.mycompany.app</groupId><artifactId>my-app</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><name>Maven Quick Start Archetype</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency></dependencies><build><resources><resource><directory>src/main/resources</directory><filtering>true</filtering></resource></resources></build>
</project>

您会注意到,我们必须添加以前没有的构建、资源和资源元素。此外,我们必须明确声明资源位于src/main/resources目录中。所有这些信息以前都是作为默认值提供的,但由于筛选的默认值是false,我们不得不将其添加到pom.xml中,以便覆盖该默认值并将筛选设置为true。

要引用pom.xml中定义的属性,属性名称将使用定义该值的xml元素的名称,允许将“pom”作为项目(根)元素的别名。因此,${project.name}是指项目的名称,${project.version}是指该项目的版本,${program.build.finalName}是指在打包生成的项目时创建的文件的最终名称,等等。请注意,POM的某些元素具有默认值,因此不需要在POM.xml中显式定义这些值即可在此处使用。类似地,用户的settings.xml中的值可以使用以“settings”开头的属性名称来引用(例如,${settings.localRepository}指的是用户本地存储库的路径)。

为了继续我们的示例,让我们向application.properties文件(我们将其放在src/main/resources目录中)添加几个属性,这些属性的值将在筛选资源时提供:

# application.properties
application.name=${project.name}
application.version=${project.version}

 有了它,您可以执行以下命令(流程资源是构建生命周期阶段,在该阶段复制和筛选资源):

mvn process-resources

target/classes下的application.properties文件(最终将进入jar)如下所示:

# application.properties
application.name=Maven Quick Start Archetype
application.version=1.0-SNAPSHOT

 要引用外部文件中定义的属性,只需在pom.xml中添加对该外部文件的引用。首先,让我们创建外部属性文件,并将其命名为src/main/filters/filter.properties:

# filter.properties
my.filter.value=hello!

接下来,我们将在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.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.mycompany.app</groupId><artifactId>my-app</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><name>Maven Quick Start Archetype</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency></dependencies><build><filters><filter>src/main/filters/filter.properties</filter></filters><resources><resource><directory>src/main/resources</directory><filtering>true</filtering></resource></resources></build>
</project>
Then, if we add a reference to this property in the application.properties file:# application.properties
application.name=${project.name}
application.version=${project.version}
message=${my.filter.value}

 mvn process-resources命令的下一次执行将把我们的新属性值放入application.properties中。作为在外部文件中定义my.filter.value属性的替代方案,你也可以在pom.xml的properties部分中定义它,你会得到同样的效果(注意,我也不需要对src/main/filters/filter.properties的引用):

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.mycompany.app</groupId><artifactId>my-app</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><name>Maven Quick Start Archetype</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency></dependencies><build><resources><resource><directory>src/main/resources</directory><filtering>true</filtering></resource></resources></build><properties><my.filter.value>hello</my.filter.value></properties>
</project>

过滤资源还可以从系统属性中获取值;Java中内置的系统属性(如Java.version或user.home)或使用标准Java-D参数在命令行上定义的属性。为了继续这个示例,让我们将application.properties文件更改为如下所示:

# application.properties
java.version=${java.version}
command.line.prop=${command.line.prop}

 现在,当您执行以下命令时(注意命令行上command.line.prop属性的定义),application.properties文件将包含系统属性中的值:

mvn process-resources "-Dcommand.line.prop=hello again"

Maven 使用教程(三)_Doker 多克 技术人的数码品牌的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/106545.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为9.20笔试 复现

第一题 丢失报文的位置 思路&#xff1a;从数组最小索引开始遍历 #include <iostream> #include <vector> using namespace std; // 求最小索引值 int getMinIdx(vector<int> &arr) {int minidx 0;for (int i 0; i < arr.size(); i){if (arr[i] …

spring boot Rabbit高级教程

消息可靠性 生产者重试机制 首先第一种情况&#xff0c;就是生产者发送消息时&#xff0c;出现了网络故障&#xff0c;导致与MQ的连接中断。 为了解决这个问题&#xff0c;SpringAMQP提供的消息发送时的重试机制。即&#xff1a;当RabbitTemplate与MQ连接超时后&#xff0c;…

【git】500 Whoops, something went wrong on our end.

在访问公的的git 时出现了500错误提示. 500 Whoops, something went wrong on our end. 哎呀&#xff0c;我们这边出了问题。 TMD 出了什么问题了&#xff1f;&#xff1f;&#xff1f;一脸懵逼。 登录git 服务器。 查看git的状态。 命令&#xff1a; gitlab-ctl statu…

互联网Java工程师面试题·Java 总结篇·第一弹

目录 1、面向对象的特征有哪些方面&#xff1f; 2、访问修饰符 public,private,protected,以及不写&#xff08;默认&#xff09;时的区别&#xff1f; 3、String 是最基本的数据类型吗&#xff1f; 4、float f3.4;是否正确&#xff1f; 5、short s1 1; s1 s1 1;有错吗…

华为OD机考算法题:开心消消乐

题目部分 题目开心消消乐难度易题目说明给定一个 N 行 M 列的二维矩阵&#xff0c;矩阵中每个位置的数字取值为 0 或 1&#xff0c;矩阵示例如&#xff1a; 1 1 0 0 0 0 0 1 0 0 1 1 1 1 1 1 现需要将矩阵中所有的 1 进行反转为 0&#xff0c;规则如下&#xff1a; 1) 当点击一…

java中char类型和byte类型的区别?

在Java中&#xff0c;char 类型和 byte 类型是两种不同的数据类型&#xff0c;以下是它们之间的主要区别&#xff1a; 表示范围&#xff1a;char 类型用于表示Unicode字符&#xff0c;它可以表示从U0000到UFFFF之间的字符。而 byte 类型是一个8位的有符号整数&#xff0c;可以表…

基于Spring Boot开发的汽车租赁管理系统

文章目录 项目介绍主要功能截图:后台前台部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于Spring Boot开发的汽车租赁…

动态规划算法(3)--0-1背包、石子合并、数字三角形

目录 一、0-1背包 1、概述 2、暴力枚举法 3、动态规划 二、石子合并问题 1、概述 2、动态规划 3、环形石子怎么办&#xff1f; 三、数字三角形问题 1、概述 2、递归 3、线性规划 四、租用游艇问题 一、0-1背包 1、概述 0-1背包&#xff1a;给定多种物品和一个固定…

ChatGPT,AIGC 数据库应用 Mysql 常见优化30例

使用ChatGPT,AIGC总结出Mysql的常见优化30例。 1. 建立合适的索引:在Mysql中,索引是重要的优化手段,可以提高查询效率。确保表的索引充分利用,可以减少查询所需的时间。如:create index idx_name on table_name(column_name); 2. 避免使用select * :尽可能指定要返回的…

HTML笔记

注释标签&#xff1a;<!-- --> 标题标签&#xff1a;&#xff08;作用范围依次递减&#xff09; <h1></h1> <h2></h2> <h3></h3> <h4></h4> <h5></h5> <h6></h6> 段落标签&#xff1a;<p&g…

抖音开放平台第三方代小程序开发,授权事件、消息与事件通知总结

大家好&#xff0c;我是小悟 关于抖音开放平台第三方代小程序开发的两个事件接收推送通知&#xff0c;是开放平台代小程序实现业务的重要功能。 授权事件推送和消息与事件推送类型都以Event的值判断。 授权事件推送通知 授权事件推送包括&#xff1a;推送票据、授权成功、授…

03-spring启动流程细节

文章目录 1.构造器调用2.initPropertySources()方法扩展3.customizeBeanFactory 定制BeanFactory4.loadBeanDefinitions(beanFactory) 1.构造器调用 注意子类调用父类构造器和子类调用子类其他构造器 2.initPropertySources()方法扩展 AbstractApplicationContext#initPrope…

智能油烟机 优化烹饪体验

如果说空调是夏天最伟大的发明&#xff0c;那么油烟机则是健康厨房的伟大推进者。随着科技的发展&#xff0c;智能化的油烟机逐渐走进了人们的日常生活。每当我们在爆炒、油炸食物的时候&#xff0c;油烟总能呛得人眼睛痛、鼻子难受&#xff0c;传统的油烟机面前我们还需要手动…

vue3后台管理框架之路由配置

pnpm install vue-router 在src新建文件夹views和router 1.1基本 路由配置 :hash 路由模式 // 对外配置路由 import Login from @/views/login/index.vue import Home from @/views/home/index.vue import Error from @/views/404/index.vue export cons

JavaScript基础知识13——运算符:一元运算符,二元运算符

哈喽&#xff0c;大家好&#xff0c;我是雷工。 JavaScript的运算符可以根据所需表达式的个数&#xff0c;分为一元运算符、二元运算符、三元运算符。 一、一元运算符 1、一元运算符&#xff1a;只需要一个表达式就可以运算的运算符。 示例&#xff1a;正负号 一元运算符有两…

英语——歌曲篇——All Out Of Love

All Out Of Love [Air Supply失落的爱] 歌词 I’m lying alone with my head on the phone Thinking of you till it hurts I know you hurt too but what else can we do Tormented and torn apart I wish I could carry your smile in my heart For times when my life se…

自动驾驶学习笔记(五)——绕行距离调试

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《2023星火培训【感知专项营】》免费课程—>传送门 文章目录 前言 调试内容 打开在线编辑器 打开pl…

基础算法:二分查找

目录 1. 二分查找2. 补充&#xff1a;二进制运算2.1 十进制与二进制的相互转换2.1.1 十进制转二进制2.1.2 二进制转十进制 2.2 机器数 真值2.3 原码 补码 反码2.4 二进制的加减乘除2.5 移位运算 1. 二分查找 思想&#xff1a; 有序数组&#xff0c;从中找值 实现&#xff1a;…

IDEA报Error:java:无效的源发行版13解决方式

出现问题原因&#xff1a;原本项目是spingboot2.0版本开发的&#xff0c;IDEA启动正常&#xff0c;后期新项目使用spingboot3.0&#xff0c;通过原来的IDEA版本及JDK1.8启动报上述错误&#xff0c;以下为版本文件 解决方式&#xff1a; 项目背景&#xff1a;项目已经上线&…

2023年10月16日-10月22日,(光追+ue+osg继续按部就班进行即可。)

根据月计划&#xff0c; 本周计划如下&#xff1a; 2023年10月16日-10月22日&#xff0c;光追10.7-10.13&#xff0c;ue rpg(p47-p53),ue5底层渲染01A19-01B4,osg29,osg30,filament文档每天看 落实到天就是 2023年10月16日光追10.7&#xff0c;ue rpg(p47),ue5底层渲染01A19,o…