我完全迷住了。我有一个带有一堆自定义JAVA类的jsp应用程序。到目前为止,我已经能够在开发环境中进行开发,然后将我的JAVA类,JSP文件或数据库条目从开发转移到生产。 (两个不同的服务器。)

几天前,我所有的JSP文件开始引发编译错误。我对某些单元做了一些小的更改,但没有对JSP文件进行更改。因此,我重新启动了Tomcat,然后再次尝试。我重新启动了Apache和Tomcat,然后重试。我从生产服务器复制了这些类,重新启动了Tomcat,然后重试。我在开发服务器中始终遇到错误。 (几个月来我没有对其配置进行任何更改。)

因此,我创建了一个简单的测试应用程序,该应用程序仅通过其构造函数初始化了几个类。它在开发环境(使用旧类或新类)中失败,并且在生产环境中完美运行。好像编译器在获取我的单元的定义时使用的不是CLASS文件(WEB-INF / classes / booknowservices / *。class)。

例如,测试三个构造函数:

 /* --------- constructor definitions from JAVA source -----
 database:  Constructor:
     public BKDataServices (String currentHost)

 utilities:  Constructor:
      public BKUtil (BKDataServices thisdatabase)

 textservices:    Constructor:
      public BKTextServices(BKDataServices thisdatabase, BKUtil thisutilities)
  --------------- */

 BKDataServices  database = new BKDataServices(serverName);
 BKUtil utilities = new BKUtil(database);
 BKTextServices pagetext = new BKTextServices(database,utilities);


产生编译错误


  构造函数BKTextServices(BKDataServices,BKUtil)未定义


似乎BKUtil的基础定义可能是罪魁祸首-当我尝试将其作为参数传递时,我也会遇到错误:

//  Establish the link between the database class and the utilities class.
database.setUtilities(utilities);
database.setUtilities((booknowservices.BKUtil)utilities);



  BKDataServices类型的setUtilities(BKUtil)方法不适用于自变量(BKUtil)
  无法从booknowservices.BKUtil转换为booknowservices.BKUtil


由于在生产中一切正常(包括测试),所以我并没有完全停下来,但是我想恢复开发系统,以便我可以放心地更新生产服务器。

任何有关如何诊断此问题的想法将不胜感激。

我创建了一个CompileTest.jsp来演示该问题。我尚未创建要共享的“空”类,但是如果需要,我会这样做。

谢谢,

戴夫博士

最佳答案

听起来您的类路径中有旧的JAR或类文件。

使用额外的VM选项-verbose:class运行有问题的程序,例如

`java -verbose:class Whatever.whatever`


这将导致VM打印出其加载的每个类的转储,以及从中加载它们的源。特别是,请确保您的BKDataServicesBKUtil来自您期望的位置。

一个不太完整的替代方法是这样的:

public static void printResource (Class<?> c) {
    String src;
    ClassLoader cl = c.getClassLoader();
    if (cl != null)
        src = cl.getResource(c.getName().replace('.', '/') + ".class").toString();
    else
        src = "[null ClassLoader]";
    System.err.println(c.getName() + " => " + src);
}


然后:

printResource(booknowServices.BKUtil.class);
printResource(BKDataServices.class);


等等,这将打印从中加载类的源.class文件,因此您可以确保它们是您期望的。空的ClassLoader表示它是引导类加载器或原始类型。

07-25 21:20