在WebSphere 6.1上使用ant/jenkins生成EAR的类强制转换异常



在将作为运行在Jenkins上的ant构建脚本的一部分生成的ear部署到Websphere 6.1之后,我遇到了运行时类强制转换异常。强制转换类异常出现在一些DAO方法中,这些方法将SQL查询返回的对象强制转换为特定的类。

如果我从Eclipse (RAD)中生成EAR,则不会发生类强制转换异常,并且比较jenkins/ant生成EAR的类文件与Eclipse生成的类文件会显示不同的文件大小和内容。

我试图让ant执行javac与websphere 6.1提供的JDK。所以我在Jenkins中设置了一个多配置项目来使用IBM JDK。我假设这使得ant javac任务使用这个jdk。

我的ant javac任务:

    <javac srcdir="${src.dir}" destdir="${build.dir}"  debug="true"  debuglevel="vars,lines,source" target="1.5">
        <classpath refid="master-classpath" />
    </javac>

我现在能想到的唯一一件事就是确保ant实际上是用这个jdk运行的,而不是用这个jdk执行javac。有办法检查吗?

[edit]我已经将ant.bat文件更改为输出JAVA_HOME,并且它确实在我在jenkins中指定的那个下运行。

[edit2]

Ok,终于找到了问题的原因:

在Hibernate DAO方法中,我们有一些(糟糕的)代码,像这样:

String sql = "select {entity.*}, {entity2.*}, ...";
SQLQuery  query = sessionFactory.getCurrentSession().createSQLQuery(sql);
...
List<Entity> queryResult = query.list();
for (Object row : queryResult) {
     Object[] arr = (Object[])row;
     Entity entity - (Entity)arr[0];
     Entity2 entity2 - (Entity2)arr[1];
}

你能发现男生的错误吗?

queryResult不是List<Entity>而是List<Object[]>—类强制转换异常发生在for (Object row : queryResult)

那么,现在我的问题是-类型擦除发生了什么?

Eclipse使用什么编译器选项,允许它在运行时忽略像这样的类强制转换错误?

可能不是JDK,而是其他不同的库。值得检查。

相关内容

  • 没有找到相关文章

最新更新