2017-01-09 20 views
0

実行時に.jarファイルからアプリケーションを起動しようとしています。だから私はこのスレッドでのコードに続く: How to load a jar file at runtime.jarからクラスをロードしようとするとClassCastExceptionが発生する

をしかし、私は、このエラーが生じています:ここで

Exception in thread "main" java.lang.ClassCastException: class net.sf.latexdraw.LaTeXDraw 
    at java.lang.Class.asSubclass(Unknown Source) 
    at LatexLauncher.<init>(LatexLauncher.java:17) 
    at LatexLauncher.main(LatexLauncher.java:26) 

は、上記のスレッドとは全く同じであるコードは、次のとおりです。

File path = new File("pathToMyJAR/lib/LaTeXDraw.jar"); 
System.out.println(path.exists()); //return true 
ClassLoader loader = URLClassLoader.newInstance(
     new URL[] { path.toURI().toURL() }, 
     getClass().getClassLoader() 
); 
Class<?> clazz = Class.forName("net.sf.latexdraw.LaTeXDraw", true, loader); 
Class<? extends Runnable> runClass = clazz.asSubclass(Runnable.class); 
Constructor<? extends Runnable> ctor = runClass.getConstructor(); 
Runnable doRun = ctor.newInstance(); 
doRun.run(); 

上記のコードはLatexLauncherコンストラクタにあります。エラーを投げる行は次のとおりです。

Class<? extends Runnable> runClass = clazz.asSubclass(Runnable.class); 

それはEclipseプロジェクトで、私が実行したいの.jarファイルがlibフォルダ内にあります。私が実行したいもの(LaTeXDraw)のJarファイルは、プロジェクトのlib/lib/フォルダにあります。私はこれをどのように修正するのか分かりません。

最終的な目標は、.jarアプリケーションを起動し、RobotクラスがUIにアクションを実行してテストを行うことです。すべてのヘルプは大歓迎です

、 はコメントで述べたように、あなたの時間

+3

エラーは、クラス 'net.sf.latexdraw.LaTeXDraw'が' Runnable'を実装していないと不平を言っているようです。それは本当に事実ですか?ほとんどのJavaアプリケーションの主なクラスは実際には 'Runnable'を実装していないことに注意してください。 –

+3

'Runnable'は' LaTeXDraw'の*サブクラスではありませんか?あなたが['java.lang.Runnable'](https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html)を参照していると仮定すると、できません。 'asSubclass()'は*ダウンキャスト*用です。もし 'LaTeXDraw'が' Runnable'を実装していれば、それはアップキャストになります。特に 'Runnable'がインターフェースであることを考えると' Class'をキャストする必要はありません。 。 – Andreas

+0

LaTeXDrawクラスのクラス署名を共有してください –

答えて

0

いただきありがとうございます、あなたの問題はnet.sf.latexdraw.LaTeXDrawRunnableを実装していないということだけです。私はあなたが何が起こることを期待しているのか本当に知りません。

RobotクラスはRunnableクラスを実装し、そこからLaTeXDrawを使用してください。

public class Robot implements Runnable 
{ 
    @Override 
    public void run() 
    { 
     LaTeXDraw thing = new LaTeXDraw(); // or whatever 
     //... 
    } 
} 

//... 
Class<?> clazz = Class.forName("package.Robot", true, loader); 
Class<? extends Runnable> runClass = clazz.asSubclass(Runnable.class); 
//... 
+0

あなたの答えをありがとう、それは確かに自分自身からのばかげたエラーでした。私はクラスを読み込む方法をもう少し理解するようになりました。 – LostReality

関連する問題