LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 4818|回复: 12

為什麼在shell無法執行java? 而在GUI裡用eclipse執行java卻正常(使用fedora 6).

[复制链接]
发表于 2007-7-4 18:20:04 | 显示全部楼层 |阅读模式
你好! 我在fedora 6上安裝eclipse SDK 3.2.2
下面是我測試的程式碼, 檔名是SWTHello.java :
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.*;
public class SWTHello {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
Label label = new Label(shell, SWT.NONE);
label.setText("SWT Hello, World!");
shell.pack();
label.pack();
shell.open();
while(!shell.isDisposed())
if(!display.readAndDispatch())
display.sleep();
display.dispose();
label.dispose();
}
}

在圖形模式下用eclipse跑SWTHello, 可正常顯示出swing. 但在shell模式下 #java SWTHello , 卻出現:
Exception in thread "main" java.lang.NoClassDefFoundError: SWTHello.java
   at gnu.java.lang.MainThread.run(libgcj.so.7rh)
Caused by: java.lang.ClassNotFoundException: SWTHello.java not found in gnu.gcj.runtime.SystemClassLoader{urls=[file:/root/Desktop/eclipse/eclipse_test/HelloWorld/src/], parent=gnu.gcj.runtime.ExtensionClassLoader{urls=[], parent=null}}
   at java.net.URLClassLoader.findClass(libgcj.so.7rh)
   at gnu.gcj.runtime.SystemClassLoader.findClass(libgcj.so.7rh)
   at java.lang.ClassLoader.loadClass(libgcj.so.7rh)
   at java.lang.ClassLoader.loadClass(libgcj.so.7rh)
   at gnu.java.lang.MainThread.run(libgcj.so.7rh)
是org.eclipse.swt.widgets.*搞得鬼嗎?
我在eclipse裡的classpath是: org.eclipse.swt.gtk.linux.x86_3.2.2.v3236.jar 這個檔案, 這樣對嗎?
我試過 #java -cp /root/Desktop/eclipse/plugins/org.eclipse.swt.gtk.linux.x86_3.2.2.v3236.jar SWTHello
但還是出現上述問題.  在GUI下在eclipse上runSWTHello就能正常跳出"HelloWorld"視窗, 但shell下就是不行.
any solutions?
发表于 2007-7-5 06:17:13 | 显示全部楼层
Exception in thread "main" java.lang.NoClassDefFoundError:
这个错误应应是因为没有编译吧。
$ls SWTHello
能列出SWATHell.class文件吗?

再则,swt应当在图形界面下才能能实行吧?
回复 支持 反对

使用道具 举报

发表于 2007-7-5 09:31:55 | 显示全部楼层
应该是路径问题。eclipse已经自动设好路径了,所以没问题。shell下要自己设定:
例如在.bashrc下加
export JAVA_HOME=/opt/jdk     (此处为jdk的路径)
export PATH=$PATHJAVA_HOME/bin
export CLASSPATH=$JAVA_HOME/lib:./

这样设定之后,java才能找到系统的库和你的class。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-5 18:25:41 | 显示全部楼层
回覆folklore:
測試程式碼裡有import org.eclipse.swt.widgets.*; import org.eclipse.swt.*; 應該就是使用swt開啟視窗並顯示Hello World!訊息.
我在shell下輸入 #javac SWTHello.java , 可以輸出SWTHello.class, 但#java SWTHello , 就出現錯誤訊息:
Exception in thread "main" java.lang.NoClassDefFoundError: SWTHello
   at java.lang.Class.initializeClass(libgcj.so.7rh)
Caused by: java.lang.ClassNotFoundException: org.eclipse.swt.widgets.Composite not found in gnu.gcj.runtime.SystemClassLoader{urls=[file:/usr/java/jdk1.6.0/lib/,file:./], parent=gnu.gcj.runtime.ExtensionClassLoader{urls=[], parent=null}}

