虽然我是该网站的老用户,但之前设法解决了问题。这次我需要你的建议:)
情况: 我继承了旧的Java项目代码,其中SQLJ用于数据库访问。项目中既不需要数据库也不需要SQLJ,但我无法更改历史记录,因此必须使用它。故事的另一部分是开发工作之前在JDeveloper中完成,但是新的公司标准要求Eclipse(在我的偏好中是更好的产品)。
但是我使用javac而不是Oracle编译器迁移SQLJ以使用Ant自动构建时遇到了问题。所以这就出现了问题:
由于Package结构的不同,SQLJ生成的Java文件对javac编译器无效。但是,JDeveloper(11.1.1.0.2)接受此类java文件,只要它使用旧的oracle编译器。 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 :(得分:0)
嗯,虽然这是合理的,但我没有多少回应 - 主题是罕见的。我发现自己也不多。看起来ant和sqlj存在一个需要克服的问题。
事实上,我们必须跟上原始的解决方法。即我们编译sqlj,然后手动修改文件(脚本),然后编译它。丑陋但有效。