代码之家  ›  专栏  ›  技术社区  ›  Stefan Kendall

@重写接口方法会导致JSP编译失败

  •  3
  • Stefan Kendall  · 技术社区  · 14 年前

    出于某种原因, @Override 重写接口方法会导致WebLogic中的JSP编译失败。一切都很顺利 JDK 1.6.0_14 但是这个Java5的ISM仍然存在。

    奇怪的是,JSP编译偶尔会失败,stacktrace指向JSP本身不一定使用的代码。

    这是怎么回事?

    5 回复  |  直到 14 年前
        1
  •  3
  •   David Blevins    14 年前

    @override应该只保留在源代码中,所以不应该出现在字节代码中。您可以从一个角度来确保这些类与JSP分开编译,并且只在类路径(而不是源路径)中可用。

    如果这已经是事实了,那么它可能是一个不同于立即显示的问题。

    曾经是JSP编译器的是服务器附带的一个单独的库,而不是与运行服务器的虚拟机绑定在一起。我以前用标枪。好像他们在10分钟内把它换成了 Java Compiler API . 所以只要你有Sun VM Java 1.6,它就可以正常工作。但如果你的stacktrace里有标枪,一定要检查这个角度。

        2
  •  3
  •   Vanessa Williams    14 年前

    我自己也见过很多。在Java 6中,可以使用(假定)使用@重写接口实现方法。在Java 5中,这是一个错误。然而,在我的Java 6代码中,有时在接口实现方法上接受“超驰”,有时不是。

    让事情变得更奇怪的是,一些IDE(如NetBeans)可以使用它,而Intellij的想法有时是可以的,有时不是。不过,我发现,在任意一个IDE中编译代码都将忽略IDE报告的所谓错误。

    换句话说,问题是否在您的IDE中显现?如果是这样,直接编译代码(必要时使用命令行)并查看会发生什么。IDE可能报告了错误。

        3
  •  1
  •   Pascal Thivent    14 年前

    可能的解决方法是使用 appc . 这至少可以绕开这个问题。

    关于“真正的”问题,我的理解是您确实升级了域,因此可以查看以下资源:

    这是一个疯狂的猜测,但可能激活了一些向后兼容性标志,WebLogic继续使用“旧”方法。

        4
  •  0
  •   Bert F    14 年前

    我同意你的直觉和WLS使用Java 5在这里的其他答案。下面的项目似乎是来自Oracle/WebLogic资源的有用的消息。我没有安装WebLogic Server 10.3来确认这些:

    WebLogic服务器10.3

    根据此,至少WebLogic Server 10.3需要使用Java 6,但是我不能看到任何确认这是权威信息的东西:

    Re:WebLogic 10支持Java 6?
    发布时间:2009年4月9日下午12:26回复:user8324142
    你好,
    WebLogic10不支持JDK6。
    请升级到WebLogic 10.3以使用JDK 6。

    检查Java版本

    确定要使用的JDK版本

    您可以通过发出以下命令来确定正在使用的JDK版本:

    1. 打开命令提示窗口并转到相应的目录:
      bea_home\wl_home\server\bin(Windows)
      bea_home/wl_home/server/bin(Unix)

      在这两个路径名中,bea_home代表安装软件的目录,wl_home代表wlserver_uult;version>。

    2. 通过在提示下输入以下命令,确保环境设置正确: setwlsenv.cmd(窗口)
      setwlsenv.sh(Unix)

    3. 在提示下输入以下命令: Java版本

    配置Java版本:

    设置用于启动WebLogic服务器的Java参数

    …无论何时启动WebLogic Server,都必须指定Java参数。…Oracle建议您将命令合并到[Startup]脚本中…

    如果使用配置向导创建域,则WebLogic启动脚本位于指定域的域名目录中。默认情况下,此目录为bea_home\user_projects\domain\domain name,其中bea_home是包含产品安装的目录,domain name是由所选配置模板定义的域目录的名称。…

    将变量java_home的值更改为JDK的位置。例如:
    set JAVA_HOME=C:\bea\jdk150_03

        5
  •  -2
  •   jamiebarrow    14 年前

    在我心中, @Override 对重写方法而不是实现方法的方法有意义。

    因此,如果您有一个接口:

    public interface MyInterface {
        public void doSomething();
    }
    

    一个班级 器具 那个接口在下面( MyClassA ):

    public MyClassA implements MyInterface {
        public void doSomething() {
            System.out.println("This is from MyClassA");
        }
    }
    

    然后,下面的类扩展 米亚克拉 重写 doSomething 然后我再加上 @重写 注释。

    public MyClassB extends MyClassA implements MyInterface {
        @Override
        public void doSomething() {
            System.out.println("This is from MyClassB");
        }
    }
    

    在任何情况下,我都不会执行下面的操作(无论是否允许),因为它打破了覆盖某些内容的想法—您正在实现,而不是覆盖接口:

    public MyClassA implements MyInterface {
        @Override
        public void doSomething() {
            System.out.println("This is from MyClassA");
        }
    }