- ベストアンサー
-Applet表示でのjava.lang.ClassNotFoundException-
お世話になります。 只今、Appletの操作を勉強しています。 先日まで動いていた、Appletが急に表示されなくなってしまいました。 「appletviewer」で実行すると表示されるのですが、HTMLを叩くと表示されません。 JAVAコンソールには・・・ java.lang.ClassNotFoundException: javax.swing.JComboBox at com/ms/vm/loader/URLClassLoader.loadClass (URLClassLoader.java) at java/lang/ClassLoader.loadClassInternal (ClassLoader.java) at DemoApplet.init (DemoApplet.java) at com/ms/applet/AppletPanel.securedCall0 (AppletPanel.java) at com/ms/applet/AppletPanel.securedCall (AppletPanel.java) at com/ms/applet/AppletPanel.processSentEvent (AppletPanel.java) at com/ms/applet/AppletPanel.processSentEvent (AppletPanel.java) at com/ms/applet/AppletPanel.run (AppletPanel.java) at java/lang/Thread.run (Thread.java) ・・・と、表示されています。 クラスパスの問題であれば、「appletviewer」でも動かないだろうし・・・何が問題なのでしょうか?? ・・・行き詰まってます。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
>AppletTest.java:1: パッケージ com.sun.java.swing は存在しません。 import com.sun.java.swing.*; パッケージ com.sun.java.swingは、swingall.jarにあります。 >javac -target 1.1 -classpath swingall.jar AppletTest.java のように指定しているようですが、 C:\java\appletに、swingall.jarはありますか? 私が示している例を、分からないまま、そのまま実行するのではなく、 自分の環境に合わせて実行してくださいね。
その他の回答 (7)
- sasadora
- ベストアンサー率68% (59/86)
複数の問題が山積みで原因が特定できないのですが、 ひとつずつ解決していきませんか? まずは単純なサンプルを動作させてください。そのサンプルに処理を徐々に加えて、 現在のプログラムに近づけていくと、どこかで問題が発生するでしょう。 発生したときに加えてた処理=問題の原因です。 私は以下のようなプログラムで、JDK1.1ベースのswingが動作します。 tnishiokaはこのサンプルが動作しますか? また、このサンプルにどんな処理を加えると、問題が発生しますか? -------------------- ■TestApplet.java import com.sun.java.swing.*; public class AppletTest extends JApplet{ public AppletTest(){ JRootPane rp = this.getRootPane(); rp.putClientProperty("defeatSystemEventQueueCheck", Boolean.TRUE); this.getContentPane().add(new JButton("JButton")); } } -------------------- ■Test.html <HTML> <applet codebase="." code="AppletTest" archive="swingall.jar" width=100 height=100 > </applet> </HTML> -------------------- ■ファイル構成(以下の3つのファイルが同一ディレクトリ) Test.html AppletTest.class swingall.jar -------------------- ■コンパイル(JDK1.1ではないので、targetオプション付加) javac -target 1.1 -classpath swingall.jar AppletTest.java -------------------- archiveを追加せずに動作するのはおかしいと思います。 plug-inを使っているのではないですよね? →Appletが動作するときにタスクトレイにPlug-inのアイコンが表示されますか? swingall.jarのアーカイブを"展開して"codebaseと同じディレクトリに置いていたりしますか? →それならば動作すると思います。
補足
本当にお世話になります。 ・・・コンパイルが通りませんでした。 C:\java\applet>javac -target 1.1 -classpath swingall.jar AppletTest.java AppletTest.java:1: パッケージ com.sun.java.swing は存在しません。 import com.sun.java.swing.*; ^ AppletTest.java:3: シンボルを解釈処理できません。 シンボル: クラス JApplet 位置 : AppletTest の クラス public class AppletTest extends JApplet{ ^ AppletTest.java:5: シンボルを解釈処理できません。 シンボル: クラス JRootPane 位置 : AppletTest の クラス JRootPane rp = this.getRootPane(); ^ AppletTest.java:5: シンボルを解釈処理できません。 シンボル: メソッド getRootPane () 位置 : AppletTest の クラス JRootPane rp = this.getRootPane(); ^ AppletTest.java:7: シンボルを解釈処理できません。 シンボル: クラス JButton 位置 : AppletTest の クラス this.getContentPane().add(new JButton("JButton")); ^ AppletTest.java:7: シンボルを解釈処理できません。 シンボル: メソッド getContentPane () 位置 : AppletTest の クラス this.getContentPane().add(new JButton("JButton")); ^ エラー 6 個
- sasadora
- ベストアンサー率68% (59/86)
あと、書き忘れたのですが…。 ブラウザのVM、つまりJDK1.1ベースで動作させるつもりなら、 コンパイルもJDK1.1でしたほうがいいですよ。 JDK1.3で新たに追加された機能を知らずに使っても、 コンパイルエラーにならずに、実行時にエラーになりますから。
- sasadora
- ベストアンサー率68% (59/86)
swingのライブラリが、ARCHIVE属性にないのですが、書き忘れでしょうか? それがないと、最初の質問である。 java.lang.ClassNotFoundException: javax.swing.JComboBox になると思うのですが…。 あとコンストラクタに、 以下の2行を追加してみてください。 JRootPane rp = myJApplet.getRootPane(); rp.putClientProperty("defeatSystemEventQueueCheck", Boolean.TRUE); この情報は、swing1.1のドキュメントにありました。 http://java.sun.com/products/jfc/swingdoc-api-1.1.1/javax/swing/JApplet.html アプレットを動かすときはどうやって起動していますか? ・HTMLファイルをダブルクリック これはやめたほうがいいです。正常に動くかもしれませんが、ローカルファイルのアクセスと同じ結果になるかもしれません。 ・ブラウザからtomcat経由で起動 ブラウザのURLにhttp://tomcatのURL/xxxx/xxx.html というような形で、httpで指定して動かしたほうがいいと思います。 これでスタックトレースはちょっと減るかと思います。
補足
お世話になります。 何故かARCHIVE属性が無い状態で動作しました。 CODEBASEのみ追加でOKだったみたいです。 JRootPane rp = myJApplet.getRootPane(); rp.putClientProperty("defeatSystemEventQueueCheck", Boolean.TRUE); は、このDemoAppletはAppletを直に継承しているのでコンパイルエラーになってしまいました。 JAppletを継承しなおしたところ、コンパイルは通りましたが実行で以下のエラーが表示されました。 com.ms.security.SecurityExceptionEx[DemoApplet.<init>]: cannot access file C:\WINDOWS\Java\lib\swing.properties at com/ms/security/permissions/FileIOPermission.check (FileIOPermission.java) at com/ms/security/PolicyEngine.deepCheck (PolicyEngine.java) at com/ms/security/PolicyEngine.checkPermission (PolicyEngine.java) at com/ms/security/StandardSecurityManager.chk (StandardSecurityManager.java) at com/ms/security/StandardSecurityManager.checkRead (StandardSecurityManager.java) at java/io/FileInputStream.<init> (FileInputStream.java) at java/io/FileInputStream.<init> (FileInputStream.java) at javax/swing/UIManager$3.run (UIManager.java:754) at javax/swing/SwingUtilities.doPrivileged (SwingUtilities.java:1611) at javax/swing/UIManager.loadSwingProperties (UIManager.java:770) at javax/swing/UIManager.initialize (UIManager.java:919) at javax/swing/UIManager.maybeInitialize (UIManager.java:945) at javax/swing/UIManager.getUI (UIManager.java:560) at javax/swing/JPanel.updateUI (JPanel.java:110) at javax/swing/JPanel.<init> (JPanel.java:66) at javax/swing/JPanel.<init> (JPanel.java:99) at javax/swing/JRootPane.createGlassPane (JRootPane.java:224) at javax/swing/JRootPane.<init> (JRootPane.java:181) at javax/swing/JApplet.createRootPane (JApplet.java:132) at javax/swing/JApplet.<init> (JApplet.java:125) at DemoApplet.<init> (DemoApplet.java:24) at com/ms/applet/BrowserAppletFrame.newInstance (BrowserAppletFrame.java) at com/ms/applet/AppletPanel.processSentEvent (AppletPanel.java) at com/ms/applet/AppletPanel.processSentEvent (AppletPanel.java) at com/ms/applet/AppletPanel.run (AppletPanel.java) at java/lang/Thread.run (Thread.java) java.lang.Error: Do not use DemoApplet.add() use DemoApplet.getContentPane().add() instead at javax/swing/JApplet.createRootPaneException (JApplet.java:208) at javax/swing/JApplet.addImpl (JApplet.java:230) at java/awt/Container.add (Container.java) at DemoApplet.init (DemoApplet.java:71) at com/ms/applet/AppletPanel.securedCall0 (AppletPanel.java) at com/ms/applet/AppletPanel.securedCall (AppletPanel.java) at com/ms/applet/AppletPanel.processSentEvent (AppletPanel.java) at com/ms/applet/AppletPanel.processSentEvent (AppletPanel.java) at com/ms/applet/AppletPanel.run (AppletPanel.java) at java/lang/Thread.run (Thread.java)
- sasadora
- ベストアンサー率68% (59/86)
なにをするアプレットなのか教えてくれませんか? エラーがでたら、そのスタックトレースから原因を判明させませしょう。 at DemoApplet.init (DemoApplet.java:28) とあるので、DemoApplet.javaの28行目でなにをしていますか? ここで行やっていることに対して、 「cannot access file」とエラーが発生しているのです。 アプレットでは通常セキュリティ上、ローカルファイルのアクセスはできません。 このアプレットでローカルファイルのアクセスをしているのではないですか? アプレットビューワでは、たぶんこのセキュリティの制限がないです。 >ただ、デスクトップの「HelloWorld」は相変わらずです。 デスクトップというのはどういうことでしょう? デスクトップにファイルを置いているということでしょうか? どういったファイル構成で、なにを動かしているのか分からないので、 もうすこし情報をください。 ・HTML中のアプレットタグの内容 ・HTML,classファイルの配置構成 ・起動方法 など
補足
お世話かけます・・・ これは基本画面はボタン、コンボボックスで、ボタンをクリックでサーブレットを実行させるアプレットです。 DemoApplet.javaの28行目は・・・ panel = new JPanel(); ・・・でした。 一応、前後の行は・・・ public void init(){ panel = new JPanel(); panel.setLayout(new GridLayout(7,1)); ・・・こんな感じです。 ローカルファイルにアクセスしてる所は無いと思います。 ・HTML中のアプレットタグの内容 <applet code="DemoApplet.class" width = 300 height = 300 codebase="."> </applet> ・HTML,classファイルの配置構成 同じディレクトリです。 ・起動方法 Webサーバ(Tomcat3.2.3)を起動してます。 ・環境 Tomcat3.2.3 JDK1.3 Windows2000 >デスクトップというのはどういうことでしょう? >デスクトップにファイルを置いているということでしょうか? はい。「HelloWorld」はデスクトップに置いてありましたが、今はC:\Javaに置いてあります・・・結果は同じです。 以上です。 ・・・本当にお世話様です。
- sasadora
- ベストアンサー率68% (59/86)
ただサーバにおくだけではダメですよ。 Appletを表示するためのHTMLがありますよね。 HTMLにはAppletタグが書いてあり、そこにクラスを検索するパスを記述します。 swingのライブラリをダウンロードしたとのことですが、 それをARCHIVE属性に追加しなければ、ブラウザはどこにあるのか知りようがあり ません。 こんな感じでしょうか。 <APPLET CODE="JavaSample.class" HEIGHT=200 WIDTH=200 CODEBASE="." ARCHIVE="swingall.jar" > </APPLET> また、補足に書いてある例でうまくいかないのも同様で、 CODE属性に書いてあるクラス(HelloWorld )が、CODEBASEやARCHIVEで指定されたパスから見つからないから、ClassNotFoundExceptionとなるのです。
補足
CODEBASE="." を追加したら、サーバー上のアプレットは動作しましたがJavaコンソールに・・・ com.ms.security.SecurityExceptionEx[DemoApplet.init]: cannot access file C:\WINDOWS\Java\lib\swing.properties at com/ms/security/permissions/FileIOPermission.check (FileIOPermission.java) at com/ms/security/PolicyEngine.deepCheck (PolicyEngine.java) at com/ms/security/PolicyEngine.checkPermission (PolicyEngine.java) at com/ms/security/StandardSecurityManager.chk (StandardSecurityManager.java) at com/ms/security/StandardSecurityManager.checkRead (StandardSecurityManager.java) at java/io/FileInputStream.<init> (FileInputStream.java) at java/io/FileInputStream.<init> (FileInputStream.java) at javax/swing/UIManager$3.run (UIManager.java:754) at javax/swing/SwingUtilities.doPrivileged (SwingUtilities.java:1611) at javax/swing/UIManager.loadSwingProperties (UIManager.java:770) at javax/swing/UIManager.initialize (UIManager.java:919) at javax/swing/UIManager.maybeInitialize (UIManager.java:945) at javax/swing/UIManager.getUI (UIManager.java:560) at javax/swing/JPanel.updateUI (JPanel.java:110) at javax/swing/JPanel.<init> (JPanel.java:66) at javax/swing/JPanel.<init> (JPanel.java:99) at DemoApplet.init (DemoApplet.java:28) at com/ms/applet/AppletPanel.securedCall0 (AppletPanel.java) at com/ms/applet/AppletPanel.securedCall (AppletPanel.java) at com/ms/applet/AppletPanel.processSentEvent (AppletPanel.java) at com/ms/applet/AppletPanel.processSentEvent (AppletPanel.java) at com/ms/applet/AppletPanel.run (AppletPanel.java) at java/lang/Thread.run (Thread.java) com.ms.security.SecurityExceptionEx[DemoApplet.init]: Event queue access denied. at com/ms/security/permissions/UIPermission.check (UIPermission.java) at com/ms/security/PolicyEngine.deepCheck (PolicyEngine.java) at com/ms/security/PolicyEngine.checkPermission (PolicyEngine.java) at com/ms/security/StandardSecurityManager.chk (StandardSecurityManager.java) at com/ms/security/StandardSecurityManager.checkAwtEventQueueAccess (StandardSecurityManager.java) at java/awt/Toolkit.getSystemEventQueue (Toolkit.java) at javax/swing/SystemEventQueueUtilities$SystemEventQueue.init (SystemEventQueueUtilities.java:134) at javax/swing/SystemEventQueueUtilities$SystemEventQueue.get (SystemEventQueueUtilities.java:82) at javax/swing/SystemEventQueueUtilities.postRunnable (SystemEventQueueUtilities.java:269) at javax/swing/SwingUtilities.invokeLater (SwingUtilities.java:1128) at javax/swing/JComponent.revalidate (JComponent.java:3383) at javax/swing/JViewport.setView (JViewport.java:692) at javax/swing/JScrollPane.setViewportView (JScrollPane.java:831) at javax/swing/JScrollPane.<init> (JScrollPane.java:211) at javax/swing/plaf/basic/BasicComboPopup.createScroller (BasicComboPopup.java:346) at javax/swing/plaf/basic/BasicComboPopup.<init> (BasicComboPopup.java:223) at javax/swing/plaf/metal/MetalComboBoxUI$MetalComboPopup.<init> (MetalComboBoxUI.java:42) at javax/swing/plaf/metal/MetalComboBoxUI.createPopup (MetalComboBoxUI.java:67) at javax/swing/plaf/basic/BasicComboBoxUI.installUI (BasicComboBoxUI.java:122) at javax/swing/plaf/metal/MetalComboBoxUI.installUI (MetalComboBoxUI.java:52) at javax/swing/JComponent.setUI (JComponent.java:260) at javax/swing/JComboBox.setUI (JComboBox.java:144) at javax/swing/JComboBox.updateUI (JComboBox.java:153) at javax/swing/JComboBox.init (JComboBox.java:116) at javax/swing/JComboBox.<init> (JComboBox.java:110) at DemoApplet.init (DemoApplet.java:32) at com/ms/applet/AppletPanel.securedCall0 (AppletPanel.java) at com/ms/applet/AppletPanel.securedCall (AppletPanel.java) at com/ms/applet/AppletPanel.processSentEvent (AppletPanel.java) at com/ms/applet/AppletPanel.processSentEvent (AppletPanel.java) at com/ms/applet/AppletPanel.run (AppletPanel.java) at java/lang/Thread.run (Thread.java) Swing: checked access to system event queue. ・・・と表示されました・・・これはIE上の問題なのですかね?? でも、動作はしましたので、ありがとうございます。 ・・・ただ、デスクトップの「HelloWorld」は相変わらずです。
- sasadora
- ベストアンサー率68% (59/86)
本質的なことは、No.1さんがおっしゃるとおりなのですが、 なぜこうなるかというと…。 Swingは1.2から標準でついてきていますが、IEに付属のJavaVMはいまだ1.1です。 したがって、ブラウザについてくるjavaVMでは1.2で追加された機能は使えないわけです。 appletviewerはコンパイル環境のappletviewerを使っていると思うので、 問題なく動作します。 対応策その1:Plug-inを使用する。 ブラウザのVMに頼らず、別途用意したjavaVMを起動するようになります。 Appletを表示する環境にPlug-inを用意してもらう必要がありますが、 最新のjava環境を使うことができます。 利点:最新のjava環境を使用できる 決定:使う人にPlug-inを入れてもらわなければならない。 対応策その2:JDK1.1用のswingを使用する。 サーバにswingのライブラリをおいておけば、 1.1用のSwingに関しては使用可能です。 swingのライブラリをダウロードして使ってもらうことになるため、 利点:クライアントにインストール不要 欠点:でかいswingをダウンロードしなければならない。
補足
swingのライブラリをダウロードしサーバに追加しましたが、同じ現象になりました。 また、単純なHelloWorldで試したところ・・・ Error loading class: HelloWorld java.lang.NoClassDefFoundError java.lang.ClassNotFoundException: HelloWorld at com/ms/vm/loader/URLClassLoader.loadClass (URLClassLoader.java) at com/ms/vm/loader/URLClassLoader.loadClass (URLClassLoader.java) at com/ms/applet/AppletPanel.securedClassLoad (AppletPanel.java) at com/ms/applet/AppletPanel.processSentEvent (AppletPanel.java) at com/ms/applet/AppletPanel.processSentEvent (AppletPanel.java) at com/ms/applet/AppletPanel.run (AppletPanel.java) at java/lang/Thread.run (Thread.java) ・・・と表示されました。 一番疑問に思うのは、以前に動作していた物が動作しなくなってしまった事です。
- BlueRay
- ベストアンサー率45% (204/453)
最近Javaから離れている為、勘違いした事を書くかもしれませんがご了承下さい。 >java.lang.ClassNotFoundException: javax.swing.JComboBox まぁ、見たままなんですが、 SwingパッケージのJComboBoxが見つかりませんよ。と言っているので 最近、環境パスの変更とかファイルの移動とかしていないですか? 実在するSwingパッケージと環境パスが一致しているか確認して下さい。 たぶんそんな事だと思います。ではでは。
補足
お世話になります。 swingall.jarはあります。 再度、コンパイルしましたが・・・無理でした。