java - JNLP 中的 JVM 类加载器跟踪选项

标签 java debugging jnlp

我正在尝试调试通过 JNLP 运行的 Java 客户端中的类加载问题。但是 -XX:+TraceClassLoading 只打印“Loaded”事件并且只针对核心类。另一个选项 -verbose:class 什么都不做。我尝试用 D 和 X 作为前缀,但没有效果。

当我在桌面 java 应用程序中使用 -verbose:class 时,它会打印所有事件,但错误不会出现在此处。

我是不是遗漏了什么或者是否有其他方法可以跟踪 JNLP 中的类加载?

编辑:
我尝试过的示例(这是 javaws 调用扩展成的内容):

/usr/lib/jvm/jdk1.8.0_161/jre/bin/java -classpath /usr/lib/jvm/jdk1.8.0_161/jre/lib/deploy.jar -Djava.security.policy=file:/usr/lib/jvm/jdk1.8.0_161/jre/lib/security/javaws.policy -DtrustProxy=true -verbose:class -XX:+TraceClassLoading -Xverify:remote -Djnlpx.home=/usr/lib/jvm/jdk1.8.0_161/jre/bin -Djava.security.manager -Djnlpx.origFilenameArg=http://localhost:8080/webstart.jnlp -Djnlpx.remove=false -Dsun.awt.warmup=true -Xbootclasspath/a:/usr/lib/jvm/jdk1.8.0_161/jre/lib/javaws.jar:/usr/lib/jvm/jdk1.8.0_161/jre/lib/deploy.jar:/usr/lib/jvm/jdk1.8.0_161/jre/lib/plugin.jar -Djnlpx.splashport=59367 -Djnlpx.jvm=/usr/lib/jvm/jdk1.8.0_161/jre/bin/java com.sun.javaws.Main -notWebJava http://localhost:8080/webstart.jnlp

JNLP 运行的部分输出(无用户类):

[Loaded java.lang.UNIXProcess$$Lambda$15/1173574345 from java.lang.UNIXProcess]
[Loaded com.sun.javaws.Launcher$CacheUpdateRequiredException from /usr/lib/jvm/jdk1.8.0_161/jre/lib/javaws.jar]
[Loaded java.lang.SecurityException from /usr/lib/jvm/jdk1.8.0_161/jre/lib/rt.jar]
[Loaded com.sun.deploy.security.BlockedException from /usr/lib/jvm/jdk1.8.0_161/jre/lib/deploy.jar]
[Loaded sun.awt.X11.XSystemTrayPeer from /usr/lib/jvm/jdk1.8.0_161/jre/lib/rt.jar]

桌面 java 运行的部分输出(注意 .m2 存储库中的用户类,是的,它在 _151 上运行,但没有区别,我都试过了):

[Loaded <...>.UnmodifiableArrayIterator from file:/home/imaskar/.m2/repository/<...>/1.6-SNAPSHOT/<...>-1.6-SNAPSHOT-jar-with-dependencies.jar]
[Loaded <...>.RCEvent from file:/home/imaskar/.m2/repository/<...>/1.6-SNAPSHOT/<...>-1.6-SNAPSHOT-jar-with-dependencies.jar]
[Loaded <...>.RCMessengerQualityListener$1 from file:/home/imaskar/.m2/repository/<...>/1.6-SNAPSHOT/<...>-1.6-SNAPSHOT.jar]
[Loaded javax.swing.JComponent$$Lambda$124/1794174740 from javax.swing.JComponent]
[Loaded java.util.prefs.FileSystemPreferences$10 from /usr/lib/jvm/jdk1.8.0_151/jre/lib/rt.jar]
[Loaded java.util.prefs.FileSystemPreferences$12 from /usr/lib/jvm/jdk1.8.0_151/jre/lib/rt.jar]
[Loaded java.util.prefs.FileSystemPreferences$11 from /usr/lib/jvm/jdk1.8.0_151/jre/lib/rt.jar]

编辑2:

Here建议将选项传递给 jnlp 的另一种方法,但它也只打印核心类。我想,这是因为选项只传递给第一个 java 调用,它只管理部署,然后对实际应用程序进行另一个调用。

最佳答案

