0

UNIX サーバーの別のパスにある jar ファイルを必要とする Java プログラムを試しました。サーブレットを使用してこのプログラムを呼び出すため、プログラムが必要なときにこの jar を使用したいと考えています。java -cp .;*.jar myProgram のようにjarを含むプログラムをコンパイルすると、動作します。しかし、サーブレットから以下の関数を呼び出すと、jar が含まれていないため、エラーが発生します。お知らせ下さい。jarが含まれていたEclipseプロジェクトから試したときと同じです。

void doBless(int i,String Envs) {
    String url = "jdbc:sybase:Tds:ramu-sys:5000/".concat(Envs);
    connection b=new connection();
    System.out.println(url);
    String queryString;
    String temp;
    try {
      Class.forName("com.sybase.jdbcx.SybDriver");
    }
    catch( Exception e ) {
      System.out.println("Failed to load sybase driver.");
      return;
    }

    try {

      ResultSet myResultSet =null;

          Connection con = DriverManager.getConnection(url, "sa", "");
      Statement select = con.createStatement();

      temp="insert into Persons (P_Id,FirstName,LastName,Address,City) values (" +i+",'" + blessArray.get(i)+ "','"+ blessArray.get(i)+ "','"+ blessArray.get(i)+ "','"+ blessArray.get(i)+ "')";
      System.out.println(temp);

       select.executeQuery(temp); 

       select.close();
       con.close();


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

2 に答える 2

3

環境に関連するいくつかの概念と、そのようなエラーが発生する理由について誤解があると思います。

「java -cp」で述べたように「通常の」Javaプログラムを実行している場合、クラスパスにあるjarを自分で明示的に定義します。これは、サーブレットを実行している場合には当てはまりません。サーブレットは、Java で直接実行することはできません (必要に応じて「main」メソッドがありません)。

代わりに、別の Java ベースのアプリケーション (コンテナーと呼ばれる) 内で実行されるように設計されています。展開に関しては、サーブレットをクラス ファイルにコンパイルし、それを特別なディレクトリに配置して、コンテナーを実行します。

コンテナー アプリケーションはディレクトリ内のファイルを読み取り、サーブレットを認識してそのインスタンスを作成します。つまり、サーブレットを管理します。実行時にクラスを認識するために、コンテナーはカスタム クラス ローダーを使用するため、これらのクラスローダーがこれらの jar からクラスを正しくロードするように、サーバーが何らかの形で依存する jar をデプロイする必要があります。

上記で提案されている maven や ant などのツール - アプリケーションを構築するプロセスを処理するだけで、jar を正しい場所に「配置」できますが、IMO では、何がどこにあり、各コンポーネント/ツールの責任が何であるかを理解する必要があります。

わかりました、では、瓶を保管する場所はどこですか. そのような場所は複数あり、それぞれの場所に瓶を置いた結果がどうなるかを理解する必要があります。最も簡単な解決策は、サーブレットを WAR ファイルでラップすることです (または、定義済みのレイアウトでディレクトリとして残すこともできます)。WAR (Web Application Archive) は、すべてのサーブレットと jar が含まれるファイル/ディレクトリです。すべての Web コンテナーが WAR のレイアウトを理解する必要があるため、JAR を WAR ファイル内の WEB-INF/lib フォルダーに配置できます。このオプションを選択する必要があると思います。

もう 1 つのオプションは、コンテナ自体に必要な jar が存在するディレクトリに jar を配置することです。これはあまり好ましくありませんが、場合によっては必要になります。

これで物事がより明確になることを願っています:)頑張ってください!

于 2012-07-15T06:25:21.737 に答える
1

ビルド ツールを使用して、jar が WEB-INF/lib に含まれていることを確認します。または、サーブレット コンテナーのクラスパス (ほとんどの場合、サーブレット コンテナーの lib フォルダー) に配置します。

于 2012-07-15T06:27:59.583 に答える