2009-06-29 1 views
0

jarAが自分のクラスパスに入っていて何かをしたいと思っています。私はどのジャーが使用されるのかわからないので、Netbeansプロジェクトライブラリのリファレンスでこれらのjarを指定するつもりはありません。Javaのリフレクションとマニフェストファイルが入っています

私のNetbeansプロジェクトライブラリリファレンスにjarファイルを含めると、jarファイルのクラスをリフレクションで使用しようとすると動作します。しかし、私はnetbeansプロジェクトのライブラリの参照を削除するが、私のクラスパスには、反射は動作しませんjarを追加します。

私の質問は本当に1)できますか? 2)正しく考えていますか3)-cpまたは-classpathを指定してjarを含むディレクトリをインクルードするとどうなりますか? 4)manifest.mfのディレクトリをjarファイルで指定すると、どうしてうまくいかないのですか?

お知らせください。これは本当に私を悩ましています。

おかげで、 ジュリアン

+1

あなたは-jarを使用していませんか? (それは静かにクラスパスを無視します) –

+0

私はjava -jarを使用しています...それは意味があります...しかし、私はmanifest.mfファイルに入って、私のディレクトリを使用するように変更し、それは動作しませんでした...まだ何が起こっているのか把握しようとすると、uを投稿し続けるでしょう。 – jbu

答えて

1

ポイント3に - あなたはあなたのクラスパスだけでなく、ディレクトリに完全修飾JAR名を含める必要があります。

+0

しかし、Javaのヘルプオプションは、classpathがdiretoriesのパスを検索すると言う。 – jbu

+0

"-classpath <ディレクトリとzip/jarファイルのクラス検索パス>;分離されたディレクトリリスト、JARアーカイブ、およびクラスファイルを検索するZIPアーカイブ"。 あなたのコメントは部分的にのみ正しい - クラスファイルに適用されますが、jarファイルには適用されません。クラスパス上のJarファイルへの参照は完全修飾名 – Dinuk

1

クラスパスは、.classファイルを含むディレクトリを参照することも、.jarファイルを直接参照することもできます。 .jarファイルを含むディレクトリを参照する場合、それらは含まれません。


java -helpは、これは約-classpath言う:「クラスファイルをを検索するディレクトリ、JARアーカイブ、 およびZIPアーカイブのリスト。」これはクラスパス上のディレクトリには、クラスファイルのを検索されることを非常に明確です、 JARアーカイブではありません。

1

私はそう信じています!

ClassLoader.getSystemClassLoader()getURLs(); 

これは、どのJarファイルがクラスパスにあるかを示します。その後、XまたはYをしてください。

+0

でなければなりません。どのjarファイルがクラスパスにあるのか知ることは良いことですが、見つかったjarファイルを使用する必要があると判断したあと、 – jbu

+0

もう少し説明が必要な場合があります。2つの異なるJARファイルに同じクラスがクラスパス内に存在する可能性があるという問題はありますか?その場合、それらの間で選択するのは難しいかもしれません。 findClass(したがってloadClass)はおそらく最初に見つかったものを取るだけです。 2つのJARファイルがあり、クラスのソースを選択する場合は、File関数を使用して自分自身を検索し、独自のクラスローダーを作成してください。あなたはそれの例を望んでいますか?私はどこかにコードがあります。 クラスパスにないJARファイルを動的にロードできます。 –

0

これは私がやっている方法です。 内部クラスは、ロガーのシングルトンインスタンスとそのトレースメソッドをカプセル化しています(heh - 知っています - シングルトン内のシングルトン)。 外部クラスは、特殊クラスをロードできる場合にのみ使用します。それ以外の場合は、そのクラスを使用しません。うまくいけば、あなたのニーズに合わせてこれを修正することができます。そして、よりよいコードに関する提案は常に高く評価されています! :-) HTH

import java.lang.reflect.Method; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

/** 
* Provides centralized access to standardized output formatting. Output is sent to System.out and, 
* if the classpath allows it, to the Cisco CTIOS LogManager. (This is NOT a dependency, however.) 
* 
*/ 
public class LogWriter 
{ 
    protected static LogWriter me = null; 
    private SimpleDateFormat dateFormat = null; 
    private StringBuffer line = null; 
    CLogger ciscoLogger = null; 

    /* 
    * The following 2 methods constitute the thread-safe singleton pattern. 
    */ 
    private static class LogWriterHolder 
    { 
     public static LogWriter me = new LogWriter(); 
    } 
    /** 
    * Returns singleton instance of the class. Thread-safe. The only way to get one is to use this. 
    * 
    * @return an instance of LogWriter 
    */ 
    public static LogWriter sharedInstance() 
    { 
     return LogWriterHolder.me; 
    } 


    @SuppressWarnings("unchecked") 
    LogWriter() 
    { 
     dateFormat = new SimpleDateFormat("yyyyMMddHHmmss "); 
     line = new StringBuffer(); 
     try { 
      Class x = Class.forName("com.cisco.cti.ctios.util.LogManager"); 
      if(x != null) { 
       java.lang.reflect.Method m = x.getMethod("Instance", new Class[0]); 
       java.lang.reflect.Method n = x.getMethod("Trace", int.class, String.class); 
       if(m != null) { 
        Object y = m.invoke(x , new Object[0]); 
        if(n != null) { 
         ciscoLogger = new CLogger(); 
         ciscoLogger.target = y; 
         ciscoLogger.traceImpl = n ; 
        } 
       } 
      } 
     } catch(Throwable e) 
     { 
      System.err.println(e.getMessage()) ; 
      e.printStackTrace(); 
     } 
    } 

    /** 
    * Formats a line and sends to System.out. The collection and formatting of the text is 
    * thread safe. 
    * 
    * @param message  The human message you want to display in the log (required). 
    * @param hostAddress Host address of server (optional) 
    * @param hostPort  Port on hostAddresss (optional) - also used for className in object-specific logs. 
    */ 
    public void log(String message, String hostAddress, String hostPort) 
    { 
     if (message == null || message.length() < 3) return; 

     synchronized(this) 
     { 
      try { 
       line.delete(0, line.length()); 
       line.append(dateFormat.format(new Date())); 
       line.append(hostAddress); 
       line.append(":"); 
       line.append(hostPort); 
       line.append(" "); 
       while (line.length() < 28) 
        line.append(" "); 
       line.append(message); 

       this.write(line.toString()); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    private void write(String line) 
    { 
     System.out.println(line) ; 
    } 

    /** 
    * Write a simple log message to output delegates (default is System.out). 
    * <p> 
    * Will prepend each line with date in yyyyMMddHHmmss format. there will be a big space 
    * after the date, in the spot where host and port are normally written, when {@link LogWriter#log(String, String, String) log(String,String,String)} 
    * is used. 
    * 
    * @param message What you want to record in the log. 
    */ 
    public void log(String message) 
    { 
     if(ciscoLogger != null) ciscoLogger.trace(0x01, message); 
     this.log(message, "", ""); 
    } 

    class CLogger 
    { 
     Object target; 
     Method traceImpl; 

     @SuppressWarnings("boxing") 
     public void trace(int x, String y) 
     { 
      try { 
       traceImpl.invoke(target, x, y) ; 
      } catch(Throwable e) { 
       // nothing to say about this 
      } 
     } 
    } 

} 
関連する問題