dot2谜团png_一个类加载的谜团解决了

dot2谜团png

面对一个好老问题

我在应用程序服务器上遇到一些类加载问题。 这些库被定义为Maven依赖项,因此被打包到WAR和EAR文件中。 不幸的是,其中一些还安装在应用程序服务器中,但版本不同。 启动应用程序时,我们遇到了与这些类型的问题相关的各种异常。 如果您想深入了解,那么有一篇不错的IBM文章介绍了这些异常。

即使我们知道该错误是由类路径上的某些双重定义的库引起的,但仍花了两个多小时来调查我们真正需要的版本以及要删除的JAR。

同一周在水罐上偶然发生相同的话题

几天后,我们参加了“您真的得到了Classloaders吗? 苏黎世Java用户协会会议。 Simon Maple对类加载器进行了非常出色的介绍,并从一开始就介绍了非常深入的细节。 对于许多人来说,这是一次令人大开眼界的会议。 我还必须注意,Simon工作零周转,他为JRebel进行宣传。 在这种情况下,辅导课程通常偏向于实际产品,即辅导员的面包。 在这种情况下,我认为西蒙绝对是绅士和道德主义者,保持适当的平衡。

创建一个工具,解决神秘问题

只是为了创造另一个

一周后,我花了一些时间来学习程序,而现在我已经有几个星期没有时间了,所以我决定创建一个小工具,列出所有在类路径上的类和JAR文件,以便可以更轻松地进行调查。重复。 我试图依靠这样的事实,即类加载器通常是URLClassLoader实例,因此可以调用getURLs()方法来获取所有目录名称和JAR文件。

在这种情况下,单元测试可能非常棘手,因为该功能与类加载器的行为密切相关。 务实的是,我决定只做一些从JUnit开始的手动测试,只要代码是实验性的即可。 首先,我想看看这个概念是否值得进一步发展。 我打算执行测试,并查看报告没有重复类的日志语句,然后执行相同的运行,但是第二次向类路径添加一些冗余依赖项。 我使用的是JUnit 4.10,在这种情况下,该版本很重要。

我从命令行执行了单元测试,发现没有重复的类,我感到很高兴。 之后,我从Eclipse执行了相同的测试,并且感到惊讶:我冗余定义了21个类!

12:41:51.670 DEBUG c.j.c.ClassCollector - There are 21 redundantly defined classes.
12:41:51.670 DEBUG c.j.c.ClassCollector - Class org/hamcrest/internal/SelfDescribingValue.class is defined 2 times:
12:41:51.671 DEBUG c.j.c.ClassCollector -   sun.misc.Launcher$AppClassLoader@7ea987ac:file:/Users/verhasp/.m2/repository/junit/junit/4.10/junit-4.10.jar
12:41:51.671 DEBUG c.j.c.ClassCollector -   sun.misc.Launcher$AppClassLoader@7ea987ac:file:/Users/verhasp/.m2/repository/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1.jar
...

仔细研究一下,我可以很容易地发现JUnit 4.10具有额外的依赖关系,如maven所示

$ mvn dependency:tree
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building clalotils 1.0.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ clalotils ---
[INFO] com.verhas:clalotils:jar:1.0.0-SNAPSHOT
[INFO] +- junit:junit:jar:4.10:test
[INFO] |  \- org.hamcrest:hamcrest-core:jar:1.1:test
[INFO] +- org.slf4j:slf4j-api:jar:1.7.7:compile
[INFO] \- ch.qos.logback:logback-classic:jar:1.1.2:compile
[INFO]    \- ch.qos.logback:logback-core:jar:1.1.2:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.642s
[INFO] Finished at: Wed Sep 03 12:44:18 CEST 2014
[INFO] Final Memory: 13M/220M
[INFO] ------------------------------------------------------------------------

这实际上在4.11中已修复,因此如果我将依赖关系更改为JUnit 4.11,则不会遇到此问题。 好。 一半的谜团解决了。 但是,为什么maven命令行执行未报告双重定义的类?

扩展日志记录,越来越多的日志记录我可以发现一条线:

12:46:19.433 DEBUG c.j.c.ClassCollector - Loading from the jar file /Users/verhasp/github/clalotils/target/surefire/surefirebooter235846110768631567.jar

这个文件里有什么? 让我们解压缩它:

$ ls -l /Users/verhasp/github/clalotils/target/surefire/surefirebooter235846110768631567.jar
ls: /Users/verhasp/github/clalotils/target/surefire/surefirebooter235846110768631567.jar: No such file or directory

该文件不会退出! 看来maven创建了这个JAR文件,然后在测试执行完成后将其删除。 再次谷歌搜索,我找到了解决方案。

Java从类路径加载类。 可以在命令行上定义类路径,但是应用程序类加载器还有其他来源可以从中获取文件。 一个这样的源是JAR的清单文件。 JAR文件的清单文件可以定义执行JAR文件中的类所需的其他JAR文件。 Maven创建一个JAR文件,除了清单文件定义清单中列出了JAR和列出类路径的目录外,该文件不包含其他内容。 这些JAR和目录不是由getURLs()方法返回的,因此我的小工具(第一个版本)没有找到重复的对象。

