java11+osgi_错误学习:Java + OSGi

java11+osgi

最近,我致力于在OSGi环境中使Apache Hive工作。 虽然没有被证明是小菜一碟(软件对吗?。。为什么我不感到惊讶? :) ),它引导我解决了各种Java和OSGi错误。 在这里,我列出了其中一些让我有些吃力的东西(没有双关语),所以我想为了自己的满意而在它们上面写一个博客。

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],它们提供了很多帮助。 但是,让我总结一下我在这个问题上的学习。 简单来说,如果捆绑包通过直接导入并通过使用约束暴露给同一软件包的两个版本,则会出现此错误。 该图最能说明这种情况。

捆绑软件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-c​​auses-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

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

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

相关文章

《Effective Java》读书笔记 - 5.泛型

Chapter 5 Generics Item 23: Don’t use raw types in new code 虽然你可以把一个List<String>传给一个List类型&#xff08;raw type&#xff09;的参数&#xff0c;但你不应该这么做&#xff08;因为允许这样只是为了兼容遗留代码&#xff09;&#xff0c;举个例子&am…

输入框长度校验

输入框长度校验1.例子 <input id"username" onkeyup"checkLength(this,80)"/>80是限制的长度 //输入长度校验,当长度超出限制&#xff0c;截取0到限制长度的字符串 function checkLength(obj, length) {if ($(# $(obj).attr("id")).val…

集群没有leader_ZooKeeper 集群中 Leader 与 Follower 的4种数据同步策略

首先要声明一点&#xff0c;zk集群中&#xff0c;leader服务器有着比较重要的存在&#xff0c;Follower 服务器只是处理非事务性请求&#xff0c;leader服务器主要负责事务性请求&#xff0c;Follower 服务器在遇到事务性请求以后还是会转发给leader服务器处理&#xff0c;所以…

JavaOne 2015:高级模块化开发

JavaOne 2015看到了Project Jigsaw团队关于Java 9中的模块化的一系列讨论 。它们都是非常有趣的&#xff0c;并且充满了宝贵的信息&#xff0c;我敦促每个Java开发人员都注意它们。 除此之外&#xff0c;我想给社区一种搜索和引用它们的方法&#xff0c;因此我在这里总结一下&…

Halcon学习笔记——机器视觉应用工程开发思路及相机标定

机器视觉应用工程开发思路 机器视觉应用工程主要可划分为两大部分&#xff0c;硬件部分和软件部分。 1.硬件部分&#xff0c;硬件的选型至关重要&#xff0c;决定了后续工作是否可以正常开展&#xff0c;其中关键硬件部分包括&#xff1a;光源&#xff0c;相机以及镜头。 2.软件…

输入框不可以输入中文

输入框不可以输入中文1.输入框不可以输入中文&#xff0c;中文直接消失 <input oninput "valuevalue.replace(/[\u4e00-\u9fa5]{0,}$/g,)"/>2.说明 oninput 事件在元素值发生变化是立即触发 匹配使用正则表达式 正则表达式在线测试网站

图片上传js验证图片长宽_js判断图片上传时的文件大小,和宽高尺寸

今天在做图片上传的小功能&#xff0c;使用了一个kissy上传组件。很好奇它是如何在图片上传前&#xff0c;检测到图片的大小和尺寸的&#xff1f;我们来写个小实例实现一下吧如何读取图片的size首先&#xff0c;原生input file控件有个files属性&#xff0c;该属性是一个数组。…

必填校验加变色,点击颜色消失

必填校验加变色&#xff0c;点击颜色消失1.例子 <td changeColorForNull"ah0"><input class"noNull" type"text" id"ah0"name"ah" notNull"案号" onfocus"myFocus(this)" value"" …

一个关于python装饰器参数的问题

看到廖雪峰python教程上&#xff0c;python装饰器一章 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318435599930270c0381a3b44db991cd6d858064ac0000 在最后的作业题上 再思考一下能否写出一个log的decorator&#xff0c;使它既…

