出于某种原因,将@Override
方法覆盖接口方法会导致 JSP 编译在 weblogic 中失败。一切肯定都在流失JDK 1.6.0_14
,但这种 Java 5 主义仍然存在。
奇怪的是,JSP 编译偶尔会失败,堆栈跟踪指向 JSP 本身不一定明显使用的代码。
这里发生了什么?
出于某种原因,将@Override
方法覆盖接口方法会导致 JSP 编译在 weblogic 中失败。一切肯定都在流失JDK 1.6.0_14
,但这种 Java 5 主义仍然存在。
奇怪的是,JSP 编译偶尔会失败,堆栈跟踪指向 JSP 本身不一定明显使用的代码。
这里发生了什么?
我自己也见过很多。在 Java 6 中,(假设)允许在接口实现方法上使用 @Override。在 Java 5 中,这是一个错误。但是在我的 Java 6 代码中,有时 @Override 在接口实现方法上被接受,有时则不是。
更奇怪的是,一些 IDE(例如 NetBeans)可以使用它,而 IntelliJ IDEA 有时可以,有时不行。但是,我发现在任一 IDE 中编译代码都会忽略 IDE 报告的所谓错误。
换句话说,问题是否体现在您的 IDE 中?如果是这样,直接编译代码(必要时使用命令行),看看会发生什么。IDE 可能会报告虚假错误。
@Override 应该只保留在源代码中,因此不应出现在字节码中。您可以从某个角度确保这些类与 JSP 分开编译并且仅在类路径中可用,而不是在源路径中可用。
如果情况已经如此,那么它可能与立即显示的问题不同。
曾经是 JSP 编译器,它是服务器附带的一个单独的库,与运行服务器的 vm 无关。WLS 曾经使用 Javelin。似乎他们在 10 中将其切换为使用Java Compiler API。因此,只要您拥有 Sun vm Java 1.6,它就应该可以正常工作。但是如果你的堆栈跟踪中有“标枪”的东西,一定要检查那个角度。
我同意您的直觉以及 WLS 在这里使用 Java 5 的其他答案。下面的项目似乎是来自 Oracle/WebLogic 资源的有用花絮。我没有安装 WebLogic Server 10.3 来确认这些:
据此,至少需要 Weblogic Server 10.3 才能使用 Java 6,但我看不到任何确认这是权威信息的东西:
回复:WebLogic 10.0 支持 Java 6?
发布时间:2009 年 4 月 9 日下午 12:26 回复:user8324142
您好,
Weblogic 10 将不支持 JDK6。
请升级到 Weblogic 10.3 以使用 JDK 6。
确定您使用的 JDK 版本
您可以通过发出命令来确定您使用的是哪个版本的 JDK,如下所示:
打开命令提示符窗口并转到相应的目录:
BEA_HOME\WL_HOME\server\bin (Windows)
BEA_HOME/WL_HOME/server/bin (UNIX)在这两个路径名中,BEA_HOME 代表您安装软件的目录,WL_HOME 代表 wlserver_<版本>。
通过在提示符处输入以下命令,确保您的环境设置正确: setWLSenv.cmd (Windows)
setWLSenv.sh (UNIX)在提示符处输入以下命令:java -version
设置用于启动 WebLogic Server 的 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
...
在我看来,@Override
对于覆盖方法而不是实现方法的方法是有意义的。
所以如果你有一个接口:
public interface MyInterface {
public void doSomething();
}
实现该接口的类如下(MyClassA
):
public MyClassA implements MyInterface {
public void doSomething() {
System.out.println("This is from MyClassA");
}
}
然后,下面的类 extendsMyClassA
和overrides doSomething
,然后我会添加@Override
注释。
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");
}
}