解决方法

  1. 运行 javaws http://localhost:8080/webstart.jnlp 并稍等片刻,以便它部署并启动
  2. 运行 ps -ax | grep Djnlpx 并复制完全展开的 JNLP 调用
  3. 关闭 p1 的申请
  4. -verbose:class(或您想要的任何其他选项)添加到来自 p2 的调用并再次运行。

解释

我发现 javaws 调用扩展了两次。所以,基本调用是

javaws http://localhost:8080/sin-web/webstart.jnlp

如果我尝试在此处添加任何选项,则没有任何效果。 它扩展为

/usr/lib/jvm/jdk1.8.0_151/jre/bin/java
 -classpath
 /usr/lib/jvm/jdk1.8.0_151/jre/lib/deploy.jar
 -Djava.security.policy=file:/usr/lib/jvm/jdk1.8.0_151/jre/lib/security/javaws.policy
 -DtrustProxy=true
 -Xverify:remote
 -Djnlpx.home=/usr/lib/jvm/jdk1.8.0_151/jre/bin
 -Djava.security.manager
 -Djnlpx.origFilenameArg=http://localhost:8080/sin-web/webstart.jnlp
 -Djnlpx.remove=false
 -Dsun.awt.warmup=true
 -Xbootclasspath/a:/usr/lib/jvm/jdk1.8.0_151/jre/lib/javaws.jar:/usr/lib/jvm/jdk1.8.0_151/jre/lib/deploy.jar:/usr/lib/jvm/jdk1.8.0_151/jre/lib/plugin.jar
 -Djnlpx.splashport=44975
 -Djnlpx.jvm=/usr/lib/jvm/jdk1.8.0_151/jre/bin/java
 com.sun.javaws.Main
 -verbose
 -notWebJava
 http://localhost:8080/sin-web/webstart.jnlp

换行符为了可读性,你必须删除它们。如果您将 -verbose:class 放在这里,它只会打印核心类。该调用扩展为:

/usr/lib/jvm/jdk1.8.0_161/jre/bin/java 
-Xmx1g -Xms256m 
-Djnlp.packEnabled=false 
-Xbootclasspath/a:/usr/lib/jvm/jdk1.8.0_161/jre/lib/javaws.jar:/usr/lib/jvm/jdk1.8.0_161/jre/lib/deploy.jar:/usr/lib/jvm/jdk1.8.0_161/jre/lib/plugin.jar 
-Djnlp.tk=awt 
-classpath /usr/lib/jvm/jdk1.8.0_161/jre/lib/deploy.jar -Djnlpx.vmargs=LVhteDFnAC1YbXMyNTZtAC1Eam5scC5wYWNrRW5hYmxlZD1mYWxzZQA= -Djnlpx.jvm=/usr/lib/jvm/jdk1.8.0_161/jre/bin/java 
-Djnlpx.splashport=59367 
-Djnlpx.home=/usr/lib/jvm/jdk1.8.0_161/jre/bin 
-Djnlpx.remove=false 
-Djnlpx.offline=false 
-Djnlpx.relaunch=true 
-Djnlpx.session.data=/tmp/session2497443162302588696 
-Djnlpx.heapsize=NULL,NULL 
-Djava.security.policy=file:/usr/lib/jvm/jdk1.8.0_161/jre/lib/security/javaws.policy 
-DtrustProxy=true 
-Xverify:remote 
-Djnlpx.origFilenameArg=http://localhost:8080/webstart.jnlp 
-Dsun.awt.warmup=true 
-Djava.security.manager 
com.sun.javaws.Main 
-notWebJava 
/home/imaskar/.java/deployment/cache/6.0/1/40a358c1-677ef294

换行符再次提高可读性。如果你把 -verbose:class 放在这里,所有的类事件都会被打印出来。

关于java - JNLP 中的 JVM 类加载器跟踪选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49623617/

相关文章:

Jenkins JNLP Linux 代理 - Ping 超时

java - 使用 SwingEventMonitor 监控其他应用程序?

java - 什么可能是 ParameterizedType 的实例?

java - 文本字段 setBounds 函数不适用于特定 JFrame

c++ - 如何调试FindFirstChangeNotification获取的文件变化通知?

visual-studio - Visual Studio - "attach to particular instance of the process"宏

java - 使用Oracle日期字段中的cachedrowset时如何获取完整的日期和时间数据

java解析JsonObject时出错

c - Linux 内核模块中的 raise(SIGTRAP) 相当于什么?

java - 如何使用 JNLP 下载 Java 7?