java11+osgi_错误学习:Java + OSGi
java11+osgi
![](https://s0.wp.com/wp-includes/images/smilies/icon_smile.gif?m=1129645325g)
java.lang.VerifyError
在初始化OSGi服务组件之一时,我感到很讨厌。 由于违规捆绑软件处于活动状态,因此无法立即识别出罪魁祸首。 从表面上看,一切正常,除了应该在捆绑中存在的服务组件初始化期间启动的Hive服务器未启动并正在运行的事实。 OSGi控制台中快速显示“ ls”,表明服务组件处于“不满意”状态。 最后,一个“ comp”显示了根本原因,即VerifyError。
如果类的运行时依赖项与编译时使用的依赖项不同,则可能会发生VerifyError。 例如,如果方法签名在依赖关系之间更改,则将导致此错误。 在已接受的答案的[1]中对此进行了很好的解释。 事实证明,在两个捆绑包中暴露了一个软件包的稍有不同的版本,这导致Hive捆绑包在编译环境中的版本上选择了不同的版本。 正确的OSGi版本控制是解决方案。
java.lang.IncompatibleClassChangeError
在系统中存在两个软件包的类似情况下,也会出现此错误。 正如[2]清楚地解释的那样,在我的案例中,这样做的原因是在有冲突的软件包版本之间将接口更改为抽象类。 再次,版本控制节省了一天。
java.lang.LinkageError:xxxx中违反加载程序约束–等等……
现在,这似乎是一个著名的错误,特别是在OSGi环境中。 根本原因似乎是由不同的ClassLoader加载的两个类,它们以某种方式进入联系。 例如,说A类对象接受B类对象作为方法参数。 B类由ClassLoader-A加载,该类加载器也加载A类。但是,在方法调用时,由ClassLoader-B加载的B类对象如何作为参数传递给已加载的A类对象通过ClassLoader-A。 现在,结果将是一个很大的LinkageError,并带有非常冗长的错误消息。
OSGi中基于图的类加载结构使其特别有利于此类错误。 在我的案例中,罪魁祸首是一个包装,该包装已被复制到两个不同的包中,并且该包中的一个特定类由每个包的单独的ClassLoader加载,并通过方法调用期间系统中存在的第三个包来联系。 因此,这是在OSGi中不遵循“导入导出内容”的最佳做法[3]的情况。 这样做将有助于减少重复的包在包中的暴露,并有助于为给定的包维护一致的类空间。 因此,这就是这种情况下的解决方案。
包使用冲突:导入包:yyy; 版本=“ xxx”
在锻炼过程中,我经常不时地面对这种不便之处。 在SpringSource上有两个关于此问题的出色文章[4],[5],它们提供了很多帮助。 但是,让我总结一下我在这个问题上的学习。 简单来说,如果捆绑包通过直接导入并通过使用约束暴露给同一软件包的两个版本,则会出现此错误。 该图最能说明这种情况。
![](https://2.bp.blogspot.com/-TGfnMi9dS28/T7uyvSt0NsI/AAAAAAAAAP0/-vKv0qfvca4/s400/osgi-uses1.jpg)
捆绑软件A直接导入org.foo版本1.0.0。 但是,它也从捆绑软件B导入捆绑软件org.bar。但是事实证明,软件包org.bar也使用org.foo软件包,尽管它是与捆绑软件A导入的版本不同的版本(2.0.0)。现在捆绑软件A直接连接到org.foo的1.0.0版本,并且由于导入了使用org.foo的2.0.0版本的org.bar而暴露于org.foo的2.0.0版本。 现在,由于无法将捆绑包连接到同一软件包的不同版本,因此使用冲突将导致冒犯进口org.bar的根本原因。 (例如:程序包使用冲突:导入程序包:org.bar;版本=“ 0.0.0?”)。 解决方案是更改捆绑软件A或捆绑软件B中的org.bar软件包导入版本,以便它们都指向相同的软件包版本。 尼尔·巴特利特(Neil Bartlett)撰写的另一篇很棒的博客可以在[6]中找到。
java.lang.UnsatisfiedLinkError
我的一个工作朋友在尝试将另一个第三方库纳入我们的OSGi环境时遇到了这个问题。 JavaDocs继续说这变得“如果Java虚拟机无法找到声明为native的方法的适当的本机语言定义,则会抛出该错误”。 有问题的库是一个Linux .so(动态链接库)文件,在运行时捆绑ClassLoader时看不到该文件。 通过将库资源直接包含在捆绑软件ClassLoader中,我们能够使其工作。 之前在TCCL(线程上下文类加载器)上设置此资源的尝试失败了,这使我们意识到TCCL通常不是捆绑软件类加载器。 在Equinox OSGi环境下可以很好地阅读TCCL,请参见[7]。
[1] http://stackoverflow.com/questions/100107/reasons-of-getting-a-java-lang-verifyerror
[2] http://stackoverflow.com/questions/1980452/what-causes-java-lang-incompatibleclasschangeerror
[3] http://blog.osgi.org/2007/04/importance-of-exporting-nd-importing.html [4] http://blog.springsource.org/2008/10/20/understanding-the-osgi-uses-directive/ [5] http://blog.springsource.org/2008/11/22/diagnosing-osgi-uses-conflicts/ [6] http://njbartlett.name/2011/02/09/uses-constraints.html [7] http://wiki.eclipse.org/Context 类 Loader_Enhancements
参考: 错误学习:来自Source Open博客的JCG合作伙伴 Buddhika Chamith的Java + OSGi 。
翻译自: https://www.javacodegeeks.com/2012/05/learn-by-errors-java-osgi.html
java11+osgi
java11+osgi_错误学习:Java + OSGi相关推荐
- 错误学习:Java + OSGi
最近,我致力于在OSGi环境中使Apache Hive工作. 虽然没有被证明是小菜一碟(软件对吗?..为什么我不感到惊讶? ),它引导我解决了各种Java和OSGi错误. 在这里,我列出了其中一些让我 ...
- java转net容易吗_每日一醒(1):学习Java容易忽视的小错误,你注意到了吗?
在我们学习Java的过程中有着许多的小知识点特别容易出bug,你知道吗?下面我就给大家科普下2个学习Java容易忽视的问题 1.值传递与引用传递 值传递是指对象被值传递,意味着传递了对象的一个副本,即 ...
- 学习java周期_Java第一作业周期总结
1.作业总结 自java开课,我们已经进行了三次作业的练习,一步步的从最开始的没有什么特别之处,到运用到java中独有的知识,从简单到复杂,初步了解了Java编程的基本准则.最开始的作业,写完之后,并 ...
- 零基础全方位学习java的方法
java技术岗是一个就业率非常高的岗位,因此有很多人都想要学习java技术,其中不乏一些零基础同学,零基础小白都不清楚自己该如何学习java,那么下面小编就为大家详细的介绍一下零基础全方位学习java ...
- 学习Java编程培训的书籍有哪些
学习java技术除了线上线下的培训学习,书籍的知识也是非常重要的,今天小编为大家整理的就是学习Java的一些书籍,Java书籍是程序员学习提升技能的重要学习渠道,通过书籍Java程序员可以学习当前流行 ...
- 学习java一定会用到的应用软件
想要成为一名合格的java程序猿,基础知识一定是要非常牢固的,扎实的基本功不仅可以快速的吸收新的知识,也会避开一些基本的语法错误,为了帮助程序员们减少一点工作压力,小编在此汇总了一些各大网络平台上推荐 ...
- 学习 Java 8 - 函数式接口 Lambda
学习 Java 8 - 函数式接口 Java 8 引入了函数式接口的概念.函数式接口其实就是只包含一个抽象方法的普通 Java 接口.在没有引入函数式接口之前,我们通常使用内部类和匿名类来实现类似的功 ...
- 学习java应该如何理解反射?
小子吃饭去 猿类/技术渣/热爱和妹子有关的话题 163 人赞同 [此反射来自于李兴华的java se 实战经典,非做广告,网上有视频教程资源和笔记word素材,如果有需要可以留言] 网上百度出来的wo ...
- Java:计算机编程语言Java的简介、编程环境/工具、如何学习Java之详细攻略
Java:计算机编程语言Java的简介.编程环境/工具.如何学习Java之详细攻略 目录 Java的简介 1.Java的工作原理--基于Eclipse等编程Java语言→定义Java类→Java虚拟机 ...
最新文章
- ACM公布2017年图灵奖,大卫·帕特森和约翰·轩尼诗获奖
- linux中shell变量$#,$@,$0,$1,$2的含义解释
- java get方法报空指针_面试的哪些事儿之JAVA程序员面试笔试题(一)
- k8s使用port-forward访问集群中的应用程序(只能在执行命令的机器上开放端口)
- 如何在ashx页面获取Session值(未将对象引用设置到对象的实例) (转)
- Spring Boot(十四):spring boot整合shiro-登录认证和权限管理
- 联邦知识蒸馏概述与思考(续)
- linux如何结束音乐是什么函数,与音乐有关的linux命令
- Java数据结构与算法-环形队列
- 数据库之Oracle
- 引用类型和值类型区别(一)
- 黑群晖 7.0 安装
- 基于JSP动漫论坛的设计与实现
- HDU - 6438 优先队列,+贪心。
- 题目:在C语言中,表达式23|2^5的值是()
- 监控io性能、free命令、ps命令、查看网络状态、linux下抓包
- ur机器人编程-创建程序
- 电路邱关源学习笔记——1.7基尔霍夫定律
- python里的π怎么输入_【后端开辟】python里的π怎样输入
- Hadoop各配置文件详解
热门文章
- 学习java多线程,这必须搞懂的这几个概念
- Jodd - Java界的瑞士军刀轻量级工具包
- 漫画:什么是一致性哈希
- Office基础和计算机操作基础的知识点(一)
- JAVAWEB(笔记)
- 9.2-控制单元CU的功能(学习笔记)
- 在eclipse中创建maven项目错误的解决方法:Could not resolve archetype org.apache.maven.archetypes:maven-archetype-qu
- Spring IOC 容器启动、Bean生命周期详解
- aws es方案_AWS Elasticsearch后模式
- destroy 方法_线程方法destroy()和stop(Throwable)在JDK 11中删除