出于演示目的,我足够快地在运行mvn test命令时制作了该文件的副本,并获得以下输出:

$ unzip /Users/verhasp/github/clalotils/target/surefire/surefirebooter5550254534465369201\ copy.jar 
Archive:  /Users/verhasp/github/clalotils/target/surefire/surefirebooter5550254534465369201 copy.jarinflating: META-INF/MANIFEST.MF    
$ cat META-INF/MANIFEST.MF 
Manifest-Version: 1.0
Class-Path: file:/Users/verhasp/.m2/repository/org/apache/maven/surefire/surefire-booter/2.8/surefire-booter-2.8.jar file:/Users/verhasp/.m2/repository/org/apache/maven/surefire/surefire-api/2.8/surefire-api-2.8.jar file:/Users/verhasp/github/clalotils/target/test-classes/ file:/Users/verhasp/github/clalotils/target/classes/ file:/Users/verhasp/.m2/repository/junit/junit/4.10/junit-4.10.jar file:/Users/verhasp/.m2/repository/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1.jar file:/Users/verhasp/.m2/repository/org/slf4j/slf4j-api/1.7.7/slf4j-api-1.7.7.jar file:/Users/verhasp/.m2/repository/ch/qos/logback/logback-classic/1.1.2/logback-classic-1.1.2.jar file:/Users/verhasp/.m2/repository/ch/qos/logback/logback-core/1.1.2/logback-core-1.1.2.jar
Main-Class: org.apache.maven.surefire.booter.ForkedBooter$

实际上,除了定义类路径的清单文件外,别无其他。 但是为什么Maven会这样做呢? 索纳型人,我个人也认识一些聪明的人。 他们不会白白做任何事情。 创建临时JAR文件以启动测试的原因是, 在某些类路径长度可能超过的操作系统上 ,命令行的长度受到限制 。 即使Java(自Java 6起)本身可以解析类路径中的通配符 ,也不是maven的选择。 JAR文件位于Maven存储库中的不同目录中,每个目录都有长名称。 通配符解析不是递归的,这有充分的理由,即使是通配符解析,您也不希望将所有本地存储都放在类路径中。

结论

  • 不要使用JUnit 4.10! 使用旧的或较新的东西,或为意外做好准备。
  • 了解什么是类加载器以及它如何工作,做什么。
  • 使用对命令行长度的最大大小有极大限制的操作系统。
    或只是忍受限制。

还有吗 你的想法?

翻译自: https://www.javacodegeeks.com/2014/09/a-classloading-mystery-solved.html

dot2谜团png

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

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

相关文章

python log文件如何不写入syslog_Centos下python 对syslog重写进行日志记录

在Linux 环境下,python自带一个syslog的模块可以进行日志记录。python可以利用logging模块来重写syslog,这样就可以自定义写入文件的文件名。如果不做配置则直接写入到/var/log/message文件里。首先先写log.py,代码如下:importosimportsysimp…

html中可以有两个h1,在一个HTML中h1标签能出现几次?h1标签和标题标签

首页 > web前端 > html教程 > 正文 在一个HTML中h1标签能出现几次?h1标签和标题标签的差别是什么? 2018-08-29 10:57:28本篇文章主要介绍了关于HTML h1标签的一些解释,有html h1标签和html title标签的区别,还有网页中h1…

Java中的记录类型

2020年3月发布的JDK 14引入了记录 (预览语言功能),这些记录提供了一种紧凑的语法来声明主要用于保存数据的类。 在记录中 ,所有低级,重复且容易出错的代码都类似于构造函数,访问器和通用方法,例…

angular 注入器配置_Angular依赖注入介绍

依赖注入(DI -- Dependency Injection)是一种重要的应用设计模式。Angular里面也有自己的DI框架,在设计应用时经常会用到它,它可以我们的开发效率和模块化程度。依赖,是当类需要执行其功能时,所需要的服务或对象。DI是一种编码模式…

山东省102021年普通高考成绩查询,山东高考成绩今日发布!成绩查询看这里!

原标题:山东高考成绩今日发布!成绩查询看这里!山东高考生注意啦~今天16:20举行山东2020年夏季高考第二次新闻发布会届时将会公布高考录取政策、分数线情况等今天17:00公布2020夏季高考与等级考成绩发布会怎么看?高考成绩怎样查&am…

可变对象 不可变对象区别_对象应该是不可变的

可变对象 不可变对象区别在面向对象的编程中,如果对象的状态在创建后无法修改,则它是不可变的 。 在Java中,不可变对象的一个​​很好的例子是String 。 创建后,我们无法修改其状态。 我们可以要求它创建新的字符串,但…

判别分析分为r型和q型吗_SPSS聚类和判别分析参考.ppt

