在将作为运行在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,而是其他不同的库。值得检查。