当新技术叠加老功能时总能把人折磨一番,新仇加旧恨,原本的老功能也不是熟到透,然后还得去结合新功能,真的简直要人命。
最近有上新功能,把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
签名:
jarsigner.exe -keystore Keystore application.jar alias
说说调试:
- 首先你得安装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
缓冲:
目录
C:/Users/winse/AppData/LocalLow/Sun/Java/Deployment
调出 Java高速缓冲查看器
界面
证书:
证书是用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)。
-
谈谈Java Intrumentation和相关应用
-
基于jvmti方式加密java
-
Java千百问 08JDK详解(013)
JVMTI是什么
-
动态替换目标进程的Java类
动态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依赖 问题的终极完美方法:
-
Search Path Used by Windows to Locate a 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
-
http://www.chenjianjx.com/myblog/entry/com-sun-tools-attach-attachnotsupportedexception
- 你没有使用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
原文
http://www.winseliu.com/blog/2018/04/07/java-webstart-jnlp-with-jvmti/