我之前試過兩個程式碼都是正常的, 一個是HelloWorld.java:
public class HelloWorld {
        // @param args
        public static void main(String[] args) {
                        for (int i=0; i<=4; i++){
                                System.out.println("Hello World!");
                // TODO Auto-generated method stub
                        }
        }
}
在shell下執行javac HelloWorld.java和java HelloWorld都正常, 這個程式純粹在shell下print出HelloWorld訊息.

另一個是swingtest.java:
    import javax.swing.*;
    public class swingtest {
        public static void main(String[] args) {
            JFrame frame = new JFrame("HelloWorldSwing");
            final JLabel label = new JLabel("test Hello World");
            frame.getContentPane().add(label);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setVisible(true);
        }
    }
這個程式碼用到 import javax.swing.*; 可以正常javac swingtest.java, 在shell下執行#java swingtest, gnome可以正常跳出swt視窗並顯示HelloWorld!訊息.

回覆dukeduan:
我試著在.bashrc的最後加上:
export JAVA_HOME=/usr/java/jdk1.6.0
export PATH=$PATHJAVA_HOME/bin
export CLASSPATH=$JAVA_HOME/lib:./
儲存後再重開機, 在shell下 #java SWTHello , 還是出現Exception in thread "main" java.lang.NoClassDefFoundError: SWTHello
   at java.lang.Class.initializeClass(libgcj.so.7rh)
Caused by: java.lang.ClassNotFoundException: org.eclipse.swt.widgets.Composite not found in gnu.gcj.runtime.SystemClassLoader{urls=[file:/usr/java/jdk1.6.0/lib/,file:./],
我猜是import org.eclipse.swt.widgets.*; import org.eclipse.swt.*; 這兩行搞的鬼, 但我上面swingtest程式裡用到的 import javax.swing.*; 就正常, 一定是我不懂SWTHello.java裡的org.eclipse.swt的使用觀念的問題.
any solutions?
回复 支持 反对

使用道具 举报

发表于 2007-7-6 08:16:56 | 显示全部楼层
屁话,自己使用了swt,在运行的时候没有加入到classpath中
回复 支持 反对

使用道具 举报

发表于 2007-7-6 08:49:07 | 显示全部楼层
Post by Bluetooth_GPS

Exception in thread "main" java.lang.NoClassDefFoundError: SWTHello
   at java.lang.Class.initializeClass(libgcj.so.7rh)
Caused by: java.lang.ClassNotFoundException: org.eclipse.swt.widgets.Composite not found in gnu.gcj.runtime.SystemClassLoader{urls=[file:/usr/java/jdk1.6.0/lib/,file:./], parent=gnu.gcj.runtime.ExtensionClassLoader{urls=[], parent=null}}

虽然你设定了JAVA_HOME等环境变量,但是很明显你当前调java时调到了gcj,而不是你期望的Sun  java6。不信试试
java -version
ls -l /usr/bin/java
估计都是链到/etc/alternatives/java,再看看
ls -l /etc/alternatives/java

用alternative工具管理jdk,这个版块中有我的贴子讲过怎么配;
或者,正确的配置PATH环境变量,让$JAVA_HOME在/usr/bin前。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-6 19:03:37 | 显示全部楼层
proge你好! 我現在的java link 是/usr/bin/java -> /usr/java/jdk1.6.0/bin/java  然後, #java SWTHello  , 出現:
Exception in thread "main" java.lang.NoClassDefFoundError: rg/eclipse/swt/widgets/Composite

我先看java的書從基礎練起, 就快看到GUI Introduction章節了, 學完GUI可能對swing的了解會有幫助, 到時候再來發問, 先謝謝你們!
回复 支持 反对

使用道具 举报

发表于 2007-7-7 23:10:07 | 显示全部楼层
classpath明显没有设置好,eclipise里面你导入swt的lib,就设置好了classpath了
但是你在shell里面就要自己手动设置classpath
回复 支持 反对

使用道具 举报

发表于 2007-8-16 00:04:30 | 显示全部楼层
swt要加到classpath,还有swt的native文件需要加到lib里去
回复 支持 反对

使用道具 举报

云和山的彼端 该用户已被删除
发表于 2007-10-31 20:53:05 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表