2011-03-09 67 views
0

虽然我是网站的旧时用户,但之前设法自己解决问题。这一次我需要你的建议:)SQLJ生成无效的Java代码

The situation: 我已经继承了SQLJ用于数据库访问的旧Java项目代码。该项目不需要数据库和SQLJ,但我无法更改历史记录,因此不得不忍受它。这个故事的另一部分是之前的开发是在JDeveloper中完成的,然而新的公司标准需要Eclipse(我的偏好是一个更好的产品)。

但我有一个迁移SQLJs的问题,使用javac代替Oracle编译器自动构建Ant。因此,问题来了:

由于Package结构的差异,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需要更新时使自动构建过程失效。

任何人有任何想法?你的帮助是非常赞赏:)

干杯

回答

0

好了,不多我可以得到回应,尽管这是合理的 - 专题是难得的一个。我也没有发现太多。它看起来像蚂蚁和sqlj存在一个问题需要克服。我们不得不跟上原来的解决方法。即我们编译sqlj,然后手动修改文件(scrip),然后编译它。丑陋但有用。