当前位置: 首页 > 后端技术 > Java

开始使用Maven?这篇文章就够了

时间:2023-04-01 22:05:10 Java

之前开发的时候,如果项目A需要jar包,可以去网上搜索下载jar包,然后复制粘贴到相应的位置进行开发。如果B项目也需要这个jar包,那么就需要再手动复制粘贴到相应的位置。为了解决这个问题,包管理应运而生。最常见的是maven和gradle。前者主要针对java项目,后者主要针对android项目。注意这里说的是focuson,不是just。什么是行家?我们来看看官方的定义。乍一看,Maven似乎可以包含很多东西,但简而言之,Maven是一种尝试,将模式应用于项目的构建基础结构,以便通过提供使用最佳实践的清晰路径来促进理解和生产力。Maven本质上是一个项目管理和理解工具,因此提供了一种帮助管理的方法:BuildsDocumentationReportingDependenciesSCMsReleasesDistribution如果您想了解有关Maven的更多背景信息,可以查看Maven的哲学和历史。现在让我们继续讨论作为用户的您如何从使用Maven中获益。通过官方的定义我们可以知道maven一般是对项目周期进行管理,包括我们最常听到的,编译,下载,依赖,部署等等。如何下载安装Maven,我就不赘述了。网上随便搜了一大堆如何验证下载安装是否成功(一般是自带系统环境),在命令行任意目录下输入mvn-v,如果出现类似下面的信息,配置成功,包括mvn的版本号。基本概念和配置在构建maven应用之前,可以先说说关于仓库的基本概念和一些必要的配置。本地仓库:在本地PC划分一个文件夹,存放jar包中央仓库:Maven官方管理的jar包仓库远程仓库:自己或者公司为内部团队搭建的jar包仓库引入依赖时,去如果本地仓库没有jar包,就去maven管理的中央仓库找。如果中央仓库还没有找到,就会去远程仓库找。远程仓库,但是远程仓库找不到需要的jar包,也会报错,找不到依赖另外还有一个镜像的概念,只要A仓库能包含所有的jar包即可B仓库的,那么可以说A是B的镜像。由于一些不可抗拒的因素,有时会出现无法访问中央仓库的情况。这时候就需要使用阿里云或者其他镜像仓库来提高访问效率。到目前为止,您只需要了解这些概念即可。了解之后,需要设置本地仓库的位置,镜像仓库的url,远程仓库的url。默认配置文件路径为${user.home}/.m2/settings.xml,默认本地仓库地址为${user.home}/.m2/repository/可以看到有两层,一层是用户级别的修改,则配置文件对应${user.home}/.m2/settings.xml,另一种是全局修改,对所有用户生效,所以配置文件的路径对应${maven.home}/conf/settings.xml修改本地仓库的位置添加镜像地址配置远程仓库在配置镜像和远程仓库的时候,记住id标签是全球唯一的要查看当前effective配置文件,可以使用mvnhelp:effective-settings查看到配置文件去掉多余注释的部分,只留下刚才手动配置的本地仓库和镜像仓库的位置。构建第一个maven应用程序使用命令行构建第一个maven应用程序。以后99.99%的案例可能直接通过idea构建mvn-Barchetype:generate-DgroupId=com.maven.learn.cutey-DartifactId=my-first-maven-DarchetypeArtifactId=maven-archetype-quickstart-DarchetypeVersion=1.4可以先忽略这串命令的意思,后面再看会有不一样的感受。生成工程后,用树看看工程的目录结构是什么样子的?有一个pom.xml,就是后面常说的pom文件。全称是ProjectObjectModel,描述的是项目。4.0.0com.maven.learn.cuteymy-first-maven1.0-SNAPSHOT我的-first-mavenhttp://www.example.comUTF-81.71.7junitjunit4.11test有几个很常用的标签groupId是组织id,一般公司域名写artifactId可以简单理解为项目id,一般通过groupId:artifactId来定位一个jar包的dependencies依赖,可以理解为在一个流行的方式jar包的Others可以顾名思义,这里就不一一解释常用的命令了Compile通常使用javac来编译并获取class文件来执行,maven中也有类似的命令,使用mvncompile编译项目。编译完成后,查看文件目录结构,可以发现target目录比较多,然后对应路径下有class文件。进入classes文件夹,使用java命令行启动java文件,可以发现测试可以正常运行。在上面的目录结构中,除了主文件夹之外,还有一个测试文件夹目录,也就是常说的测试用例目录。默认的测试用例比较简单,没什么好说的。您可以使用mvntest来运行测试用例。测试用例可以运行成功,然后再次使用tree查看目录结构,可以看到添加了一些文件,其中surefire-reports是maven的一个插件。还有一点值得注意的是,我看到了testCompile,也就是说mvntest也是在编译之后运行的,所以mvntest-compile可以达到只编译不运行的效果。Packagingpackage在实际情况下,一般不会把所有的文件都编译好,然后放到服务器上运行类文件。而是将项目打包成jar包运行,或者部署一个war包在服务器的tomcat上运行。根据package使用mvnpackage进行打包。打包后,使用tree查看目录结构。可以看到生成了一个jar包,然后使用java-jar命令行执行这个jar包。但是,在这个例子中,会报错。上网查找资料,发现缺少主启动类的入口。不过后来的springboot项目就没有这个麻烦了。应该已经配置好了。有兴趣的同学可以一层层看springpom文件。解决方法是在pom文件中加入如下代码。org.apache.maven.pluginsmaven-shade-plugin2.4.3packageshadecom.maven.learn.cutey.App注意放在build标签接下来,不用pluginManagement标签,使用java-jar执行jar包,可以看到可以正确执行。下载到本地安装完成上面的工作后,再去本地的jar包里看看,还没有。但是在真实的开发环境中,一个项目是由多个模块组成的,模块之间可能存在引用依赖,这可能需要将开发好的模块下载到本地,供其他模块使用。使用mvninstall完成上述要求。可以看到对应的位置已经生成了jar包和对应的版本号,所谓对应的位置就是我们一开始自定义的groupId和artifactId组成的。cleanthetargetdirectoryclean在某些情况下,可能需要清除编译生成的二进制文件,然后再编译,这就需要使用mvnclean。可以看到清空后目录结构又变得很干净了。不过需要注意的是,虽然target目录被清空了,但是install下载到本地仓库的jar包在本地仓库中还是存在的。Skeletonarchetypearchetype的意思是原型,可以理解为模板或者骨架,但更本质的是,它是maven的一个插件。一开始搭建的第一个maven应用使用的是archetype,不过是在命令行配置选择哪个模板(maven-archetype-quickstart),然后将groupId和artifactId都输入进去。mvn-Barchetype:generate-DgroupId=com.maven.learn.cutey-DartifactId=my-first-maven-DarchetypeArtifactId=maven-archetype-quickstart-DarchetypeVersion=1.4这个试试不是自动生成的,使用mvnarchetype:generate出现发出警告,说在远程目录中找不到骨架,只加载了本地的,所以我们只看到了10个内部骨架,但这并不妨碍行动。所以这个告警可以忽略。如果你有强迫症,可以上网搜索解决办法。默认选择的是7,我看第7个的时候是maven-archetype-quickstart。这次不同的是,我手动选择了10个,也就是maven-archetype-webapp。顾名思义,它是一个web项目。选择骨架后,去仓库下载,让你填写groupId和artifactId以及一些基本值,查看目录结构,自定义骨架。上面两个例子使用了别人的骨架,但是你可以自定义骨架。Maven提供了这种支持。首先生成skeleton,在项目根目录,即pom文件同级目录下使用mvnarchetype:create-from-project目录结构,然后切到target中的archetype目录,执行先mvninstall,然后执行mvnarchetype:crawlBuild成功后,进入之前设置仓库的根目录,可以看到多了一个archetype-catalog.xml文件。检查文件的内容以查看最新的内容。自定义原型也在这个文件下。下面是试试看能不能成功使用自定义骨架生成工程,还是执行mvnarchetype:generate,可以看到第11个是我们自己的archetype,可以发现每个数字后面都有一个英文,internal或者local,其实还有remote。有时候我们只想要本地,或者只想要远程,maven也提供了这样的命令加一个-DarchetypeCatalog=xxx。例如,mvnarchetype:generate-DarchetypeCatalog=local表示只加载本地骨架。默认选择是2,但3是自定义的。输入一些必要的信息来创建也不容易。如果对您有帮助,请点个赞。收藏并分享吧!以下是个人的公众号,有兴趣的可以关注一下,说不定就是你的宝藏公众号!!!