分享

如何用Eclipse调试JBoss AS 7和WildFly8容器自身

 云端素馆 2015-08-19

概述

在很多情况下,我们需要直接调试 JBoss AS 7 或 WildFly8 自身,来找出容器级别的问题。

本文详细描述如何用Eclipse调试JBoss AS 7和WildFly8。本文以WildFly8-CR1版本为例,它位于/home/ems/jboss/wildfly-8.0.0.CR1/ 目录之下。JBoss AS 7的调试方法相同。

本文参考了链接

1. WildFly8启动参数研究

我们在Linux操作系统下,启动WildFly8,然后查看其进程信息。

1.1 启动 WildFly8

我们用下面绿色命令启动WildFly8:
-bash-4.1$ ./standalone.sh
=========================================================================

  JBoss Bootstrap Environment

  JBOSS_HOME: /home/ems/jboss/wildfly-8.0.0.CR1

  JAVA: /usr/java/jdk1.7.0_13/bin/java

  JAVA_OPTS:  -server -XX:+UseCompressedOops -Xms64m -Xmx512m -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true

=========================================================================

15:35:02,533 INFO  [org.jboss.modules] (main) JBoss Modules version 1.3.0.Final
15:35:03,399 INFO  [org.jboss.msc] (main) JBoss MSC version 1.2.0.CR1
...

1.2 查看WildFly8进程信息

我们用下面绿色命令查看WildFly8进程信息:

-bash-4.1$ ps -ef|grep java
ems      19350 19296 45 15:35 pts/1    00:00:08 /usr/java/jdk1.7.0_13/bin/java -D[Standalone] -server -XX:+UseCompressedOops -Xms64m -Xmx512m -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true -Dorg.jboss.boot.log.file=/home/ems/jboss/wildfly-8.0.0.CR1/standalone/log/server.log -Dlogging.configuration=file:/home/ems/jboss/wildfly-8.0.0.CR1/standalone/configuration/logging.properties -jar /home/ems/jboss/wildfly-8.0.0.CR1/jboss-modules.jar -mp /home/ems/jboss/wildfly-8.0.0.CR1/modules org.jboss.as.standalone -Djboss.home.dir=/home/ems/jboss/wildfly-8.0.0.CR1 -Djboss.server.base.dir=/home/ems/jboss/wildfly-8.0.0.CR1/standalone
ems      19460 19435  0 15:35 pts/2    00:00:00 grep java

1.3 WildFly8进程信息分析

根据1.2的结果,我们可以看到 该命令可以大致分为以下几段:
java ${VM_ARGUMENTS} -jar /home/ems/jboss/wildfly-8.0.0.CR1/jboss-modules.jar ${PROGRAM_ARGUMENTS}
  • ${VM_ARGUMENTS}:虚拟机参数:
-D[Standalone] -server -XX:+UseCompressedOops -Xms64m -Xmx512m -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true -Dorg.jboss.boot.log.file=/home/ems/jboss/wildfly-8.0.0.CR1/standalone/log/server.log -Dlogging.configuration=file:/home/ems/jboss/wildfly-8.0.0.CR1/standalone/configuration/logging.properties
  • ${PROGRAM_ARGUMENTS}:程序参数:
-mp /home/ems/jboss/wildfly-8.0.0.CR1/modules org.jboss.as.standalone -Djboss.home.dir=/home/ems/jboss/wildfly-8.0.0.CR1 -Djboss.server.base.dir=/home/ems/jboss/wildfly-8.0.0.CR1/standalone
简而言之,就是利用 java 虚拟机运行 /home/ems/jboss/wildfly-8.0.0.CR1/jboss-modules.jar。
java运行jar包,本质是运行这个jar包中 META-IN/MANIFEST-MF 文件所定义的Main-Class:
Main-Class: org.jboss.modules.Main


到这里,读者是否已经知道如何用Eclipse调试WildFly8了呢?

2. 用Eclipse调试WildFly8

根据我们在上面的研究,我们执行如下步骤来调试WildFly8。