action怎么获得 ajax date参数_ajax()gt;load()事件的新用法!!!

load()函数用于从服务器加载数据&#xff0c;并使用返回的html内容替换当前匹配元素的内容。load()函数默认使用GET方式&#xff0c;如果提供了对象形式的数据&#xff0c;则自动转为POST方式。load()函数只会替换每个匹配元素的内部内容(innerHTML)。你还可以在URL字符串后面追…

apache shiro_Apache Shiro第1部分–基础

apache shiroApache Shiro &#xff08;最初称为JSecurity&#xff09;是Java安全框架。 它被接受并于2010年成为Apache顶级项目。它的目标是功能强大且易于使用。 该项目正在积极开发中&#xff0c;用户和开发人员的邮件列表均处于活动状态。 最重要的区域记录在其网页上。 但…

js编码解码

js编码解码//对输出结果编码 function encodeStr(val) {return encodeURIComponent(encodeURIComponent(trim(val))); }// 对参数解码 function decodeStr(val) {return decodeURIComponent(decodeURIComponent(trim(val))); }后端解码 public static String urlDecode(String …

PHP 中文文件名 空格等 CURL 读取

用rawurlencode 对文件名进行编码转载于:https://www.cnblogs.com/zhaoyun4122/p/7198895.html

无显示器u盘安装centos_最新版 CentOS 8.1.1911 安装教程及常见问题图文详解

基于笔记本(华硕)操作&#xff0c;使用软碟通(UltraISO)制作的系统启动盘(U盘&#xff0c;内存大于8G)操作可自行百度&#xff0c;非常简单(或可留言&#xff0c;择情况出一期U盘制作启动盘教程)。a、登录 centos 官网下载镜像文件官网地址&#xff1a;https://www.centos.org阿…

谨慎使用JUnit的预期异常

有时&#xff0c;当我们收到对jOOQ或其他库的拉取请求时&#xff0c;人们会将单元测试中的代码更改为更“惯用的JUnit”。 特别是&#xff0c;这意味着他们倾向于更改此代码&#xff08;公认的不是那么漂亮的代码&#xff09;&#xff1a; Test public void testValueOfIntInv…

plupload使用例子

plupload使用例子1. 例子 <li><a id"uploadFile">上传</a></li>//文书上传和显示 $(function () {var uploader new plupload.Uploader({runtimes: html5,flash,silverlight,html4,// 指定上传方式browse_button: uploadFile,unique_names…

mysql获取相隔时间段的数据

思路&#xff1a;为时间段内的数据进行编序号&#xff0c;然后计算好相隔时间&#xff0c;拿到id作为搜索条件 SELECT * FROM ( SELECT (i:i1) as i, id, data_send_time FROM jl_pims_machine_time mt,(select i:0) as it where mt.company_id 1001 AND mt.machine_id 1 ord…

bom实现方块移动_从0开始实现一个俄罗斯方块

写在前面得话&#xff1a;这篇文章主要记录了我是怎么一步一步写出俄罗斯方块&#xff0c;整个代码用的函数编程&#xff0c;主要是为了让一些不熟悉es6, 面向对象写法得 新手能更容易看明白&#xff0c;全部得代码中都是一些js的基础知识&#xff0c;很容易理解。要说有点麻烦…

字符串工具类

字符串工具类import javax.servlet.http.HttpServletRequest; import java.util.UUID;public class CommonUtil {/*** param request 请求* return java.lang.String 返回路径* description 获取绝对路径* date 2021/7/14 20:45*/public static String getUrlPath(HttpServletR…

JSonP跨域请求

JSonP跨域请求 我们在通过自己的页面或程序通过ajax请求其它网站或服务时&#xff0c;会存在一个ajax直接请求普通文件存在跨域无权限访问的问题&#xff0c;甭管你是静态页面、动态网页、web服务、WCF&#xff0c;只要是跨域请求&#xff0c;一律不准。不过我们又发现&#xf…