转载

WebStart的使用以及如何结合JVMTI

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

最近有上新功能,把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高速缓冲查看器 界面

javaws -viewer

证书:

证书是用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

  • dynamic-attach-jvm

修改加载 动态链接库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的一个路径下面

参考

  • 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
  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.
  • 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
  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

原文  http://www.winseliu.com/blog/2018/04/07/java-webstart-jnlp-with-jvmti/
正文到此结束
Loading...