0

虽然我是该网站的老用户,但之前自己设法解决了问题。这次我需要你的建议:)

情况:我继承了旧的 Java 项目代码,其中 SQLJ 用于数据库访问。项目中既不需要数据库也不需要 SQLJ,但我无法更改历史记录,因此必须忍受它。故事的另一部分是以前在 JDeveloper 中进行开发,但是新的公司标准需要 Eclipse(我更喜欢一个更好的产品)。

但是我在使用 javac 而不是 Oracle 编译器迁移 SQLJ 以使用 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 

然后就可以了。

请注意,较新版本的 JDeveloper 也存在与使用 javac 相同的问题(我相信)。

作为一种解决方法,我们将 Java 文件与 SQLJ 一起存储,并且在我们从 SQLJ 更改重新生成 java 之后,我们再次修复 Java。手动执行这些操作不是很高兴,因为在需要更新 SQLJ 的情况下,它会使自动构建过程无效。

有人有什么想法吗?非常感谢您的帮助 :)

干杯

4

1 回答 1

0

好吧,我能得到的回应不多,尽管这是合理的——话题很少见。我也没有发现自己。看起来 ant 和 sqlj 存在需要克服的问题。

事实上,我们必须跟上最初的解决方法。即我们编译sqlj,然后手动修改文件(脚本完成),然后编译它。丑陋但有效。

于 2011-04-13T05:36:22.620 回答