【发布时间】:2011-03-09 04:46:52
【问题描述】:
虽然我是该网站的老用户,但我之前自己设法解决了问题。这次我需要你的建议:)
情况: 我继承了使用 SQLJ 进行数据库访问的旧 Java 项目代码。项目中既不需要数据库也不需要 SQLJ,但我无法更改历史记录,因此必须忍受它。故事的另一部分是以前在 JDeveloper 中进行开发,但是新的公司标准需要 Eclipse(我更喜欢一个更好的产品)。
但是我在迁移 SQLJ 以使用 javac 而不是 Oracle 编译器自动构建 Ant 时遇到了问题。那么问题来了:
由于包结构的差异,SQLJ 生成的 Java 文件对 javac 编译器无效。然而,只要 JDeveloper (11.1.1.0.2) 使用旧的 oracle 编译器,它就接受此类 java 文件。 sqlj和Java的例子更好地说明问题:
SQLJ
package Sess;
public class UserDB extends Object implements SessConstants
{
#sql public static iterator UserIterator(
String m
<cut off>
);
<cut off>
private static UserIterator UserIter = null;
}
public static boolean readNext(User theUser )
throws SQLException
{
if (iteratorOpen == false)
{
#sql UserIter = {
select
m
<cut off>
from
<cut off>
};
iteratorOpen = true;
<cut off>
生成的 JAVA:
package Sess;
public class UserDB extends Object implements SessConstants
{
public static class UserIterator
extends sqlj.runtime.ref.ResultSetIterImpl
implements sqlj.runtime.NamedIterator
<cut off>
public static boolean readNext(User theUser )
throws SQLException
{
if (iteratorOpen == false)
{
<cut off>
{
<cut off>
UserIter = new Sess.UserDB.UserIterator(new
...
<cut off>
问题在于最后一条语句
UserIter = new Sess.UserDB.UserIterator(new ...
实际上应该是:
UserIter = new UserDB.UserIterator(new
那么就OK了。
请注意,较新版本的 JDeveloper 也存在与使用 javac 相同的问题(我相信)。
作为一种解决方法,我们将 Java 文件与 SQLJ 一起存储,并且在我们从更改的 SQLJ 重新生成 java 之后,我们再次修复 Java。手动执行这些操作不太高兴,因为在需要更新 SQLJ 的情况下,它会使自动构建过程无效。
有人有什么想法吗?非常感谢您的帮助:)
干杯
【问题讨论】: