java exception in thread main_Exception in thread “main” 终极解决方案

此文章是在AIX操作系统正确安装了CDE前提下进行进行说明的。

在安装了Oracle的服务器上运行dbca 命令,报错:

[oracle@stone_db ~]$ dbca

Exception in thread "main"

[oracle@stone_db ~]$

[oracle@stone_db ~]$ export DISPLAY=1921.68.1.210:0.0

[oracle@stone_db ~]$ dbca

Exception in thread "main"

其实不止是执行dbca会报错,只要执行需要弹出图形窗口的命令都会有这样的问题。

大部分情况下我们会认为是DISPLAY变量的问题,但是也不尽然,我们查看一下dbca的log 日志:

[oracle@stone_db scripts]$ cd $ORACLE_HOME/cfgtoollogs/dbca

[oracle@stone_db dbca]$ ls

trace.log

[oracle@stone_db dbca]$ cat trace.log

java.lang.UnsatisfiedLinkError:/home/Oracle_app_10204/jdk/jre/lib/i386/libawt.so:

libXp.so.6: cannot openshared object file: No such file or directory

at java.lang.ClassLoader$NativeLibrary.load(Native Method)

at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1586)

at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1503)

at java.lang.Runtime.loadLibrary0(Runtime.java:788)

at java.lang.System.loadLibrary(System.java:834)

at sun.security.action.LoadLibraryAction.run(LoadLibraryAction.java:50)

at java.security.AccessController.doPrivileged(Native Method)

at sun.awt.NativeLibLoader.loadLibraries(NativeLibLoader.java:38)

atsun.awt.DebugHelper.(DebugHelper.java:29)

at java.awt.Component.(Component.java:506)

at oracle.sysman.assistants.util.wizard.WizardObject.(WizardObject.java:64)

at oracle.sysman.assistants.dbca.ui.DBCAWizard.(DBCAWizard.java:425)

at oracle.sysman.assistants.dbca.ui.UIHost.(UIHost.java:214)

at oracle.sysman.assistants.dbca.ui.InteractiveHost.(InteractiveHost.java:54)

at oracle.sysman.assistants.dbca.Dbca.getHost(Dbca.java:160)

at oracle.sysman.assistants.dbca.Dbca.execute(Dbca.java:94)

at oracle.sysman.assistants.dbca.Dbca.main(Dbca.java:180)

原因很明显缺包:

libXp.so.6: cannot open shared object file:No such file or directory

验证一下包:

[oracle@stone_db dbca]$ rpm -qa|grep libXp

libXpm-devel-3.5.5-3

libXpm-3.5.5-3

安装libXp :

[root@stone_db Server]# ll

-rwxrwSrwx 1 root root 22996 2007-07-26libXp-1.0.0-8.1.el5.i386.rpm

-rwxrwSrwx 1 root root 15262 2007-07-26libXp-devel-1.0.0-8.1.el5.i386.rpm

[root@stone_db Server]# rpm -ivh libXp*.rpm

warning: libXp-1.0.0-8.1.el5.i386.rpm:Header V3 DSA signature: NOKEY, key ID 37017186

Preparing...               ########################################### [100%]

1:libXp                  ########################################### [ 50%]

2:libXp-devel            ########################################### [100%]

[root@stone_db Server]# rpm -qa|grep libXp

libXpm-devel-3.5.5-3

libXp-1.0.0-8.1.el5

libXpm-3.5.5-3

libXp-devel-1.0.0-8.1.el5

再次执行dbca成功:

[root@stone_db ~]# xhost +

access control disabled, clients canconnect from any host

[root@stone_db ~]# su - oracle

[oracle@stone_db ~]$ export DISPLAY=192.168.1.210:0.0

[oracle@stone_db ~]$ dbca

另外一种情况就是不缺包,用oracle用户直接登录可以执行dbca顺利打开图形窗口。用root登录xshell然后执行xhost +,

再切换su - oracle 改变用户身份,结果执行dbca不能打开图形窗口。

用root登录CDE,

bash-3.2# xhost +

access control disabled, clients can connect from any host

bash-3.2# su - oracle

[oracle@aix275 ~]# dbca

DISPLAY not set.

Set DISPLAY environment variable, then re-run.

[oracle@aix275 ~]# who

