• 締切済み

クラスのロードが出来ない

あまり深くJavaを知らないうちからこんなことすることが無謀なのかも しれませんが、.NETやらPHPなら個人的に簡単にコーディングできるので、 Javaでも手法として覚えたいと思っています。 やりたいことは、AというWebアプリケーション上から、別にコンパイル されたBというjarファイルをロードし、インターフェースを介して動作させる、 といったものです。 Struts2.1.8を利用してコーディングしていますが、問題になっている部分では 大して問題にならないと思われます。 public class Index {  public String execute() throws Exception {   final String PLUGINS_DIRECTORY = "/plugins/";      //jarロード   String filePath = ServletActionContext.getServletContext().     getRealPath(PLUGINS_DIRECTORY + "TestProject.jar");   String direcotryName = (     new File(filePath).getCanonicalFile().toURI()).toString();   System.out.println(direcotryName);   URL url = new URL("jar:" + direcotryName + "!/");   URLClassLoader loader = new URLClassLoader(     new URL[] {url});      //クラスの読み込み   Object abc = loader.loadClass("testpackage.TestClass");   if (abc == null) {    System.out.println("そもそもクラスを読めなかった");   }  } } こんなスクリプトがあり、以下のディレクトリ構成を考えた時 (Index.classが上記コード) webroot  --WEB-INF     --classes        --base           --Index.class        --plugin           --PluginImpl.class  --plugins     --TestProject.jar TestProject.jarにはtestpackage.TestClassが存在するのですが、 スクリプト上ではエラーになってしまいます。 例外:java.lang.reflect.InvocationTargetException 原因:java.lang.NoClassDefFoundError: plugin/PluginImpl TestClassはplugin/PluginImplを実装したものなのですが、 どうもPluginImplが見つからずTestClassがNGになってる?みたいです。 外部jarをロードしてクラスを利用する場合の正しいやり方が分からず困っています。 正しいコードをご教示下さい。

  • Java
  • 回答数1
  • ありがとう数1

みんなの回答

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.1

クラスローダの自作やカスタマイズは難易度が高い方法か、JDKのバージョン に依存する方法になってしまうので、お勧めしません。 素直に、「WEB-INF」の下に「lib」ディレクトリを作成して、jarを配備しては いかがでしょう。

naktak
質問者

補足

ありがとうございます。 lib直下への配置については、コーディングする際に真っ先に却下しました。 理由としては、システムとして利用しているライブラリjarと、 後に任意で追加されたプラグインjarの区別が付かないから です。 出来たらプラグインは、プラグイン専用に切ったディレクトリ上 に存在して欲しいという思いです。 上記のことがスマートに解消されるならば、別に 質問に記述したような方法でなくて構いません。 他に良い解決案などありますでしょうか?

関連するQ&A

  • 外部jarの標準出力を取得できますか?

    ClassLoaderで外部jarのクラスをロードし、実行するプログラムを作りました。 SimpleOutputは、単に渡された引数を標準出力に出すだけのものです。 この値を取得してGUI上に表示させたいのですが、取得する方法をご教授ください。 System.out.println("Load class"); URL[] urls = { file.toURI().toURL() }; ClassLoader loader = URLClassLoader.newInstance(urls); Class<?> cls = loader.loadClass("SimpleOutput"); System.out.println(cls); Object obj = cls.newInstance(); Method method = cls.getMethod("main", String[].class); String[] av = {"test"}; method.invoke(obj, new Object[]{av});

    • ベストアンサー
    • Java
  • 同じパッケージ、クラス名が含まれているjarが複数ある場合

    tomcatからjarをロードさせて使用しておりますが、 同じパッケージ、同じクラスを含むjarが複数ある場合、どのような 動きになるのでしょうか。 たとえば AAA.jar BBB.jar の両方に package net.testpakege; public class Testclass{ } みたいなクラスがあるとします。 他のクラスからTestclassを呼び出した場合、 AAA.jarとBBB.jarのどちらのTestclassが使われるのでしょうか。 また現在VMが異常終了してしまう現象が出ていますが、上記の 事と関係がある可能性はありますでしょうか。 宜しくお願いします。

    • ベストアンサー
    • Java
  • javaでscalaのクラスを使う

     Scala初心者です^^  Scalaで作ったクラスをJavaで使おうとしています.  しかしなかなかうまくいかなくて…  ソースを下に書いておきます. [ap/hello.scala] class hello(str2: String){ val str = str2 def say(){ println(str) } } [ap/start.java] public class start{ public static void main(String[] args){ hello h = new hello("Hello!"); h.say(); } }  helloクラスのコンストラクタを用いて指定した文字列を helloクラスのsayメソッドで標準出力するだけの簡単なクラスなのですが, うまく実行できず… Exception in thread "main" java.lang.NoClassDefFoundError: ap/start/class Caused by: java.lang.ClassNotFoundException: ap.start.class at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:248) Kazus-MackBookPro:ScalaLearning macuser$ java ap/start Exception in thread "main" java.lang.NoClassDefFoundError: ap/start (wrong name: start) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632) at java.lang.ClassLoader.defineClass(ClassLoader.java:616) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) at java.net.URLClassLoader.access$000(URLClassLoader.java:58) at java.net.URLClassLoader$1.run(URLClassLoader.java:197) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) というエラーが出てしまいます.    どこが悪いかわかる方いらっしゃいませんか?  それとも,JavaではScalaで作った.classファイルは使うことができないのでしょうか?  Scalaはまだ覚えて2週間なので,まだ完全に理解できていません><    よろしくお願いします

  • publicクラス

    クラスの修飾子にpublicをつける理由を教えて下さい。 さらに、なにも修飾子をつけなときは 同一パッケージ(ファイル)内からでしかアクセスできないはずですよね? Test.javaとBase.javaを以下のように定義します。 class Test { public static void main(String[] args) { Base b = new Base(); } } class Base { public void show() { System.out.println("hello!"); } } この2つのファイルは同じディレクトリにあります。 public修飾子をつけていないにも関わらず、なぜインスタンス化ができるのでしょうか? よろしくおねがいします。

    • ベストアンサー
    • Java
  • ロードしたアセンブリを常に保持したい

    Public Class Loader   Public Shared Function loadClass(ByVal className As String, Optional ByVal filePath As String = Nothing) As Boolean     If Not Type.GetType(className) Is Nothing Then       'アセンブリにロードされている場合は何もしない       Return True     Else       'アセンブリにロードされていない場合はDLLをロードする       If System.IO.File.Exists(filePath) = False Then           Return False       End If       Dim asm As [Assembly] = [Assembly].LoadFrom(filePath)       Dim classType As Type = asm.GetType(className)       If classType Is Nothing Then         classType = Nothing         asm = Nothing         Return False       End If     End If     Return True   End Function End Class http://www.atmarkit.co.jp/fdotnet/dotnettips/386createinstance/createinstance.html ここを参考にし、VB2005でこんなクラスを作りました。 ロードしたアセンブリは常にロードされた状態かと思っていて、 ロードしたアセンブリ内に存在するクラスを外部クラスでインスタンス化 できると思っていたのですが、どうやら上記コードのままでは その時限りのようなのです。 (つまり変数asmが有効なスコープ内のようです) 一度ロードしたアセンブリは、アプリケーションが閉じられるまで ロードされる状態にする方法はありませんでしょうか?

  • Javaのクラス作成について。

    現在、Javaで新規クラスを作成しています。 「String型の変数を受け取ってトリミングしてString型で返す」と言うプログラムを作成したいのですが、なかなかうまくいきません。 現在、考えているのは --- Trimming.java --- public class Trimming{ String new_id; public String TrimmingId(String id){ id = new_id; String idtrim = new_id.trim(); idtrim = id; return id; } } --- Test.java --- class Test{ public static void main(String[] args) { String id = " Trimming "; Trimming ID = new Trimming(); System.out.println(ID.TrimmingId(id)); } } --- 現在、出ているエラーは Exception in thread "main" java.lang.NullPointerException at Trimming.TrimmingId(Trimming.java:6) at Test2.main(Test2.java:6) です。 よろしくお願いします。

    • ベストアンサー
    • Java
  • javaがうまく起動しない?

    javaを利用して株チャートを映している、カブドットコム証券を利用しています。 javaが画面上で立ち上がるのですが、その後、画面が空白になり「エラー。クリックして詳細を確認してください」とでてしまいます。 最新版のjavaをダウンロードしなおしてみたのですが、やはり駄目です。 エラー表示には Java Plug-in 1.6.0_12 使用中の JRE のバージョン 1.6.0_12 Java HotSpot(TM) Client VM ユーザのホームディレクトリ = C:\Documents and Settings\USER ---------------------------------------------------- c: コンソールウィンドウをクリア f: ファイナライズキューのオブジェクトをファイナライズ g: ガベージコレクト h: このヘルプメッセージを表示 l: クラスローダリストをダンプ m: メモリ使用率を表示 o: トリガログ q: コンソールを非表示 r: ポリシー設定を再ロード s: システムプロパティと配備プロパティをダンプ t: スレッドリストをダンプ v: スレッドスタックをダンプ x: クラスローダキャッシュをクリア 0-5: トレースレベルを <n> に設定 ---------------------------------------------------- ロードされたイメージ: jar:http://kabucom.qri.jp/new_chart/kabucom/qrchartsim.jar!/logo/QRlogos2.gif ロードされたイメージ: jar:http://kabucom.qri.jp/new_chart/kabucom/qrchartsim.jar!/icons/sliderM.gif ロードされたイメージ: jar:http://kabucom.qri.jp/new_chart/kabucom/qrchartsim.jar!/icons/kai.gif ロードされたイメージ: jar:http://kabucom.qri.jp/new_chart/kabucom/qrchartsim.jar!/icons/uri.gif ロードされたイメージ: jar:http://kabucom.qri.jp/new_chart/kabucom/qrchartsim.jar!/icons/q.gif ロードされたイメージ: jar:http://kabucom.qri.jp/new_chart/kabucom/qrchartsim.jar!/icons/sin.gif ロードされたイメージ: jar:http://kabucom.qri.jp/new_chart/kabucom/qrchartsim.jar!/icons/hen.gif ロードされたイメージ: jar:http://kabucom.qri.jp/new_chart/kabucom/qrchartsim.jar!/icons/karute.gif Applet Version : 0.0245 java.lang.NullPointerException at model.Cycle.getDate(Cycle.java:609) at gui.DatePanel.getDate(DatePanel.java:213) at card.Header.<init>(Header.java:191) at main.ChartPanel.<init>(ChartPanel.java:147) at main.Chart.rebuildChartsAndPanels(Chart.java:290) at main.Chart.init(Chart.java:274) at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source) at java.lang.Thread.run(Unknown Source) 例外: java.lang.NullPointerException java.lang.NullPointerException at main.Chart.start(Chart.java:467) at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source) at java.lang.Thread.run(Unknown Source) 例外: java.lang.NullPointerException とあります。 なにがおかしいのでしょうか? お教えいただきたくお願い申し上げます。

  • flashのクラスで

    クラスのプロパティでurlと画像を設定したいのですが、 書き方が分かりません。 class a{ private var url (URL:String); private var picture (URL:String); } これは間違っているでしょうか。 この書き方はあっていますか? すみませんがお願いします。 var url=new()。。と書くのでしょうか? クラスを複製して、 それが個々に別々のurlを持つようにしたいです しみませんがお願いします

    • ベストアンサー
    • Flash
  • Fileクラス

    いろいろ調べてみたんですがよくわからないので教えてください。 File d = new File("."); String[] f= d.list(); のようにして”・”カレントディレクトリの ファイル名が取得できます。f[]の配列の中身がファイル名になります。 そこで、カレントディレクトリの、ある特定の拡張子のものだけ取り出せないかと、 File d = new File(".\\*.java"); (ここでは.javaのもの) としたのですが、 java.lang.NullPointerException のエラーがでてしまいます。 どのようにしたら、 *.java のような特定の拡張子のファイル取得が出来ますでしょうか。

    • ベストアンサー
    • Java
  • ArrayListを使ったクラスの作成の仕方

    次のプログラム、どこが間違っているのでしょうか? コンパイルは通るのですが、実行しようとすると ずら~っとエラーが出てしまいます。 (例)at java.lang.ClassLoader.defineClass1(Native Method) at java.security.SecureClassLader.defineClass..... at java.net.URLClassLoader.defineClass(URLClassLoader.java:260) ********************************************************** package siryou; import java.util.ArrayList; import java.io.*; class Info { private String name; private String age; private String nationality; public void setName(String nm) { name = nm; } public void setAge(String a) { age = a; } public void setNationality(String nt) { nationality = nt; } public void show(String j) { System.out.println("「名前=" + name + "」"); System.out.println("「年齢=" + age + "」"); System.out.println("「国籍=" + nationality + "」"); } } class Kojinjyoho02 { public static void main(String args[])throws IOException { System.out.println("何回入力しますか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); int res = Integer.parseInt(str); Info in = new Info(); ArrayList list = new ArrayList(); for(int i =0; i < res; i++){ System.out.println("名前は?"); str = br.readLine(); in.setName(str); System.out.println("年齢は?"); str = br.readLine(); in.setAge(str); System.out.println("国籍は?"); str = br.readLine(); in.setNationality(str); list.add(in); } for(int j=0; j < list.size(); j++){ String jyoho = (String)list.get(j); in.show(jyoho); } } }

    • ベストアンサー
    • Java

専門家に質問してみよう