SPSS聚类和判别分析参考10.1主成分分析和因子分析简介 3 常用术语 (1)因子载荷 (2)变量共同度 (3)公共因子的方差贡献 10.1主成分分析和因子分析简介 10.1.2主成分和公因子数量的确定 (1) 确定时遵循几个原则 主成分的累积贡献率:一般来说,提取主成分的累…

计算机应用基础人才培养方案,1. 培养方案(计算机应用基础课程).doc

人才培养方案一、课程定位和课程目标1、课程性质和任务  《计算机应用基础》是高职高专教育中的一门理论与实践相结合的基础必修课,是培养大学生信息素养的必修课程。但与普通的素质教育课程不同,由于计算机应用的普及性和广泛性,学生的计算…

使用SoapUI调用不同的安全WCF SOAP服务-基本身份验证,第二部分

在本系列的第一篇文章中,我们创建了一个基本的身份验证服务,以使用SoapUI进行调用。 因此,在第二篇文章中,我们将逐步演示如何使用此工具成功调用这种服务。 使用SoapUI的1-Basic WCF SOAP –创建新的SOAP项目 首先,我…

r语言electricity数据集_R语言实验报告.doc

R语言实验报告R语言实验报告R语言判别分析实验报告班级:应数1201学号姓名:麦琼辉时间:2016年11月28号1 实验目的及要求1) 了解判别分析的目的和意义;2) 熟悉R语言中有关判别分析的算法基础。2 实验设备及要求个人计算机一台&#…

linux rar加压_Linux之rar文件解压之路

导读相信大家在使用Linux系统时有时候会碰到有关于rar文件的解压缩。网上下载rar 压缩文件的使用,在linux在我们需要对其进行解压缩,这个时候,我们需要安装 rar相关的文件,来进行解压缩。1. 下载我们进入rarlab网站,进…

全国计算机二级office基础知识,全国计算机二级office考试内容

计算机领域中所运用的技术方法和技术手段。计算机技术具有明显的综合特性,它与电子工程、应用物理、机械工程、现代通信技术和数学等紧密结合,发展很快。下面是小编整理的关于全国计算机二级office考试内容,希望大家认真阅读!基本要求1. 掌握…

insight切换窗口 source_source insight的使用方法逆天整理(1)

A. why SI:为什么要用Source Insight呢?因为她比完整的IDE要更快啊,比一般的编辑器便捷啊!她有逆天的查看定义,查看调用,查看引用功能以及方便的Context Window上下文显示,像这样的东西非常有利于查看大量代…

html table nei边框线,GitHub - meichuanneiku/TableCell: 在TableBank的基础上,进一步标注到单元格精度,利用目标检测/分割实现单元格定位。...

项目说明本项目是我2019年7月份的实习工作的**展示与记录**:把倾斜的表格旋转水平;制作5000张表格数据集,需要标注每一个单元格,并实现单元格检测第一项比较简单,仿射变换、透视变换已经很成熟了,关键是第二…

前缀命名

如果您是第一次查看Takes或Cactoos的源代码,则很可能会像其他名称一样被命名约定触发,这意味着大多数类名称都有两个字母的前缀: BkSafe , RqFake , RsWithStatus , TkGzip等。 老实说,我还没有…

python中excel制作成绩报表_python制作简单excel统计报表2之操作excel的模块openpyxl简单用法...

python制作简单excel统计报表2之操作excel的模块openpyxl简单用法# codingutf-8 from openpyxl import Workbook, load_workbook from openpyxl.drawing.image import Image from openpyxl.styles import Font,colors from datetime import datetime import MySQLdb class Exce…

2018软科计算机科学与技术排名,又一中国高校“计算机学科排名”发布,清华第1,浙大第2...

计算机类专业是近些年最热门的专业之一,这类专业不仅就业情况好,工资待遇水平也很高,就是在考公务员时也很有优势。现在,大部分高校都已经开设了计算机类专业,我国学习计算机类专业的学生数量非常多,所以&a…

java数字格式化_Java数字格式

java数字格式化当我看到其他人编写不必要的Java代码并且由于缺乏对已经提供所需功能的JDK类的了解而编写了不必要的Java代码时,我会想到很多次。 这样的一个例子是时间相关的常量的使用硬编码值的写入,如60 , 24 , 1440 &#xff…

快手小筷子机器人_小筷子app官方版下载-快手控场机器人小筷子app下载v1.0.0安卓版_289手游网...

快手控场机器人小筷子app是一个专门为快手主播打造的专业实用工具,是每个快手主播的最佳直播伴侣!快手控场机器人小筷子app能够实时与观众弹幕互动,还能语音播报各种礼物答谢等等,帮助每个主播更好的聚拢粉丝。快手控场机器人小筷…

计算机专业英语主要句型及翻译技巧,计算机专业英语单词及翻译等技巧-20210420072747.ppt-原创力文档...

New Words & Expressions:computerlike a. 计算机似的electromechanical a. 机电的, 电机的vacuum tubes 真空管Census Bureau 人口普查局thousands of 成千上万的 known as 通常所说的,以……著称1.1 The Invention of the ComputerAbbreviations:ENIAC(Electr…