【问题标题】:JSP Compile Error on Class Constructor类构造函数上的 JSP 编译错误
【发布时间】:2013-08-17 21:57:50
【问题描述】:

我完全糊涂了。我有一个带有一堆自定义 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 来演示该问题。我还没有创建“空”类来分享,但如果需要我会这样做。

谢谢,

戴夫博士

【问题讨论】:

  • 在 JBoss 4.2 上,我在重命名可部署工件以便不再部署它们时看到了类似的问题。就像 blah.war 到 blah.old。

标签: java jsp constructor


【解决方案1】:

听起来您的类路径中某处有一个旧的 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 意味着它要么是引导类加载器,要么是原始类型。

【讨论】:

  • 谢谢 Jason C!你是对的,因为我有一个杂散文件 - 我使用 puTTy 访问服务器,然后执行“find / -name BKUtil *” - 果然,Tomcat 工作目录结构中有一个旧版本的副本。
猜你喜欢
  • 2015-03-12
  • 1970-01-01
  • 2016-12-23
  • 2015-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
相关资源
最近更新 更多