maven的常见问题_Maven常见问题和陷阱

maven的常见问题

喜欢它还是讨厌它(很多人似乎都讨厌它), Maven是64%的Java开发人员广泛使用的工具(来源– 2014年Java工具和技术前景 )。

大多数经验丰富的开发人员已经对Maven感到头疼。 通常以困难的方式,用头撞到砖墙上。 不幸的是,我感到新的开发人员正在经历同样的艰苦学习过程。

纵观世界各地的主要Java会议,您都找不到任何与Maven相关的会议,这些会议都可以指导您了解基础知识。 也许社区认为您应该已经了解它们,就像Java语言本身一样。 尽管如此,回收这些知识可能对每个人都是双赢的情况。 您或您的队友浪费了多少时间不知道如何处理Maven的特殊性?

如果您正在阅读本文,我还将假设您掌握了Maven的基础知识。 如果没有,请查看以下文章:

  • 5分钟内完成Maven
  • 构建生命周期简介

还有很多其他文章。 我发现添加自己的内容,重复相同的内容没有任何价值,但是如果我有需要,我可以写一个。 让我知道您是否支持!

无论如何,我认为我可以通过指出团队在使用Maven时遇到的主要问题,对其进行解释以及如何解决这些问题来增加一些价值。

为什么这个罐子在我的建筑物中?

由于采用了Maven传递依赖机制,因此所包含库的图可以很快变得很大。

如果您在类路径中看到某些内容,但没有将其放在此处,则很可能是由于传递依赖。 您可能需要它,也许不需要。 也许您正在使用的库代码的一部分不需要所有这些额外的jar。 在这里感觉像是一场赌博,但是如果使用mvn dependency:analyze ,您可能会有一个大概的想法。 该命令将告诉您项目实际使用了哪些依赖项。

我主要在这里进行反复试验,排除我认为不需要的内容,然后运行代码以查看一切是否正常。 不幸的是,该命令并没有告诉您所使用的依赖项是否确实需要传递依赖项。 嘿,如果有人知道更好的方法,请告诉我!

我看不到我的变化!

可能由于多种原因而发生。 让我们看一下最常见的:

依赖关系未在本地存储库中构建

您可能具有模块A和模块B。模块B对模块A具有依赖性。对模块B所做的更改在模块A中不可见。

发生这种情况是因为Maven调查了它自己的本地jar存储库,以将其包含在classpath中。 如果进行任何更改,则需要将新jar的副本放入本地存储库。 您可以通过在更改后的项目中运行mvn install来实现。

依赖版本不正确

可以很简单地更改您正在使用的依赖项的版本,或者弄清楚该依赖项确实很麻烦。 当Maven执行依赖关系查找时,它将使用规则“最近定义优先”。 这意味着在依赖关系树中,所使用的版本将是最接近您项目的版本。 困惑? 我也是。让我们尝试一个例子。

您想在项目A使用依赖项Dv1 ,但您正在获取Dv2 ,并且具有以下依赖项树:

A -> B -> C -> Dv1

A -> E -> Dv2

包括D哪个依存关系? Dv1还是Dv2 ? 在Dv2情况下,由于“最近定义优先”规则。 如果两个依赖关系版本在依赖关系树中的深度相同,则最重要的是声明中的顺序。

要解决此问题,您可以在ADv1显式添加一个依赖Dv1 ,以强制使用Dv1或仅排除Dv2

如果使用命令mvn dependency:tree ,它将输出一棵树,其中将包含项目的所有依赖关系和版本。 这对于调试此类问题非常有帮助。

远程存储库已覆盖您的更改

公司通常会拥有一个内部Maven存储库,以缓存工件,存储版本或提供您正在处理的项目的最新更改。 在大多数情况下,这很有效,但是当您使用SNAPSHOT版本时, Maven始终会尝试获取对该依赖项的最新更改。

现在,您很高兴地在对Project B更改,该更改依赖于Project A 您在本地构建所有内容,然后继续将更改集成到Project A 。 某人或某物,上传新的SNAPSHOT版本的Project B 请记住,您所做的更改尚不可见,因为您已将所有内容都保存在本地并且尚未提交到VCS。 您对Project A进行的下一个构建将从公司存储库中选择Project B ,而不是从本地存储库中选择Project B

该罐子不包括在分发中!

为了增加一点混乱,让我们谈谈范围。 Maven有四个作用域: compileprovidedruntimetest 。 每个依赖项都有一个范围,该范围为您的应用程序定义了一个不同的类路径。

