• [毕昇JDK] 【技术剖析】10. JVM 中不正确的类加载顺序导致应用运行异常问题分析
    作者:程经纬、谢照昆 > 编者按:两位笔者分享了不同的案例,一个是因为 JDK 小版本升级后导致运行出错,最终分析定位原因为应用启动脚本中指定了 Classpath 导致 JVM 加载了同一个类的不同版本,而 JVM 在选择加载的类则是先遇到的先加载,进而导致应用出错,该问题的根因是设置了错误的 Classpath。第二个案例是在相同的 OS、JDK 和应用,不同的文件系统导致应用运行的结果不一致,最终分析定位的原因是 JVM 在加载类时遇到了多个版本的问题,但是该问题的根因是没有指定 Classpath,JVM 加载类会依赖于 OS 读取文件的顺序,而不同的文件系统导致提供文件的顺序不同,导致了问题的发生。经过这两个案例的分析,可以得到 2 个结论:需要指定 Classpath 避免不同文件系统(或者 OS)提供不同的文件顺序;需要正确地指定 Classpath,避免加载错误的类。希望读者可以了解 JVM 加载类文件的基本原理,避免出现类似错误。 # 现象01 某产品线进行 JDK 升级,将 JDK 版本从 8u181 升级到 8u191 后,日志中报出大量 `java.lang.NoSuchFieldError`,导致基本服务功能不可用。具体报错如下: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/11/101547onahjaeyofipegne.png) # 分析 从这个调用栈来看,问题可能出现在 JDK 自身,并没有涉及到业务代码。首先自然应该去看一下 `ClientHandshaker.java` 的源码,确认一下出错时的上下文。先看 JDK 8u191 的代码,相关如下: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/11/101618ousqpizdiroio8fj.png) 可以看到,虽然这里对 handshakeState 进行了 check,但是代码中完全没有出现 state 这个变量;那么 8u181 又如何呢?继续看代码: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/11/1017207hybnlcq35mgadgb.png) 这里的实现方式和 8u191 中有明显的不同,其中最重要的一点是,在 194 行中确确实实访问了 state 这个变量。追踪一下代码可以得知,ClientHandshaker 类继承自 Handshaker 类,state 也是从父类之中继承过来的一个 field。于是,可以得到一个初步的结论:JDK 8u191 中,ClientHandshaker 的实现方式与 8u181 不同,去除了 state 这个 field。 既然报错报了这个 field,因此可以确定,JVM 中加载的 ClientHandshaker 肯定不是 8u191 中的这一个。那么,可能是产品线在替换 JDK 时,没有替换完全,导致残留了一部分 8u181 的东西,让 JVM 加载了?这个猜测很快就被否定了,因为行号对不上:错误栈中的行号是 198,而 8u181 代码中对 state 的访问是在 194 行。 因此,为了直接推进问题,最好的办法就是确定 JVM 到底是从哪里加载了 ClientHandshaker。在 java 启动命令中加入如下参数,就可以追踪每一个 class 的加载: ```Java java -XX:+TraceClassLoading ``` 会产生类似于下面的输出:(加载的类 + 类的来源) ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/11/101753egdbrghp9gz61pda.png) 从这个输出中搜索一下 ClientHandshaker,最终发现了这么一行: ```Bash [Loaded sun.security.ssl.ClientHandshaker from /mypath2/lib/alpn-boot.jar] ``` 果然,出问题的 ClientHandshaker 并不是加载自 JDK 8u191 中,而是加载自 alpn-boot.jar 这个包。那么这个包又是从哪里找到的?检查了一下产品线的 java 启动命令,发现里面用 -cp 参数指定了许多 Classpath 路径,最后从里面找到了 "/mypath2/lib/alpn-boot.jar"。 到这个目录下,找到产品线所使用的 jar 包,然后将其中包含的 ClientHandshaker.class 反编译后,发现代码基本与 8u181 代码相同——也访问了 state,并且连行号(198)也能对应上。到此,根因基本确定。 alpn-boot.jar 是 Jetty 中用来实现 TLS 的扩展。产品线当时所使用的 alpn 版本是 8.1.12.v20180117,根据官方文档,这个版本只能兼容到 JDK 8u181,而 8u191 之后,alpn 的版本也应有相应的变化,以兼容新的 JDK 代码。为什么当时 alpn 没有自动适应 JDK 版本?因为产品的启动脚本里写死了那个老版本的 alpn-boot.jar,而在升级的时候却没有适配启动脚本。 # 现象02 笔者将相同的 java 应用和 JDK 部署在 Linux 环境中,一台机器上运行正常,另外一台和预期不一样。对于这个现象我们非常奇怪,从问题表象应该是外部环境导致了运行结果不同,为此我们对软件、硬件、环境进行排查,发现 2 台机器除了使用的文件系统不同外,其他并无不同。 为什么不同的文件系统会影响 JVM 的运行结果?根源在哪里? 通过排查发现有两个 jar 中存在全限定名相同的两个主类,那么 JDK 会去选择哪个主类加载呢,对于 Classpath 通配符 JDK 又是如何解析的,下面笔者对上面问题进行分析。 # 环境介绍 准备两台 Linux 机器,其中一台文件系统为 ext4,另一台为 xfs。可以使用 df -T 命令查看使用的文件系统。 复现问题的方式非常简单,可以创建两个全限定名一样的类,然后编译打成 jar 包放在同一个目录中。运行 java 进程时,指定的 Classpath 路径使用通配符。可以通过下面的 demo 复现这个问题。 - Demo 的目录结构 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/11/101844r6esqdjqnz5wipkp.png) **moduleA Main.java** ```Java package com.example; public class Main { public static void main(String[] args) { System.out.println("module A"); } } ] ``` **moduleB Main.java** ```Java package com.example; public class Main { public static void main(String[] args) { System.out.println("module B"); } } ``` - 编译及打包 先使用 java 命令将这两个类编译,然后分别使用 jar 命令打包到 moduleA.jar 和 moduleB.jar 中,并保存在 lib 目录中。切换到 demo 目录,执行如下命令进行编译、打包。 ```Bash mkdir -p moduleA/out javac moduleA/src/com/example/Main.java -d moduleA/out/ mkdir -p moduleB/out javac moduleB/src/com/example/Main.java -d moduleB/out/ mkdir lib jar -cvf lib/moduleA.jar -C moduleA/out/ . jar -cvf lib/moduleB.jar -C moduleB/out/ . ``` - 运行 ```Bash java -cp .:/home/username/demo/lib/* com.example.Main ``` # 测试结果 对于不同文件系统的环境,输出的结果可能不同,下面以 ext 和 xfs 文件系统为例,可以看到输出不同的结果。 - ext4 moduleA.jar 创建时间早于 moduleB.jar,输出 module B。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/11/102158ej4whpqrutplv0je.png) moduleA.jar 创建时间晚于 moduleB.jar,输出 module B。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/11/102204gmz1taywyyllcbyf.png) **无论是先创建 moduleA.jar 还是 moduleB.jar,最终的输出结果都是 module B**。 - xfs moduleA.jar 创建时间早于 moduleB.jar,输出 module A。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/11/102234yxexw8luhnnuhkzy.png) moduleA.jar 创建时间晚于 moduleB.jar,输出 module B。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/11/1022385c7ma1ascbs8koyf.png) **如果先创建 moduleA.jar,然后创建 moduleB.jar,输出的结果是 module A;反之,输出的结果是 module B。** # 原因分析 ## 排查方法 使用 JDK 8 进程启动时,添加 VM 参数 `-XX:+TraceClassPaths -XX:+TraceClassLoading`。其中以 ext 文件系统为例,可以得到如下的日志: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/11/102310vztfiafw8wdlny5m.png) 从日志可以发现 Classpath 解析后的路径是 moduleB.jar 在 moduleA.jar 之前,并且加载的是 moduleB.jar 的类。对于解析后的 Classpath,还可以通过添加 -XshowSettings 选项查看。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/11/102318vzm6cskv1lhcvdpz.png) 对于常驻进程,查看通配符解析后的 Classpath,可以使用 jcmd 命令查看。当然使用 jconsole 或者 visualvm 等工具连接进程也可以查看解析后的 Classpath。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/11/102326urtf1z7ikf8t6elo.png) ## Classpath 通配符如何解析 以 Linux 系统为例,在 Classpath 中使用冒号分割多个路径,并且按照定义的顺序进行通配符解析。如下所示,任何文件系统解析出来的路径始终是 lib 目录的 jar 包在 lib2 目录的 jar 包之前。 ```Bash .:/home/username/demo/lib/*:/home/username/demo/lib2/* ``` JVM 在解析通配符 * 时,最终会调用系统函数 opendir、readdir 读取遍历目录。ext4 创建文件的顺序与实际 readdir 读取的顺序不一致的原因主要在于 ext 系列文件系统有个 feature,即 dir_index,用于加快查找目录项(可直接计算其 hash 值定位到它的目录项),目录项也便成了以 hash 值大小进行排序。通常 dir_index 默认开启,可以通过 / etc/mke2fs.conf 查看默认配置。 创建一个 test_readdir.c 文件,用 C 语言实现一个 demo。通过调用系统 readdir 遍历目录,并且打印文件的 d_off、d_name 属性值。编译、执行命令如下所示: **编译** ```Shell gcc test_readdir.c -o test_readdir.out ``` **执行** ```Shell ./test_readdir.out /home/user/testdir ``` test_readdir.c 文件 ```C #includetypes.h> #include #include #include int main(int argc, char *argv[]) { DIR *dir; struct dirent *ptr; int i; if(argc==1) { dir = opendir("."); } else { dir = opendir(argv[1]); printf("%s\n",argv[1]); } while((ptr = readdir(dir))!=NULL) { printf(" d_off:%ld d_name: %s\n",ptr->d_off,ptr->d_name); } closedir(dir); return 0; } ``` **运行结果** 分别在 ext4、xfs 文件系统上按顺序创建 m1~m10 文件,然后查看运行结果。对比发现 readdir 函数在不同文件系统中都是按照 d_off 属性值从小到大顺序进行遍历,不同的是 xfs 文件 d_off 的值按照创建时间依次增大,而 ext4 和文件的创建顺序无关。 ext4 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/11/102542o2ajtbw1owvfrqdq.png) xfs ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/11/102550ea9dgmc0odlieo6r.png) ## 解决办法&修复方法 可以将需要加载的主类所在的 jar 包存放在新创建的文件目录 libmain 下,并且将 libmain 目录放在 lib 目录之前,则指定 Classpath 路径的顺序如下所示: ```Bash .:/home/user/demo/libmain/*:/home/user/demo/lib/* ``` # 后记 如果遇到相关技术问题(包括不限于毕昇 JDK),可以进入毕昇 JDK 社区查找相关资源(点击[阅读原文](https://www.openeuler.org/zh/other/projects/bishengjdk/)进入官网),包括二进制下载、代码仓库、使用教学、安装、学习资料等。毕昇 JDK 社区每双周周二举行技术例会,同时有一个技术交流群讨论 GCC、LLVM、JDK 和 V8 等相关编译技术,感兴趣的同学可以添加如下微信小助手,回复 Compiler 入群。 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/11/102630rvfhk390y0cvvrvi.jpg) 原文转载自 openEuler-[JVM 中不正确的类加载顺序导致应用运行异常问题分析](https://mp.weixin.qq.com/s/nSl-xWbB3GKfm2AwxkHK6Q)
  • [技术干货] 教程
    精度整数(不使用小数点或指数计数法)最多为 15 位。实例var x = 999999999999999;   // x 为 999999999999999var y = 9999999999999999;  // y 为 10000000000000000尝试一下 »小数的最大位数是 17,但是浮点运算并不总是 100% 准确:实例var x = 0.2+0.1; // 输出结果为 0.30000000000000004尝试一下 »八进制和十六进制如果前缀为 0,则 JavaScript 会把数值常量解释为八进制数,如果前缀为 0 和 "x",则解释为十六进制数。实例var y = 0377;var z = 0xFF;尝试一下 »lamp    绝不要在数字前面写零,除非您需要进行八进制转换。 默认情况下,JavaScript 数字为十进制显示。但是你可以使用 toString() 方法 输出16进制、8进制、2进制。实例var myNumber=128;myNumber.toString(16);   // 返回 80myNumber.toString(8);    // 返回 200myNumber.toString(2);    // 返回 10000000尝试一下 »无穷大(Infinity)当数字运算结果超过了JavaScript所能表示的数字上限(溢出),结果为一个特殊的无穷大(infinity)值,在JavaScript中以Infinity表示。同样地,当负数的值超过了JavaScript所能表示的负数范围,结果为负无穷大,在JavaScript中以-Infinity表示。无穷大值的行为特性和我们所期望的是一致的:基于它们的加、减、乘和除运算结果还是无穷大(当然还保留它们的正负号)。实例myNumber=2;while (myNumber!=Infinity){    myNumber=myNumber*myNumber; // 重复计算直到 myNumber 等于 Infinity}尝试一下 »除以0也产生了无限:实例var x = 2/0;var y = -2/0;尝试一下 »NaN - 非数字值NaN 属性是代表非数字值的特殊值。该属性用于指示某个值不是数字。可以把 Number 对象设置为该值,来指示其不是数字值。你可以使用 isNaN() 全局函数来判断一个值是否是 NaN 值。实例var x = 1000 / "Apple";isNaN(x); // 返回 truevar y = 100 / "1000";isNaN(y); // 返回 false尝试一下 »除以0是无穷大,无穷大是一个数字:实例var x = 1000 / 0;isNaN(x); // 返回 false尝试一下 »数字可以是数字或者对象数字可以私有数据进行初始化,就像 x = 123;JavaScript 数字对象初始化数据, var y = new Number(123);实例var x = 123;var y = new Number(123);typeof(x) // 返回 Numbertypeof(y) // 返回 Object尝试一下 »实例var x = 123;             var y = new Number(123);(x === y) // 为 false,因为 x 是一个数字,y 是一个对象尝试一下 »
  • [热门活动] 1024程序员节-【星云闪耀1024<AI能量星球>】AI控制登月器着陆——破解分享
    为了增加我们中将的概率达到100人开启的宝箱 本仙女特意给大家来个普及1024如何开发的小文章 心情好一日俩更 勿催~还没开始的小伙伴点击链接:https://bbs.huaweicloud.com/forum/thread-161030-1-1.html  和小助手一起来做吧认真阅读要求:修改max什么的参数值  在后面一个单元添加什么命令  (这个命令应该是唯一的所以尽量自己做哈)1:点击开始实验2:点击runinmodelarts找到:修改max什么的参数值 默认是100我们可以修改为50or任何一个数字复制开题中的要求  !env | grep PROJECT_ID点击run all cells等待着~漫长而又快乐~如此这般 这般如此  id就出来了  回帖后小助手就会给你发有效的链接:切记一定要用java运行 不要用python或则其他工具如果电脑没有安java可以试试华为云的云端devcloud java开发环境  非常nice哦给大家一个小提示:如果在破解完小助手的代码后 打开链接右上角显示参数错误  就是整错了  后台不会有数据的!
  • [毕昇JDK] 【技术剖析】8. 相同版本 JVM 和 Java 应用,在 x86 和AArch64 平台性能相差30%,何故?
    ## 作者: 吴言 > 编者按:目前许多公司同时使用 x86 和 AArch64 2 种主流的服务器。这两种环境的算力相当,内存相同的情况下:相同版本的 JVM 和 Java 应用,相同的 JVM 参数,应用性能在不同的平台中表现相差 30%,x86 远好于 AArch64 平台。本文分析了一个应用在 AArch64 平台上性能下降的例子,发现 JVM 的 CodeCache 大小是引起这个性能问题的根源,进而研究什么导致了不同平台上 CodeCache 大小的不同。最后笔者给出了不同平台中该如何设置参数规避该问题。希望本文能给读者一些启示:当使用不同的硬件平台时需要关注底层硬件对于上层应用的影响。 业务在 x86 和 AArch64 上同时部署时(相同的 JDK 和 Java 应用版本),发现 AArch64 平台性能下降严重问题。进一步查看日志,发现在 AArch64 平台中偶有如下情况: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/10/165449eheaobshkkdyjvwj.png) 这代表 JVM 中的 `CodeCache` 满了,导致编译停止,未编译的方法只能解释执行,进而严重影响应用性能。那什么是 `CodeCache`? # CodeCache 是什么 简单来说,`CodeCache` 用于存放编译后的方法,主要分为三部分: 1. `Non-nmethods`:包括运行时 Stub,Adapter 等; 2. `Profiled nmethod`:包括会采集信息的方法,即分层编译中第 2、3 层的方法; 3. `Non-Profiled nmethods`:包括不采集信息的方法,即分层编译中第 1、4 层的方法,也包括 JNI 的方法。 注:分层编译指的是 JVM 同时存在 C1 和 C2 两种编译器,C1 做一些简单的编译优化,耗时较短,C2 做更多复杂的编译优化,性能较好,编译耗时较多。分层编译的触发在 JVM 内会根据相应的条件进行触发,关于更多分层编译相关知识可以参考相关资料 [1]。 在 JDK 9 之后 [2],这些会分配到不同的区域(使用不同区域的优点:查找、回收等),JDK 8 中会分配到同一块区域。 JVM 平时会清理一些不可达的方法,例如由于退优化等产生的死方法,另外 `UseCodeCacheFlushing` 选项(默认开启),还会清理较老以及执行较少的方法。一旦 `CodeCache` 满了之后,会停止编译,直到 `CodeCache` 有空间,若关闭了 `UseCodeCacheFlushing` 选项,则会直接永久停止编译。 不同的 JVM 版本以及不同的参数,默认的 `CodeCache` 大小不同。JDK 11 中默认参数下 `CodeCache` 大小为 240M,若想获取(确认)默认情况下的 `CodeCache` 大小,建议使用 `- XX:+PrintFlagsFinal` 选项获取 `ReservedCodeCache` 的大小。 `CodeCache` 大小主要通过以下选项调节: | Option | Description | | ---- | ---- | | InitialCodeCacheSize | 初始的 CodeCache 大小(单位字节) | | ReservedCodeCacheSize | 预留的 CodeCache 大小,即最大CodeCache 大小(单位字节) | | CodeCacheExpansionSize | CodeCache 每次扩展大小(单位字节) | 使用 `–XX:+PrintCodeCache` 选项可以打印应用使用的 `CodeCache` 情况,如下: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/10/165821hkyahcfaigtmuzzo.png) 其中 `max_used` 表示应用中使用到的 `CodeCache` 大小,据此可以设置合适的 `ReservedCodeCacheSize` 值。 # AArch64 vs x86_64 我们都知道 AArch64 和 x86 分别为 RISC 和 CISC 架构,因此代码密度方面存在一定差异,在这篇文章 [3] 中比较了不同指令集下手写汇编的大小,可以看到 AArch64 的代码密度是 RISC 架构中较优的,但相比 x86_64 仍稍差些(其中 RISC 最差,m68k 最好)。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/10/165852wriojhzz828dq5pd.png) 另外笔者选用业界通用的 java 测试套 dacapo[4] 比较 AArch64 和 x86_64 下 `CodeCache` 占用的大小。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/10/165915oga4aq9iswtlcjgi.png) 可以看到,在 AArch64 架构下,`CodeCache` 均比 x86_64 要大,但根据不同场景,大小差距不同,在 5%-20% 之间。因此在我们发现相同应用在 x86 和 AArch64 上时,`CodeCache` 大小需要进行相应的调节。 除此之外,还需要注意 `InlineSmallCode` 选项,JVM 只会 `inline` 代码体积比该值小的方法。JVM 通过 `inline` 可以触发更多的优化,因此 `inline` 对于性能提升也很重要。在 JDK 11 中,`InlineSmallCode` 在 x86 下的默认值为 2000 字节,在 AArch64 下的默认值为 2500 字节。而 JDK 8 中,`InlineSmallCode` 在 x86 和 AArch64 下默认值均为 2000 字节。因此建议迁移时也相应修改 `InlineSmallCode` 的值。业务通过对 `CodeCache ` 相关参数的调整,达到助力 JIT 的最佳编译效果。 # 后记 如果遇到相关技术问题(包括不限于毕昇 JDK),可以进入[毕昇 JDK 社区](https://www.openeuler.org/zh/other/projects/bishengjdk/)查找相关资源,包括二进制下载、代码仓库、使用教学、安装、学习资料等。毕昇 JDK 社区每双周周二举行技术例会,同时有一个技术交流群讨论 GCC、LLVM、JDK 和 V8 等相关编译技术,感兴趣的同学可以添加如下微信小助手,回复 Compiler 入群。 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202111/10/1700185zsa6iqkhnpdz07g.jpg) # 参考 [1]http://cr.openjdk.java.net/~thartmann/talks/2017-hotspot_under_the_hood.pdf [2]https://bugs.openjdk.java.net/browse/jdk-8015774 [3]http://web.eece.maine.edu/~vweaver/papers/iccd09/ll_document.pdf [4]http://dacapobench.org/
  • [技术干货] [2.17Studio]进行用友2.0.0 UBrowser拾取的方法/金蝶85版本适配/Java应用拾取/Java桌面应用
    从4.1版本的设计器开始,可以免去下面繁琐的操作,建议使用4.1版本的设计器,具体安装见本帖2楼-------------------------------------------------------------------------------如果是操作1.8版本的Java,如用友2.0.0的2022版本,如下路径所示,可以直接使用10楼的方法,跳过后面的步骤。用户目录>Appdata>Local>UClient>share>java1.8.0_202-x64===========================================部分老的Java桌面程序也可以使用这种方法。操作思路:1、通过找到java/javaw的进程来找到程序的安装目录2、找到jre文件夹判断Java程序的版本是32位还是64位(可以通过查找安装目录里java.exe的文件,如果有多个,则每个目录都尝试一下找到jre目录,在CMD窗口使用java.exe -version来查看版本,注意并非见到32就是32位,见下图是64 Bit)3、导入java官方提供的bridge包实现拾取功能2021.12.25补充======已知可以适配的客户端有:(如果有其他,大家可以跟帖补充)1、用友2.0.02、金蝶EAS V8.5.0 / BOS 企业版8.5.03、华为U2000客户端4、用友 NC6.5 (Java1.7_64位)当前用友U8+应该不是Java框架,所以无法使用这种方法;可以使用桌面应用click+模拟人工+像素偏移(模拟人工选True后就出现了)的方式完成。在3.3.1以及以后的版本做了适配,增加name为空时的定位的修正,如果遇到特殊情况无法进行元素校验的,可以尝试在窗体标题的后面增加一个*来统配(如采购入库单页面操作)。======1、打开用友的客户端并打开要操作的系统。或者打开要操作的软件系统 按照①②③步骤打开,用友插件的系统的安装目录。注意识别是图的这个javaw.exe的图标,必须是在打开了用友软件以后进行,目的是让系统加载了javaw.exe.2、根据安装路径里是32位还是64位,进行相应的文件包复制粘贴找到软件安装目录后按照如下的操作可以完成设置,如果没有文件夹标明版本,则可以通过java.exe -version来查看版本注意:64位的javaw应用系统只能保留64位相应的dll,32位的javaw应用试用32位的dll。32位的dll复制进64位的目录后会引起系统默认加载32位的dll,从而仍是无法拾取。附件下载并解压后,如下所示:可以将文件夹里的内容直接复制到第一步打开的目录里即可,如果有文件覆盖,则选择覆盖。如下是演示32位java安装到系统里时的安装方式。安装目录在C:Program Files (x86)Javajre6     32位为例,64位可参考后面的跟帖 把压缩包里面的文件copy到本机的目录accessibility.properties=> C:Program Files (x86)Javajre6libaccess-bridge-32.jar=> C:Program Files (x86)Javajre6libextjaccess.jar=> C:Program Files (x86)Javajre6libextJavaAccessBridge-32.dll => C:Program Files (x86)Javajre6in JAWTAccessBridge-32.dll=> C:Program Files (x86)Javajre6in WindowsAccessBridge-32.dll => C:WindowsSysWOW64---可以放到前面的bin里WindowsAccessBridge-64.dll => C:WindowsSystem32---可以放到前面的bin里然后就可以使用 jab的工具AccessBridgeExplorer.exe来查看应用的控件了,或者就能用app录制了3、然后屏幕右下角退出用友,然后再从桌面启动用友。4、启动studio进行拾取即可,如果还不行则可能需要管理员权限运行。如果有异常可以对照本帖后面的跟帖来检查
  • [全栈开发者] 【Java编程创造营】第三阶段·最终考核
    经过一个多月的学习,相信大家对Java有了进一步的了解和认知我们迎来了第二阶段的最终考核请大家认真阅读考核要求,避免无法考核认证*报名活动才能参加最终考核考核截止时间11月04日(超出考核时间不计入成绩)请遵守考试秩序,考试之前请务必仔细阅读以下注意事项:1)正式考试前请确定邮箱已绑定,如未绑定的,请登录华为云官网,按照出现的页面完成邮箱绑定。2)考试请使用Google Chrome(48版本以上)浏览器完成。3)考试次数为5次,请珍惜考试机会。每次考试会从题库中随机抽题。4)考试时间为40分钟,考试期间无法暂停,一旦超时,系统将自动提交试卷。交卷后即可查看到成绩。5)考试共25题,题型包括判断、单选和多选,总分100分。6)考试过程中若有截屏或切屏行为,系统将发出警告,切屏次数达到5次,系统将自动提交试卷7)点击开始考试后,请耐心等待系统抽题,切勿重复刷新页面,否则导致题目抽取错误,成绩将会被作废。集齐三阶段电子证书可获得【Java编程创造营】结业实体证书考核流程点击下方链接进行Java开发技能考核点击进行Java开发技能测评(高级)将成绩截图及最高成绩回复到本帖阶段学习排行榜不仅有学习纪念证书,我们还为参与学习打卡的同学准备了实物奖品奖励通过获取积分,积分排行的方式获得奖励(以下奖励获取需满足积分≥30分)1)学习打卡赢积分点此学习Java学习路线序号阶段任务详情活动积分奖励附加奖励提交入口1每章随堂测试任务完成方式:在随堂测试打卡帖中,回复对应章节的随堂    回复格式:华为云ID+截图(露出右上角华为云ID,且有效回复次数≥1)2分 /每有效打卡/每章节在提交随堂测试的用户中,抽取1名幸运奖励华为云定制鼠标*1点击前往2每周学习笔记分享任务完成方式:在学习笔记征集帖中,回复本周课程内容的学习笔记    回复格式:华为云ID+笔记内容(字数≥200字)2分 /每有效打卡/每周在本提交学习笔记的用户中,抽取1名幸运奖励华为云定制鼠标*1敬请期待点击前往3相关文章征集任务完成方式:本学习阶段任意时间内,在“华为云-博客”,发表与学习内容相关的任意原创博客内容,将文章链接回复到指定帖内    回复格式:华为云ID+博客文章链接(字数≥600字)5积分 /每篇有效心得/每阶段 最高10/每阶段每阶段选取1篇最佳博文,奖励机械键盘*1点击前往4问答官排位赛任务完成方式:用户可在相关活动帖中发布自己学习中的疑惑或实践问题,其他用户可参与回答。由专家评审,同一问题下确定一名最佳答案。回复格式:华为云ID+提问的问题/解答答案5积分/每有效问题(最高10分)2积分/每有答复(最高4分)最终会全部每阶段参与互动的用户中,抽取3位幸运奖奖励华为云定制鼠标*1点击前往5完成阶段沙箱实验完成规定的沙箱实验20分/ 沙箱实验/点击前往6完成相关微认证完成规定的微认证并获得微认证证书30分/认证/点击前往注意事项:○获奖名单将在活动结束后3个工作日内公示。如有异议请于【华为云课程小助手】联系○所有活动奖品将在活动公示后15个工作日内完成发放;○活动奖品颜色、型号随机,且部分奖品数量有限发完即止,,若有缺货或其他情况将替换为同价值的其他奖品;○本次活动回帖内容需满足华为云论坛发帖规范:https://bbs.huaweicloud.com/forum/thread-23077-1-1.html想了解更多关于课程内容请移步主帖:https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=125761
  • [问题求助] 请问版主,我想通过Java代码传递一些参数通过服务编排给参数指定的用户发送5G消息该如何做?
    有参考的链接吗,或者demo项目,说一下大概流程,万分感谢。
  • [问题求助] 【IoTDA产品】【JavaSDK功能】找不到fasterxml中JsonReadFeature
    【功能模块】IoTDA平台api的JavaSDK中,获取各种信息时【操作步骤&问题现象】运行出错报找不到com.fasterxml.jackson.core.json.JsonReadFeature查看com.fasterxml.jackson.core.json后发现没有JsonReadFeature类【截图信息】【日志信息】(可选,上传日志内容或者附件)Exception in thread "main" java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/json/JsonReadFeature    at com.huaweicloud.sdk.core.utils.JsonUtils.initializeBaseMapper(JsonUtils.java:100)    at com.huaweicloud.sdk.core.utils.JsonUtils.<clinit>(JsonUtils.java:73)    at com.huaweicloud.sdk.core.HcClient.extractResponse(HcClient.java:355)    at com.huaweicloud.sdk.core.HcClient.syncInvokeHttp(HcClient.java:173)    at com.huaweicloud.sdk.core.HcClient.syncInvokeHttp(HcClient.java:141)    at com.huaweicloud.sdk.core.auth.BasicCredentials.processAuthParams(BasicCredentials.java:96)    at com.huaweicloud.sdk.core.ClientBuilder.build(ClientBuilder.java:113)    at com.Main.Shiwei.main(Shiwei.java:51)Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.core.json.JsonReadFeature    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:636)    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:182)    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:519)    ... 8 more
  • [问题求助] java 方式 obs 文件获取问题
    华为 obs 文件服务; 通过java 的方式 获取 桶内 所有对象 ,为何老是报 403 ,有遇到过这种问题吗? ; 直接调用 获取用户创建的通列表 或者直接获取指定文件也是可以的; 
  • [互动交流] java obs上传出现Exception in thread &quot;main&quot; java.lang.UnsupportedClas
    Exception in thread "main" java.lang.UnsupportedClassVersionError: okhttp3/RequestBody : Unsupported major.minor version 52.0
  • [二次开发] 【MRS产品】【HDFS二次开发】已配置Maven加载包运行HdfsExample.java类
    [问题求助-二次开发]已配置Maven怎么样加载包运行HdfsExample.java类【功能模块】二次开发【操作步骤&问题现象】1.已安装java2.已安装mven3.已从github下载相应的样例代码 https://github.com/huaweicloud/huaweicloud-mrs-example/tree/mrs-3.1.15.maven目录conf文件4.idea已经配置mevn路径6.加载包5.已经加载完之后运行HdfsExample.java【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] Java Demo获取Token出错
    利用官网的Java Demo获取Token时,不能正常获取,显示错误1、按照官网的提示,一步步来的2、运行后提示如下,不能正常获取Token【日志信息】(可选,上传日志内容或者附件)
  • [互动交流] java.lang.NoSuchMethodError: okhttp3.RequestBody.create
    Obsobject = this.obsClient.getObject(bucket, fileName); 报错Caused by: java.lang.NoSuchMethodError: okhttp3.RequestBody.create(Ljava/lang/String;Lokhttp3/MediaType;)Lokhttp3/RequestBody;
  • [全栈开发者] 【Java编程创造营】第三阶段·技术文章征集帖
    为了巩固大家的学习成果,紧跟学习进度请将需要完成的相关技术文章内容按要求回复到本帖下方按要求格式回复即可获得积分累计阶段奖品,还能有机会获得附加幸运奖哦~打卡时间2021.09.06-2021.10.24 23:59征集要求1.本学习阶段任意时间内,在【华为云】-【博客】发表与Java相关的任意博客内容,可以是开发技术技巧,可以是开发心得体会,不可以发布课程笔记作为博文,将文章链接回复至本帖内2.文章需为原创,在发布博客时,需要勾选文章创作类型:原创文章一项。用户承诺,发表的文章不存在任何知识产权问题并自行承担全部责任3.文章字数≥600字,图文并茂,不得抄袭网站课程,需写自己的理解和技术分享4.回复格式:华为云ID+博客文章链接5.如果曾在外部博客发表过的文章,可将文章迁移到华为云博客即可6.技术文章由华为技术专家评审,评审通过会对应的积分,不过专家会给出对应的评语且积分为0奖励方式每阶段每篇有效博客文章可获得5积分,每阶段获取上限10分,每阶段评选1篇最佳博文,奖励定制机械键盘~ 全系列活动奖励本次活动不仅免费跟大牛学习技术,更有积分大礼等着大家~每次有效提交的学习任务都会得到对应积分,赢取智能硬件,还有华为无线耳机、机械键盘等你拿!点击了解Java编程创造营专属福利活动注意事项1. 学习任务提交后,小助手会在本阶段学习周期内,按序完成审核,并增加活动积分;2. 本次活动通过完成客观题打卡任务,可获得的积分上限为5分/每篇;3. 请务必按照上述要求提交内容,以免影响积分增加;4. 若积分值相同则以完成学习任务的时间先后排序,其中任务完成时间的判定优先级为:相关微认证>阶段沙箱实验>每周学习笔记>问答官排位赛>每章随堂测验打卡5. 其他积分获取方式请查看活动社群公告。想了解更多关于课程内容请移步主帖:https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=125761
  • [全栈开发者] 【Java编程创造营】第三阶段·问答官排位赛活动帖
    为了巩固大家的学习成果,紧跟学习进度为大家提供学习交流的平台,推出问答官排位赛活动按要求格式回复即可获得积分累计阶段奖品,还能有机会获得附加幸运奖哦打卡时间2021.09.06-2021.10.24 23:59  参与方式:用户在本帖里发布自己在Java学习中产生的疑惑或实践问题,其他用户可通过在楼层下评论参与回答。  参与规则:1. 同一ID不可自问自答;2. 同一ID可回复其他同一ID问题数量需≤3次,如,A最多可回答B的三个问题,但A可回答B、C、D、E、F等多人次问题。  活动奖励:◎每个有效提问可获得5积分。上限为2个问题,最高10分。◎每个有效回答可获得2积分,上限为2个回答,最高4分。不得灌水,不得与他人显示,问题具有意义,占楼无效。有效提问示例:无效提问示例:◎最终会全部每阶段参与互动的用户中,抽取3位幸运用户,送出旅行本套装*1活动奖励点击了解Java编程创造营专属福利活动注意事项1. 学习任务提交后,小助手会在本阶段学习周期内,按序完成审核,并增加活动积分;2. 本次活动通过完成提交问答官问题,可获得的积分上限为5积分/每有效问题(最高10分)2积分/每有答复(最高4分);3. 请务必按照上述要求提交内容,以免影响积分增加;4. 若积分值相同则以完成学习任务的时间先后排序,其中任务完成时间的判定优先级为:相关微认证>阶段沙箱实验>问答官排位赛>每章随堂测验打卡5. 其他积分获取方式请查看活动社群公告。想了解更多关于课程内容请移步主帖:https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=125761&page=1&extra=#pid1161471
总条数:2301 到第 页
上滑加载中