当新技术叠加老功能时总能把人折磨一番,新仇加旧恨,原本的老功能也不是熟到透,然后还得去结合新功能,真的简直要人命。
最近有上新功能,把Swing客户端的代码通过webstart的方式发布给客户用,这样用户只需要点击网页上的链接,就可以使用Swing客户端了。感觉体验上还是厉害不少的,只是感觉啊!现实往往更残酷,我们先避开不谈。
首先简单的介绍下webstart、jnlp的一些知识,然后讲讲怎么结合jvmti、以及过程中遇到问题时定位查找解决的一些小知识点。
JNLP
为了便于借鉴参考,我这里用的是 jre1.8.0_162
- docs https://docs.oracle.com/javase/tutorial/deployment/webstart/developing.html
- example https://docs.oracle.com/javase/tutorial/deployment/webstart/running.html
- syntax https://docs.oracle.com/javase/8/docs/technotes/guides/javaws/developersguide/syntax.html
- 使用 WebStart 发布 RCP 应用程序
- Launching Java WebStart from the Command Line
签名:
1
|
|
说说调试:
- 首先你得安装jre,不然Windows的控制面板没有Java这一项!
- 然后打开
Java控制面板 - 高级 - 调试
的选项。刚开始调试可以同时把Java控制台
也显示出来 - 远程调试 选项在
Java控制面板 - Java - Java运行时环境设置 - 运行时参数
添加!
参考
- Remote debugging java web start under JVM 1.8
- Development Tips https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/plugin004.html
- Configuration Problems https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/plugin001.html
- https://docs.oracle.com/javase/1.5.0/docs/guide/javaws/developersguide/troubleshooting.03.06.html
- How can I debug applications under Java Web Start (JNLP)?
- Java - Associating JNLP files on Windows without using the Control Panel
缓冲:
目录
1
|
|
调出 Java高速缓冲查看器 界面
1
|
|
证书:
证书是用jre对应目录下的: jre1.8.0_162\lib\security\cacerts
- Installing Trusted Certificates into a Java Keystore
- Adding certificate to keystore using java code
- How to import a .cer certificate into a java keystore?
- SSL : Download Certificate Chain From A Remote Host And Add The Certificates To A Local Keystore
结合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 。
- 修改环境变量PATH,-Djava.library.path
- 运行时动态修改java.library.path:usr_paths/sys_paths
- 把dll拷贝到环境变量PATH的一个路径下面
参考
- JNI in Java Web Start / Applet environment
- How to Load a Java Native/Dynamic Library (DLL)
- 动态替换目标进程的Java类
解决 DLL依赖 问题的终极完美方法:
- The directory where the executable module for the current process is located.
- The current directory.
- The Windows system directory. The GetSystemDirectory function retrieves the path of this directory.
- The Windows directory. The GetWindowsDirectory function retrieves the path of this directory.
- The directories listed in the PATH environment variable.
- Is it possible to add a directory to DLL search path from a batch file or cmd script?
- Can’t find dependent libraries
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
- 你没有使用sun jdk
- 你使用了sun jdk,并且JAVA_HOME指向了这个jdk,但是你的path下的”java”命令不是这个jdk里面的java,而是操作系统给你默认安装的jre下的,如c:\Program Files\java..
小结
最傻瓜式的点击就能运行是最佳体验,我们暂时不能通过控制面板添加 -agentlib:lib
的方式来初始化JVMTI。最终通过以上添加tools.jar的VirtualMachine.loadAgentLibrary运行时attach方式来实现。
–END