2011-08-13 10 views
2

こんにちは私は私のプログラムにクラスファイルをロードするコードを持っています。私が実行するとき/それをEclipseからデバッグするとき、私はいつも私のbinディレクトリからクラスファイルを選んだ。私のプログラムをJARファイルにコンパイルすると、ロードは機能しません。 ものは、このエラーは私が間違ってやっている何Javaでの動的クラスロードに関する問題

java.lang.ClassNotFoundException: Tagging.Tag_by_lenght_filename 
     at java.net.URLClassLoader$1.run(Unknown Source) 
     at java.net.URLClassLoader$1.run(Unknown Source) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 
     at Tagging.Tags_all.load_dynamic_tag(Tags_all.java:233) 
     at Command.LoadTagCommandExecutor.execute(LoadTagCommandExecutor.java:24 
) 
     at GUI.DropBox$2.handleEvent(DropBox.java:248) 
     at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) 
     at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053) 
     at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4066) 
     at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3657) 
     at GUI.DropBox.showGUI(DropBox.java:168) 
     at GUI.Try_control$5.handleEvent(Try_control.java:135) 
     at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) 
     at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053) 
     at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4066) 
     at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3657) 
     at GUI.Try_control.<init>(Try_control.java:161) 
     at GUI.NewSWTApp$2$1$2.run(NewSWTApp.java:121) 
     at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) 
     at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:134) 
     at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4041) 
     at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3660) 
     at Service.Main.main(Main.java:79) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
     at java.lang.reflect.Method.invoke(Unknown Source) 
     at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58) 

を取得している

public void load_dynamic_tag(String file_path) 
      throws MalformedURLException, ClassNotFoundException, 
      InstantiationException, IllegalAccessException { 
     File f = new File(file_path);// some folder's path 
     URI uri = f.toURI(); 
     URL url = uri.toURL(); 
     URL[] urls = new URL[] { url }; 
     // create a new class loader for this directory 
     ClassLoader cl = new URLClassLoader(urls); 
     // load the class file "MyAlgo.class" 
     String name = f.getName(); 
     name = name.substring(0, name.lastIndexOf(".")); 
     name = "Tagging." + name; 
     @SuppressWarnings("unchecked") 
     Class<TaggingStrategy> c = (Class<TaggingStrategy>) cl.loadClass(name); 
     // TaggingStrategy tag=c.newInstance(); 
     tag = c.newInstance(); 
    } 

クラスファイルをロードする行がありますか? tnx allot

答えて

0

URLClassLoaderは、ディレクトリとjarファイルでクラスを探します。 "file_path"として渡すものは、あなたが探しているクラスを含むjarまたはディレクトリへのパスである必要があります。ディレクトリの場合は、 "/"で終わる必要があります。たぶんあなたは相対的なファイルパスを使用しています。相対パスは、どこから実行されているかに基づいて異なる意味を持ちます。何が渡され、クラスはどこに住んでいますか?

+0

私はを使用してフルパスを送信しようとしました。Path p = Paths.get(class_file_path); \t \tファイルclass_file = new File(p.toAbsolutePath()。toString()); しかし、それは動作しませんでした –

+0

はい、私の答えを再度読んでください。クラスファイルへのパスは無駄です。ディレクトリまたはjarファイルをコンパイルまたは実行するためにクラスパスに追加する場合とまったく同じように、ディレクトリまたはjarファイルを指定します。例えば。クラスがcom.foo.Barの場合、ファイルは /com/foo/Bar.classになります。クラスバーを見つけるには、 ""をClassLoaderに渡す必要があります。 –

1

私の推測では、ファイルパスが機能しなくなり、クラスが.jarファイルの内部にあるため、通常のファイルは実行されません。あなたがする必要がどのような は、.jarファイル内のクラスファイルを配置することである。

File myFile = new File(YourClass.class.getProtectionDomain().getCodeSource().getLocation().toURI())); 
JarFile myJar = new JarFile(myFile); 

次のように続いて瓶内部のエントリを取得:

Enumeration entries = jar.entries(); 

さて、一覧表示する方法Enumeration上のドキュメントを参照してください。クラスファイル。 (すべてのファイルをループし、.classで終わるものを選択する)ここから、クラス名を知っているので、ロードすることができます。実際

+0

jarファイルからクラスを追加したいのですか? –

+0

クラスファイルがjarファイルにない場合、absouluteパスを指定するだけで済みます。クラスが内部にあるパッケージは、ディレクトリ構造と一致しなければならないことに注意してください。http://www.exampledepot.com/egs/java.lang/LoadClass.htmlの例を参照してください(また、パス内のスラッシュをドット)、className = classPath.replace( '/'、 '。') –

1

あなたがする必要があるすべて、クラスパスにあなたのjarファイルを入れていると「Tagging.Tag_by_lenght_filename」は、ロードしたいクラスの正しい名前である場合は、あなたの問題がある

Class<TaggingStrategy> c = (Class<TaggingStrategy>)Class.forName("Tagging.MyAlgo"); 

を呼び出しますおそらく単にあなたの瓶がクラスパスにないということでしょう。

、あなたのクラスパスにjarファイルを持ってしたくない場合は、あなたがあなたのjarファイルを指すURLでのURLClassLoaderを作成する必要があります。

URLCLassLoader myCL = new URLClassLoader(new URL[]{new File("path/to/myjar.jar").toURI().toURL()}); 

あなたのコードは、両方のケースで動作することをしたい場合コンパイルされたjarファイルを使用する場合は、URLがeclipseのbinディレクトリを指していることを確認し、jarファイルをポイントする必要があります。

使用可能なクラスファイルを検出する必要がある場合は、ディレクトリまたはjarファイルからFileSystemを作成できるFileSystem抽象化レイヤー(FileSystems)を使用できます。

関連する問題