root        tty0        Jul 08 06:32

root        pts/0       Jul 08 05:49     (192.168.1.210)

oracle      pts/1       Jul 08 05:56     (192.168.1.210)

root        pts/2       Jul 08 05:58     (192.168.1.210)

root        dtremote    Jul 08 06:34     (192.168.1.210:0)

root        pts/3       Jul 08 06:34     (192.168.1.210:0.0)

root        pts/4       Jul 08 00:53     (192.168.1.210)

[oracle@aix275 ~]# export DISPLAY=192.168.1.210:0.0

[oracle@aix275 ~]# dbca

正常打开图形窗口。

但是在xshell下,执行同样步骤却不能打开图形窗口。

查看trace.log文件发现DISPLAY变量设置的不正确,不能使用192.168.1.210:0.0

[oracle@aix ~]# cat /database/product/10.2.0/db_1/cfgtoollogs/dbca/trace.log

java.lang.InternalError: Can't connect to X11 window server using '192.168.1.210:0.0' as the

value of the DISPLAY variable.

at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)

at sun.awt.X11GraphicsEnvironment.(X11GraphicsEnvironment.java:175)

at java.lang.Class.forName1(Native Method)

at java.lang.Class.forName(Class.java:180)

at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment

(GraphicsEnvironment.java:91)

at java.awt.Font.initializeFont(Font.java:333)

at java.awt.Font.(Font.java:368)

at oracle.ewt.lwAWT.LWComponent.(Unknown Source)

at oracle.sysman.assistants.util.wizard.WizardObject.(WizardObject.java:64)

at oracle.sysman.assistants.dbca.ui.DBCAWizard.(DBCAWizard.java:425)

at oracle.sysman.assistants.dbca.ui.UIHost.(UIHost.java:214)

at oracle.sysman.assistants.dbca.ui.InteractiveHost.(InteractiveHost.java:54)

at oracle.sysman.assistants.dbca.Dbca.getHost(Dbca.java:160)

at oracle.sysman.assistants.dbca.Dbca.execute(Dbca.java:94)

at oracle.sysman.assistants.dbca.Dbca.main(Dbca.java:180)

后来打开多个图形终端,然后用who命令查看。

[root@aix /]# who

root        tty0        Jul 08 06:32

root        pts/0       Jul 08 05:49     (192.168.1.210)

oracle      pts/1       Jul 08 05:56     (192.168.1.210)

root        pts/2       Jul 08 05:58     (192.168.1.210)

root        dtremote    Jul 08 06:34     (192.168.1.210:0)

root        pts/3       Jul 08 06:34     (192.168.1.210:0.0)

root        dtremote    Jul 08 00:53     (192.168.1.210:1)

oracle      dtremote    Jul 08 06:44     (192.168.1.210:2)

oracle      dtremote    Jul 08 06:51     (192.168.1.210:3)

通过观察不难发现一个规律,也就是第一个打开的图形终端为IP:0,在里面执行dbca弹出的图形窗口为IP:0.0。

第二个打开的图形窗口占用的终端序号为IP:1,在其内部执行dbca命令弹出窗口则为IP:1.0。后面打开的终端以此类推序号。

那么我们打开的Xshell其实也是一个终端,只不过平时占用的是字符终端,当我们执行dbca的时候会弹出图形窗口,

因此这个时候也会占用一个图形终端序号,经上述推理,也就很容易在Xshell终端设置正确的DISPLAY参数了,

也就是看一下我们要打开的是占用第几个图形终端,假定为n,那么我们设置

DISPLAY参数值就为“打开终端所在计算机的IP:n-1.0”。

那么回过头来再想一下,为什么用oracle用户直接登录就不存在任何题呢,而用root用户登录再su到oracle用户身份就出

现这个报错呢。其实很简单,我们不论用哪个用户身份登录到一个终端的时候执行echo DISPLAY发现默认设置好了一个值就

是localhost:n.0,当我们切换用户身份以后再执行echo DISPLAY发现这个值不见了,此时就需要我们认为设定这个值了,指定

在哪个终端打开图形窗口。

回想一下网上的帖子设置的DISPLAY参数都是IP:0.0,也就是在打开的第一个图形终端里设置的,或者是在没有打开图形

终端时在命令行终端里设置的情况。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值