如果缺少某些内容,并且假设您正确定义了依赖项,则问题很可能出在范围之内。 使用compile范围是安全的(默认)。 命令mvn dependency:analyzemvn dependency:tree在这里也可以为您提供帮助。

找不到工件!

啊,可怕的是“无法解析依赖关系……找不到工件”。 这就像Java NPE! 发生这种情况的原因有很多。 还有其他一些明显的东西,但是无论如何都要调试。 我通常会按照以下清单尝试解决此问题:

  • 检查依赖项是否正确定义
  • 检查您是否指向存储依赖项的正确远程存储库
  • 检查远程存储库是否真正拥有依赖项!
  • 检查是否有最新的pom.xml文件
  • 检查罐子是否损坏
  • 检查公司存储库是否正在缓存Internet存储库,并且没有发出获取新库的请求
  • 检查依赖项定义是否被某些内容覆盖。 使用mvn help:effective-pom进行构建项目的实际Maven设置
  • 不要使用-o

结论

Maven并不是一个完美的工具,但是如果您学习了一些技巧,它将帮助您并节省调试构建问题的时间。 还有其他方法可以解决其中一些问题,但是我所掌握的知识不足,无法就这些问题发表意见。

无论如何,大量的项目使用Maven作为构建工具,我相信开发人员应该了解他们的构建工具,以便能够在日常工作中表现更好。 希望这篇文章对您有用。

随时发布此处未涵盖的任何其他问题。 不幸的是, Maven有时似乎充满了惊喜。

最后一条建议:永远不要信任IDE! 如果它可以在命令行上运行,那就是IDE的问题!

翻译自: https://www.javacodegeeks.com/2014/09/maven-common-problems-and-pitfalls.html

maven的常见问题

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

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

相关文章

matlab graphic,Matlab图形系统,Matlab Graphic System,音标,读音,翻译,英文例句,英语词典...

Image:114994698204558.jpgmatlabmatlab是矩阵实验室(matrix laboratory)之意。除具备卓越的数值计算能力外,它还提供了专业水平的符号计算,文字处理,可视化建模仿真和实时控制等功能。matlab的基本数据单位是矩阵,它的指令表达式…

python调用opengl_Python运行OpenGL示例

说明python的opengl库叫PyOpenGL,安装这个库的时候要注意位数版本要正确,比如我的python37是32位的,安装PyOpenGL-3.1.5-cp37-cp37m-win32.whl才行,默认pip安装的运行时可能会有问题,所以需要手动下载安装对应版本的wh…

php内置的数组函数大全,php数组的内置函数大全

1.array_change_key_case($arr,CASE_UPPER/CASE_LOWER)将$arr的键值转换为大写或者小写2.array_combine($arr1, $arr2) $arr1的值作为键,$arr2作为值生成后返回新的数组3.array_key_exists(‘key’, $arr)$arr中是否存在key,如果存在返回true,如果不存在…

用vs写python和c++需要哪些工具包_从运行效率与开发效率比较Python和C++

之前有人一直在说python怎么怎么好用,也有人说C太难了,下面我做了一些笔记:1、运行效率:C >> PythonPython代码和C最终都会变成CPU指令来跑,但一般情况下,比如反转和合并两个字符串,Pytho…

JUnit5 TestSuite替代

JUnit4具有TestSuite类来聚合多个测试。 这在JUnit 5中不可用。通常,通过套件中的一堆命名测试进行的测试发现有些糟透了。 但是,如果目标不是测试发现,而是不同测试类之间的资源共享,那么创建父对象是有意义的。 JUnit 5提供了N…

oracle 日志丢失,Oracle联机日志文件丢失解决方法一例

由于丢失的当前的联机日志文件,所以可能会丢失部分数据,破坏数据库的完整性,而且普通的重建日志文件的方式是不可行的,这个时候我们需要借助隐含参数_ALLOW_READ_ONLY_CORRUPTION或者_ALLOW_RESETLOGS_CORRUPTION打开数据库。打开…

junit:junit_简而言之,JUnit:测试隔离

junit:junit作为顾问,我仍然经常遇到程序员,他们对JUnit及其正确用法的理解最多。 这使我有了编写多部分教程的想法,以从我的角度解释要点。 尽管存在一些有关使用该工具进行测试的好书和文章,但是也许可以通过本动手实践系列中的…

python基本模块中的对象_Python 学习笔记 -- OS模块的常用对象方法

1 #这里列举在os模块中关于文件/目录常用的函数使用方法23 #这里需要注意下,在使用这些方法前记得导入os模块4 import os #导入os模块5 """6 os对象方法:7 os.getcwd() #返回当前工作目录8 os.chdir(path) #改变工作目录9 os.listdir(pat…

