Winse Blog

走走停停都是风景, 熙熙攘攘都向最好, 忙忙碌碌都为明朝, 何畏之.

WebStart的使用以及如何结合JVMTI

当新技术叠加老功能时总能把人折磨一番,新仇加旧恨,原本的老功能也不是熟到透,然后还得去结合新功能,真的简直要人命。

最近有上新功能,把Swing客户端的代码通过webstart的方式发布给客户用,这样用户只需要点击网页上的链接,就可以使用Swing客户端了。感觉体验上还是厉害不少的,只是感觉啊!现实往往更残酷,我们先避开不谈。

首先简单的介绍下webstart、jnlp的一些知识,然后讲讲怎么结合jvmti、以及过程中遇到问题时定位查找解决的一些小知识点。

JNLP

为了便于借鉴参考,我这里用的是 jre1.8.0_162

签名:

1
jarsigner.exe -keystore Keystore application.jar alias

说说调试:

  • 首先你得安装jre,不然Windows的控制面板没有Java这一项!
  • 然后打开 Java控制面板 - 高级 - 调试 的选项。刚开始调试可以同时把 Java控制台 也显示出来
  • 远程调试 选项在 Java控制面板 - Java - Java运行时环境设置 - 运行时参数 添加!

参考

缓冲:

目录

1
C:\Users\winse\AppData\LocalLow\Sun\Java\Deployment

调出 Java高速缓冲查看器 界面

1
javaws -viewer

证书:

证书是用jre对应目录下的: jre1.8.0_162\lib\security\cacerts

结合JVMTI(仇恨点)

既然都是agent,那么加载时机也同样有两种:启动时(Agent_OnLoad)和运行时Attach(Agent_OnAttach)。

动态loadAgent

修改加载 动态链接库dll 的方式:

默认是不能在程序里面动态修改加载库地址的 JDK-4280189 : loadLibrary() fails to load a shared lib whose path is in java.library.path

  1. 修改环境变量PATH,-Djava.library.path
  2. 运行时动态修改java.library.path:usr_paths/sys_paths
  3. 把dll拷贝到环境变量PATH的一个路径下面

参考

解决 DLL依赖 问题的终极完美方法:

  1. The directory where the executable module for the current process is located.
  2. The current directory.
  3. The Windows system directory. The GetSystemDirectory function retrieves the path of this directory.
  4. The Windows directory. The GetWindowsDirectory function retrieves the path of this directory.
  5. The directories listed in the PATH environment variable.

You might need to use something such as Dependency Walker to trace the set of DLL dependencies.

把所有的库全部按依赖顺序执行一遍 System.loadLibrary !!

com.sun.tools.attach.AttachNotSupportedException: no providers installed

  1. 你没有使用sun jdk
  2. 你使用了sun jdk,并且JAVA_HOME指向了这个jdk,但是你的path下的”java”命令不是这个jdk里面的java,而是操作系统给你默认安装的jre下的,如c:\Program Files\java..

小结

最傻瓜式的点击就能运行是最佳体验,我们暂时不能通过控制面板添加 -agentlib:lib 的方式来初始化JVMTI。最终通过以上添加tools.jar的VirtualMachine.loadAgentLibrary运行时attach方式来实现。

–END

Comments