maven入门:一个简单的maven项目

article/2025/9/17 2:33:10

简介

Maven是一个用于项目管理的工具,其好处是为我们管理jar包的依赖版本,同时也方便的组合我们自己的代码模块。在入门前有两个概念先简单介绍一下,一个是坐标,另一个是仓库。

坐标:maven为每一个jar包或模块都定义了一个坐标,坐标代表了一个特定jar包及版本。坐标定义在项目的pom.xml文件中,有三个重要标签:groupId、artifactId、version,其他模块调用可以通过在自己的pom.xml中引用此坐标,从而引用此jar包的功能(就像eclipse中导入jar的功能一样)。

仓库:maven提供了一个仓库,仓库管理着项目所需要的jar包,所有本地项目指向这个仓库,从仓库中获取jar依赖。仓库有两个层级,一个是本地仓库,另一个是maven的中央仓库。本地仓库在maven首次使用时自动创建,windows默认路径是~/.m/repository/,在linux中默认路径是${user_home}/.m/repository/,这个路径是可以自定义的,后面再说;中央仓库是一个maven远程仓库,管理着几乎所有的开源jar包。当我们使用maven工具,或者编译项目依赖时,maven首先从本地仓库需找jar依赖,如果本地仓库没有对应的jar包,则从中央仓库下载需要的插件和jar包到本地仓库,若有其他本地项目再需引用同样的jar包,则直接可从本地仓库获取依赖。

现在不多说mavne的理论概念,我们先来上手写个入门例子。创建一个maven项目有三种方式:

1.直接手动构建路径,pom.xml,及java文件;

2.用maven命令来自动生成一个maven结构的项目;

3.用eclipse来创建一个maven项目。

这里我们从零开始,用方式1,手动创建一个maven项目。

maven环境搭建

1.下载maven,下载地址: http://maven.apache.org。

2.下载为一个zip压缩包,将此压缩包拷贝至自定义路径下,这里我放入d:maven_home下,并解压缩,得到maven路径为:D:maven_homeapache-maven-3.2.5。

3.配置maven环境变量:

3.1系统变量:M2_HOME,值:D:maven_homeapache-maven-3.2.5

3.2 系统变量:Path,修改值,行首添加:%M2_HOME%in;

4.测试maven安装结果,使用命令:mvn–v。输出结果:

5.搭建maven环境时遇到的问题:

当搭建完maven环境后,运行命令:mvn -v,报错:

后来检查配置,发现我本地的环境变量JAVA_HOME=C:ProgramFilesJavajdk1.5.0_11。根据maven的官方说明,maven3.2支持java6及以上,maven3.0、maven3.1支持java5及以上。所以修改JAVA_HOME为C:ProgramFilesJavajdk1.6.0_43,在执行maven命令,结果正常。

手动创建一个maven项目

maven环境搭建完以后,我们现在全手动来搭建一个maven项目,直观感受一下maven命令。

1.手动创建一个目录,用于存放我们的开发项目。这里我自己创建目录为:D:maven_homeprojects,在此目录下放我们的maven项目。我们创建第一个项目maven_part1,及此项目下的文件夹、文件。

1.1 结构如下:

这里maven_part1就相当于我们的项目模块名,src与pom.xml文件同级,main与test分别存放我们的项目资源和对应的测试资源。这是一个maven项目固定的结构,如果结构不对可能造成maven项目编译找不到资源的错误。

1.2 HelloMaven.java代码:

package com.realla;public class HelloMaven{public String sayHello(String name){return "Hello:"+name;}
}

1.3TestHelloMaven.java代码:

package com.realla;import org.junit.*;
import static org.junit.Assert.*;public class TestHelloMaven{@Testpublic void testHelloMaven(){HelloMaven hm = new HelloMaven();String str = hm.sayHello("maven");assertEquals(str,"Hello:maven");}
}

1.4pom.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<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 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.realla</groupId><artifactId>maven_part1</artifactId><packaging>jar</packaging><version>1.0-SNAPSHOT</version><name>maven_part1</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.10</version><scope>test</scope></dependency></dependencies></project>