OCA第2部分中的Java难题

欢迎使用OCA的Java Puzzlers的第二部分。 在这一部分中,我们将看到一个有趣的案例,涉及Java 7附带的数字文字中的下划线分隔符。 在下面的类中,您可以在十进制文字中看到分隔符下划线。 还请注意,该类现在可以正常编译。 八进制是…

msflexgrid允许大选择_选择复式楼、跃层和别墅的装修业主如何做好家里的楼梯...

点击上面蓝色字体关注!装修图例 | 别墅装修 | 装潢装饰 | 样板楼梯 | 装修设计很多复式或者别墅的房子,楼梯是不可缺少的建筑,大部分楼梯是连接客厅以及卧室的,很多朋友都选择在楼梯上面铺地板,木地板的改装空间大&…

php程序xml有必要学习吗,对初学者非常有用的PHP技巧

对初学者非常有用的PHP技巧echo "I is : $i ;}echo print_footer();那么,为什么你应该做输出缓冲呢:你可以在将输出发送给浏览器之前更改它,如果你需要的话。例如做一些str_replaces,或者preg_replaces,又或者是在…

OCA第1部分中的Java难题

我在业余时间正在阅读Mala Gupta的Oracle认证Java SE程序员助理书,我对所学到的一些新知识感到惊讶。 有时候他们真的没有任何意义,有时候他们虽然有道理,但确实令人惊讶。 因此,在本系列文章中,我想将它们共享为“ Ja…

oracle创建数据库用户并授权,oracle创建数据库、表空间、用户并授权

1、创建数据库简单的方式是使用Database Configuration Assistant数据库配置工具根据向导创建2、创建表空间在实际使用中需要创建自定义的表空间和临时表空间2.1、创建表空间create tablespace tabspace_nameloggingdatafile E:\app\oratable_space\ tabspace_name_temp.dbfsiz…

mysql 查询 系统字段 自然日_Mysql查询用户留存/留存率问题用户n日(内)留存、某日新增用户n日(内)留存...

Mysql查询用户留存/留存率语法计算某日的客户在第n日再次出现的概率--用户n日留存率。计算某日的客户在某个时间段内再次出现的概率--用户n日内留存率。计算某日新增的用户在第n日再次出现的概率--新用户n日留存率。计算某日新增的用户在某个时间段内再次出现的概率--新用户n日…

ajax 示例_通过示例了解挥发

ajax 示例我们已经花了几个月的时间来稳定Plumbr中的锁定检测功能 。 在此期间,我们遇到了许多棘手的并发问题。 许多问题是独特的,但是一种特殊类型的问题一直反复出现。 您可能已经猜到了–滥用volatile关键字。 我们已经发现并解决了许多问题&#x…

oracle long转为string,实现全局拦截前端传入的Long类型id转String

1遇到的问题在开发过程中存在这样一种问题,我们使用的id主键主要有long类型和varchar类型当主键id为long类型并且长度超过16位,当返回给前端时,前端会出现js解析的参数如果是Long类型的并且长度过大就会出现精度丢失。这就会造成后台返回的值…

springboot 多线程_redis官方推荐:SpringBoot用这个,一键多线程

Lettuce是一个可伸缩的线程安全的Redis客户端,提供了同步,异步和响应式使用方式。 如果多线程避免阻塞和事务操作(如BLPOP和MULTI / EXEC),则多个线程可共享一个连接。 Lettuce使用通信使用netty。 支持先进的Redis功能,如Sentine…

oracle查询最高一条记录,oracle 查询已有记录,上一条记录,下一条记录

oracle可以使用 lead、lag 函数来查询已有记录的下一条、上一条记录。表结构如下:如要查询Staffno是6-1102的前一条记录select * from staff where staff_no(select c.p from (select staff_no,lag(staff_no,1,0) over (order by staff_no) as p from staff) c wh…

使用Maven进行增量构建

这是2020年,如果您要启动任何新的基于Java的项目,则应优先选择gradle,但由于某些原因,如果您仍然对Maven感兴趣,那么您可能会发现这篇文章有用。 Maven Java / scala编译器插件对增量编译提供了不错的支持&#xff0c…

夏末浅笑_2014年夏末大Java新闻

夏末浅笑正如即将到来的JavaOne那样 ,最近在Java社区中已经有很多重大新闻。 这篇文章简要地引用了其中的三个项目(Java SE 8更新,Java SE 9和Java EE 8),并对我发现是我在类路径/类加载器问题上见过的更清晰的文章之一…