2.1 创建"Debug Configurations"

  • 点击Eclipse工具条上的 调试按钮(图标是一只虫子)边上的向下的箭头,这将显示一个下拉列表。
  • 下拉列表中,选择"Debug Configurations..."项,这将打开"Debug Configurations"窗口。
              
  • 在 "Debug Configurations"窗口的左侧,右键选中"Java Application",然后点击弹出菜单中的“New”,这将创建一个“New_Configuration”。
               
  • 选中这个“New_Configuration”,右侧就会显示它的一些初始配置。我们下面对它进行一些修改。

2.2 配置新建的"Debug Configurations"

2.2.1 Main标签页

  • Name:改成你期望的名字,比如:"wildfly8_debug" / “wildfly8-CR1_debug”
  • Main Class:输入org.jboss.modules.Main

           

2.2.2 Arguments标签页

  • Program arguments:将上面的 ${PROGRAM_ARGUMENTS} 指代的内容拷贝进来。
  • VM arguments:将上面的 ${VM_ARGUMENTS} 指代的内容拷贝进来。

            

2.2.3 Classpath标签页

  • 选中"Bootstrap Entries"或者"User Entries"
  • 点击右侧的“Add External JARs...”
  • 在弹出的"Jar Selection"窗口中,选择 /home/ems/jboss/wildfly-8.0.0.CR1/jboss-modules.jar。

           

2.2.4 应用上述修改

点击"Debug Configurations"窗口底部的"Apply"按钮,应用上述修改。

2.3 启动"Debug Configurations"

点击"Debug Configurations"窗口底部的"Debug"按钮,我们就可以看到,Eclipse就开始调试 wildfly8 了。


注意:windows中 与 linux中 调试JBoss AS的区别:
  • windows下调试时,需要去除上述VM参数中的 -XX:+UseCompressedOops,windows下的虚拟机不能识别该参数。
  • windows下的JBoss AS 安装路径(比如:D:/java/wildfly-8.0.0.CR1_njnms/ ) 替换掉 上面Linux下的JBoss AS安装路径(这里为:/home/ems/jboss/wildfly-8.0.0.CR1/)
.

2.4 调试JBoss AS 7 / Wildfly8 的某个模块

我们在下面以 JAAS登陆模块(Login Module)为例 描述如何调试JBoss AS 7 /Wildfly8 的某个模块。其它功能模块的调试做法相似。

2.4.1 JAAS登陆模块介绍

本文在standalone.xml中用的是 org.jboss.security.auth.spi.DatabaseServerLoginModule,我们通过搜索,发现 DatabaseServerLoginModule 属于picketbox项目。在JBoss AS 7 / Wildfly8中的位置:${JBOSS_HOME}\modules\system\layers\base\org\picketbox\main\picketbox-4.0.20.Beta2.jar。

根据 JBoss Maven Repository地址 一文,我们得知,picketbox-4.0.20.Beta2.jar的源代码位于:
https://repository./nexus/content/groups/public/org/picketbox/picketbox/4.0.20.Beta2/picketbox-4.0.20.Beta2-sources.jar

2.4.2 创建调试项目

现在我们需要用Eclipse创建一个普通的Java项目,便于我们查看被调试的jar包(本文为picketbox-4.0.20.Beta2.jar)的源代码(本文为picketbox-4.0.20.Beta2-sources.jar)。

项目结构设置如下:
       

项目的classpath以及jar包的源代码路径设置如下:
       
注意 Source attachment设置!

2.4.3 调试配置设置

我们将该项目添加到"调试配置"的项目中,如下:
       


接着将 picketbox-4.0.20.Beta2-sources.jar 添加到"调试配置"的source中,如下:
       

       


现在,我们在按下"Ctrl+T"组合键,然后输入DatabaseServerLoginModule,回车,就能够看到 DatabaseServerLoginModule.class被打开了,我们实际看到的是该class对应的源代码文件DatabaseServerLoginModule.java!

现在 DatabaseServerLoginModule.java中打上断点,
     


我们停止前面的调试,再次运行 “wildfly8-CR1_debug”调试配置,也就是点击下图中的debug按钮,
     


当JBoss AS 7 / Wildfly8 即将执行 断点处的代码时,eclipse就会在该断点处停下来!
你就可以开始调试 DatabaseServerLoginModule.class 了!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多