Pom.xml文件是maven项目的重要配置文件,这里先做一个简单说明:

Pom.xml的根节点是,在文件的开头与很多xml的配置文件一样,需要自己的schema定义,从现成的pom.xml中拷贝即可。其中有几个重要标签:

:组ID,指一个项目的名称,命名规范为:部门+项目名。

:模块的名称。一个项目中可能有多个模块,这些模块各自进行开发,所以其命名规范就是我们的模块名。

:版本号。一般为1.0-SNAPSHOT,代表开发阶段的快照。

:开发后,打包的方式。这里是打包成jar文件,也可以设置成war。

:dependency配置的是我们项目所依赖的jar文件。与我们自己的项目一样,每个jar文件都有三个坐标标签、、。这三个标签值决定了一个jar包。当我们在项目中定义了所有依赖jar的这些属性后,在编译时,项目会先从本地仓库中寻找已有的jar依赖,如果没有,在向maven的中央仓库寻找并下载所需的jar依赖。的这几个属性如何配置,可访问中央仓库(http://mvnrepository.com/),搜索需要的jar包,网页可以显示此jar依赖所需要的配置语句,直接拷贝过来即可。本例子中,因为测试时需要依赖junit包,所以dependency中需要配置对此包的引用。

2.建完上面的路径和java文件后,使用cmd,进入文件夹:d:maven_homeprojectsmaven_part1,进行命令操作。

2.1执行命令:maven compile,会在maven_part1路径下,会生成target文件夹,target中包含对应java文件的class文件,以及编译结果说明文件:

2.2然后执行命令:maven test,maven会显示测试结果,如果测试正确,会显示如下:

此时target目录中还会生成测试结果文件。

2.3执行命令:maven package,将我们项目打包成jar文件。(此项是根据我们pom.xml中标签的配置来生成对应的包文件,我们这里配置是jar)。生成jar文件在target路径下:

2.4执行命令:maven install,将我们的jar包发布到本地仓库,供其他模块、其他开发者调用:

简单说明:maven管理项目的一个重要功能是管理我们项目依赖的jar包,这里有一个重要概念是仓库。当我们用标签配置了我们项目需要的jar包以后,编译期间,maven会先从本地仓库中获取依赖,如果本地仓库中没有此依赖,则会转向maven的中央仓库下载相应的jar依赖。本地仓库是由maven配置管理的。

对于maven命令:”maven package”,是在当前项目路径下生成一个项目的jar包,如果不做其他操作,本地的其他模块不能引用此jar包;”maven install”命令,则将项目jar包发布到我们的本地仓库中,那么我们本地的其他模块,只要在pom.xml中定义相关的标签值,就可以调用此jar包了。

2.5此时的maven_part1是一个maven格式的项目,其不能导入eclipse。若果需要导入eclipse中,我们还需要执行命令:mvn eclipse:eclipse。执行结果:

3 在创建一个maven项目:maven_part2,测试maven_part2如何引用maven_part1定义的类。

3.1在projects目录下新建一个maven项目:maven_part2。(该项目的目的是为了调用maven_part1中的HelloMaven.sayHello()方法。)项目结构如下:

3.2Hello.java对象中包含了对maven_part1中HelloMaven.java的引用,代码如下:

package com.invocation;import com.realla.HelloMaven;public class Hello{public String sayInvocation(String name){//调用maven_part1中的HelloMaven类HelloMaven hm = new HelloMaven();return hm.sayHello(name);}
}

3.3TestHello.java代码如下:

package com.invocation;import org.junit.*;
import static org.junit.Assert.*;public class TestHello{@Testpublic void testSayInvocation(){Hello hello = new Hello();String str = hello.sayInvocation("maven");assertEquals(str,"Hello:maven");}
}

3.4对应的pom.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<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 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.invocation</groupId><artifactId>maven_part2</artifactId><packaging>jar</packaging><version>1.0-SNAPSHOT</version><name>maven_part2</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.10</version><scope>test</scope></dependency><dependency><groupId>com.realla</groupId><artifactId>maven_part1</artifactId><version>1.0-SNAPSHOT</version><!-- <scope>test</scope> 不能要--></dependency></dependencies></project>

3.5 说明

maven_part2引用maven_part1,前提是在maven_part1项目中,我们已经正确编译,且执行mvn install命令,将maven_part1项目打包成jar,发布到本地仓库中了。所以本地的其他项目就可以调用此项目的jar包。这里maven_part2的pom.xml中定义dependency,指定了maven_part1的三个坐标,因此可获得对应的依赖。这里可以看出,maven很方便的管理我们的项目,包括jar包版本、项目模块组合等。如果一个公司有10多个项目,项目间的大部分jar包时重复的,我们就不需要在每个项目的lib中保存自己的jar包。取而代之,maven将这些依赖放在本地仓库中,所有的项目都指向本地仓库,从此仓库中获取依赖,以及获取对应的jar包版本。而且协作开发的模块,通过maven自动打包发布,也很容易互相配合使用。

编译maven_part2,结果正确:

3.6 遇到的问题

刚开始,我对maven_part2编译时报错,说com.realla.HelloMaven对象找不到,原因是maven_part2的pom.xml文件的标签多加了一个属性test(上面的注释部分),当设置了此属性后,这个包只在测试时有效,而我的HelloMaven对象是在我的main路径中的Hello.java中引用的,很明显这不是一个测试路径,所以会报错;

然后我将scope删掉,然后还报错,说org.junit不存在,原因是maven_part2中的pom.xml文件我没有配置junit依赖,配置完后,编译正常。

用maven命令来创建项目

这里需要用到命令:mvn archetype:generate。

这里的archetype是一个插件,generate是目标的(goal),此命令时maven调用archetype插件执行generate目标。

此命令可以直接使用,那么在命令执行时,会有一系列操作。其中会让开发者输入项目的坐标(groupId、archetypeId、packaging、version)

当然,也可以在命令后面指定参数,直接定义项目坐标:

Mvn archetype:generate -DgroupId=com.realla.command -DartifactId=maven_part3 -Dpackaging=com.realla.command -Dversion=0.0.1-SNAPSHOT

在执行命令时,就不必在指定项目坐标。执行结果:

生成项目如下,然后我们可以在此基础上修改:

用eclipse创建maven项目

1.如果我们的当前使用的工具是一个老版本的eclipse,那么我们需要下载安装maven插件m2eclipse。

2.我这里用的是myeclipse10,其中已经集成了maven插件。但我们需要修改两个地方:一是将maven插件替换为我们自己安装的maven(就好像myeclipse集成了tomcat,但我们还是比较喜欢指定使用自己安装的tomcat一样);另一个是指定本地仓库的位置。

修改myeclipse使用指定maven:

Window/preferences/Myeclipse/Maven4MyEclipse/Installations,点击add,添加指定的maven路径:

修改本地仓库的路径,首先修改本地%M2_HOME%/conf/settings.xml中的本地仓库的位置,然后让Myeclipse指向此settings.xml配置文件即可:

Window/preferences/MyEclipse/Maven4MyEclipse/userSettings

至此,MyEclipse的maven配置完成,可以创建maven项目了:

右键/new/other》选择Maven Project》next》next》选择archetype(一般选:maven-archetype-quickstart;如果是创建web项目,则选:maven-archetype-webapp)》next》定义项目坐标》finish。完成创建。下图则是我创建的maven_part4项目结构:

好了,用myeclipse创建一个quickstart maven项目就完成了。

至于具体在myeclipse中如何操作配置maven项目,可以参考链接(转):http://b-l-east.iteye.com/blog/1246482


http://chatgpt.dhexx.cn/article/BC2VQ20E.shtml

相关文章

Maven项目的介绍、入门搭建

Maven项目的介绍、入门搭建 一、什么是Maven项目 Maven 是 Apache 组织下的一个跨平台的项目管理工具&#xff0c;它主要用来帮助实现项目的构建、测试、打包和部署。Maven 提供了标准的软件生命周期模型和构建模型&#xff0c;通过配置就能对项目进行全面的管理。它的跨平台性…

Maven项目详解

目录 一、简介 二、准备工作 1、安装maven &#xff08;参考文章&#xff1a;maven下载安装详解&#xff09; 2、配置maven本地仓库 3、中央仓库 4、目录结构 5、POM&#xff08;Project Object Model&#xff09; 6、IDE配置 三、Maven项目创建步骤 1、在Eclipse中创…

Maven项目构建

Maven项目构建 一、Maven的介绍1.1 Maven的作用1.2 Maven仓库1.3 Maven目录及配置 二、Maven的使用2.1 Maven 工程的目录结构2.2 pom.xml配置文件 三、Maven多模块项目3.1 创建多模块项目3.2 父模块与子模块pom.xml 一、Maven的介绍 1.1 Maven的作用 Maven 的依赖管理 项目的…

如何使用 Maven 来创建项目(一篇文章就够了)

如何使用 Maven 来创建项目&#xff08;一篇文章就够了&#xff09; 1. Maven 简介1. 简介2. 项目构建3. 项目构建工具 2. Maven 的四大特性1. 依赖管理系统版本号规范 2. 多模块构建3. 一致的项目结构4. 一致的构建模型和插件机制 3. Maven 的安装配置和目录结构1. Maven 的安…

IDEA中创建maven项目详细步骤,很清晰

前言 在IDEA中创建Maven项目&#xff0c;前提是已经安装配置好Maven环境 。 如还未配置安装Maven的&#xff0c;请先下载安装。如何下载安装&#xff0c;可参考我另外篇文章&#xff1a; maven的下载与安装教程 本篇教程是以创建基于servlet的JavaWeb项目为例子&#xff0c;如…

深拷贝和浅拷贝

深拷贝和浅拷贝的知识涉及到堆栈的概念。 堆栈的概念&#xff1a; 基本类型&#xff1a; 名值存储在栈内存中&#xff0c;例如: let a 1;引用类型&#xff1a; 名存在栈内存中&#xff0c;值存在于堆内存中&#xff0c;但是栈内存会提供一个引用的地址指向堆内存中的值&…

深拷贝和浅拷贝的区别详解

深拷贝和浅拷贝的作用是复制对象数据&#xff0c;这两者都用于构造拷贝构造函数中&#xff0c;那么这俩之间到底有什么区别呢&#xff1f; 先上答案 - 浅拷贝&#xff1a;简单的赋值拷贝操作 - 深拷贝&#xff1a;在堆区重新申请内存空间&#xff0c;进行拷贝操作 下面举一个…

Python深拷贝与浅拷贝的区别

首先深拷贝和浅拷贝都是对象的拷贝&#xff0c;都会生成一个看起来相同的对象&#xff0c;他们本质的区别是拷贝出来的对象的地址是否和原对象一样&#xff0c;也就是地址的复制还是值的复制的区别。 什么是可变对象&#xff0c;什么是不可变对象&#xff1a; 可变对象是指&am…

详解JS深拷贝与浅拷贝

深拷贝与浅拷贝 深拷贝和浅拷贝都只针对引用数据类型&#xff0c;浅拷贝会对对象逐个成员依次拷贝&#xff0c;但只复制内存地址&#xff0c;而不复制对象本身&#xff0c;新旧对象成员还是共享同一内存&#xff1b;深拷贝会另外创建一个一模一样的对象&#xff0c;新对象跟原对…

c++深拷贝与浅拷贝

浅拷贝&#xff1a;简单的赋值拷贝操作&#xff08;这个是系统默认提供的&#xff09; 深拷贝&#xff1a;在堆区重新释放空间&#xff0c;进行拷贝操作&#xff08;要自己写的&#xff09; 简单来说&#xff0c;只要类属性里有指针等就必须利用深拷贝操作 为便于深刻理解&a…

实现深拷贝与浅拷贝的方法

深拷贝与浅拷贝概念&#xff1a; 深浅拷贝出现的前提&#xff1a; 应用类型的数据&#xff08;对象和数组&#xff09; 深拷贝就是把目标对象里面的数据一个一个都复制下来&#xff0c;创建出一个一模一样的&#xff0c;存放地址不一样&#xff0c;互不影响。就像真假美猴王。改…

深拷贝和浅拷贝的区别及实现方法

文章目录 一、引言二、浅拷贝1.Object.assign()2.concat()3.扩展运算符 三、深拷贝1. 利用json数据和json字符串之间的转换2.$.extend()3. 递归 查阅多篇文章后&#xff0c;自己归纳总结对深拷贝和浅拷贝的理解&#xff0c;不足之处&#xff0c;还望多多指导 一、引言 基本数据…

深拷贝与浅拷贝的区别

深拷贝与浅拷贝是针对对象属性为对象的&#xff0c;因为基本数据类型在进行赋值操作时&#xff08;也就是深拷贝&#xff08;值拷贝&#xff09;&#xff09;&#xff0c;是直接将值赋给了新的变量&#xff0c;也就是该变量是原变量的一个副本&#xff0c;这时&#xff0c;你修…

深拷贝和浅拷贝的区别是什么?

深拷贝和浅拷贝的区别是什么? 1、浅拷贝 (1)、定义 被复制对象的所有变量都含有与原来的对象相同的值&#xff0c;而所有的对其他对象的引用仍然指向原来的对象。即对象的浅拷贝会对“主"对象进行拷贝&#xff0c;但不会复制主对象里面的对象。"里面的对象”会在…

深拷贝和浅拷贝常见的实现方式

浅拷贝的实现方式 1. Object.assign()方法 assign()方法是把任意多个的源对象自身的可枚举属性拷贝给目标对象&#xff0c;然后返回目标对象。但是他的拷贝方式不是固定的&#xff0c;看下面的代码演示&#xff1a; let obj {username: kobe}; let obj2 Object.assign({},o…

什么是深拷贝和浅拷贝?以及怎么实现深拷贝和浅拷贝?

拷贝浅是创建一个新对象&#xff0c;这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型&#xff0c;拷贝的就是基本类型的值&#xff0c;如果属性是引用类型&#xff0c;拷贝的就是内存地址&#xff0c;所以如果其中一个对象改变了这个地址&#xff0c;就会影响到…

Java的深拷贝与浅拷贝的区别

1.二者的区别 浅拷贝&#xff1a;在拷贝一个对象时&#xff0c;对对象的基本数据类型的成员变量进行拷贝&#xff0c;但对引用类型的成员变量只进行引用的传递&#xff0c;并没有创建一个新的对象&#xff0c;当对引用类型的内容修改会影响被拷贝的对象。 深拷贝&#xff1a;在…

深拷贝和浅拷贝的区别(必须掌握)

前言&#xff1a; 在面试中&#xff0c;你必须要知道的一个知识点&#xff0c;那就是浅拷贝和深拷贝&#xff0c;那么就必须知道基本数据类型和引用类型&#xff0c;其实深拷贝和浅拷贝的主要区别就是其在内存中的存储类型不同。 网片来自网络&#xff08;侵删&#xff09; …

C++的浅拷贝与深拷贝

目录 前言 一、区别 二、浅拷贝 1.简单描述 2.代码实例 三.深拷贝 1.简单描述 2.代码实例 四.完整代码 五.运行结果 总结 前言 C中有两种拷贝&#xff1a;深拷贝和浅拷贝 要是想要运用好拷贝函数就必须清楚深拷贝与浅拷贝的区别 一、区别 1 在未定义拷贝构造函数…

拷贝构造(深拷贝、浅拷贝)

一、概念介绍 拷贝构造&#xff1a;拷贝构造函数&#xff0c;又称构造函数&#xff0c;是一种特殊的构造函数&#xff0c;它由编译器调用来完成一些基于同一类的其他对象的构造及初始化。 其唯一的形参必须是引用&#xff0c;但并不限制为const&#xff0c;一般普遍的会加上c…