0

我尝试了一个 java 程序,它需要一个 jar 文件位于 unix 服务器的另一个路径中。我希望在我需要程序时使用这个 jar,因为我使用一个 serverlet 来调用这个程序。当我编译包括像 java -cp .;*.jar myProgram 这样的 jar 的程序时,它可以工作。但是当我从 servlet 调用下面的函数时,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 程序时,如您使用“java -cp”所述,您自己明确定义哪些 jar 应位于类路径中。当您运行 servlet 时,情况并非如此。Servlet 不能直接由 java 运行(如果需要,它们没有方法'main')。

相反,它们被设计为在另一个基于 Java 的应用程序(称为容器)中运行。在部署方面,您将您的 servlet 编译成一个类文件,将其放入特殊目录并运行您的容器。

容器应用程序读取目录中的文件,识别 servlet 并创建它的实例。换句话说,它为您管理 servlet。现在,为了在运行时识别类,容器使用它们的自定义类加载器,因此您必须部署服务器依赖的 jar,这些类加载器会正确地从这些 jar 中加载类。

上面建议的工具,如 maven 或 ant - 只需处理构建应用程序的过程,并可以将 jar 放在正确的位置,但 IMO 你仍然应该了解每个组件/工具的去向和职责。

好的,那么,这些罐子应该存放在哪些地方。这样的地方不止一个,你应该明白把罐子放在每个地方会有什么后果。最简单的解决方案是将您的 servlet 包装在 WAR 文件中(或者甚至将其保留为预定义布局中的目录)。WAR(Web 应用程序存档)是一个文件/目录,其中包含所有 servlet 和 jar。由于所有 Web 容器都应该了解 WAR 的布局,因此您可以将 JAR 放在 WAR 文件内的 WEB-INF/lib 文件夹中。我相信你应该选择这个选项。

另一种选择是将 jar 放在容器本身所需的 jar 所在的目录中。这是不太可取的,但有时需要。

我希望这能让事情更清楚:) 祝你好运!

于 2012-07-15T06:25:21.737 回答
1

Use a build tool and make sure the jar is included in the WEB-INF/lib. Or put it on the classpath of your servlet container (most usually the lib folder of the servlet container).

于 2012-07-15T06:27:59.583 回答