Java Tomcat不会选择修改过的类
我在hive-jdbc-0.13.1-cdh5.3.3.jar中修改了几个类(如HiveConnection.class、HiveDatabaseMetaData.class、HiveResultSetMetaData.class、HiveStatement.class),并创建了一个只包含修改过的类的新jar,并将其命名为0\u modified\u hive\u jdbc.jar 这些类有一些重写的方法,这些方法引发了不支持的方法异常。相反,我们用相同的名称创建了类,我们记录了消息,并没有引发异常 放置在tomcat/lib中的hive-jdbc-0.13.1-cdh5.3.3.jar(因为org.apache.hive.jdbc.HiveDriver在server.xml中被称为JNDI的驱动程序名) 我把所有的外部罐子都放在这里Java Tomcat不会选择修改过的类,java,tomcat,tomcat7,classloader,spring-jdbc,Java,Tomcat,Tomcat7,Classloader,Spring Jdbc,我在hive-jdbc-0.13.1-cdh5.3.3.jar中修改了几个类(如HiveConnection.class、HiveDatabaseMetaData.class、HiveResultSetMetaData.class、HiveStatement.class),并创建了一个只包含修改过的类的新jar,并将其命名为0\u modified\u hive\u jdbc.jar 这些类有一些重写的方法,这些方法引发了不支持的方法异常。相反,我们用相同的名称创建了类,我们记录了消息,并没有引
/home/nages/external_jar/0_override/0_modified_hive_jdbc.jar
/home/nages/external_jar/hive/hive-jdbc-0.13.1-cdh5.3.3.jar
/home/nages/external_jar/others/commons-lang-2.5.jar
/home/nages/external_jar/others/spring-beans-2.5.3.jar
/home/nages/external_jar/others/spring-context-2.5.3.jar
/home/nages/external_jar/others/spring-core-2.5.3.jar
/home/nages/external_jar/others/spring-jdbc-2.5.3.jar
/home/nages/external_jar/others/spring-tx-2.5.3.jar
etc..
像这样提到这些罐子
文件/home/nages/tomcat/conf/Catalina/localhost/myapp.xml
<Context reloadable="true" path="/myapp">
<Loader className="org.apache.catalina.loader.VirtualWebappLoader" virtualClasspath="/home/nages/external_jar/0_overrider/*.jar;/home/nages/external_jar/hive/*.jar;/home/nages/external_jar/others/*.jar;/etc/hadoop/conf/;"/>
</Context>
我得到了以下例外
Caused by: java.sql.SQLException: Method not supported
at org.apache.hive.jdbc.HiveResultSetMetaData.isSigned(HiveResultSetMetaData.java:141)
at com.sun.rowset.CachedRowSetImpl.initMetaData(CachedRowSetImpl.java:726)
at com.sun.rowset.CachedRowSetImpl.populate(CachedRowSetImpl.java:640)
at org.springframework.jdbc.core.SqlRowSetResultSetExtractor.createSqlRowSet(SqlRowSetResultSetExtractor.java:66)
at org.springframework.jdbc.core.SqlRowSetResultSetExtractor.extractData(SqlRowSetResultSetExtractor.java:49)
at org.springframework.jdbc.core.JdbcTemplate$1QueryStatementCallback.doInStatement(JdbcTemplate.java:447)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:395)
... 48 more
问题是为什么它不从覆盖的jar中选择org.apache.hive.jdbc.HiveResultSetMetaData.class?jsp表示类加载器从覆盖的jar中选取该类,而在执行查询时,它从其他地方选取该类
爪哇:1.7_45u
tomcat:7.0.35可能是Hive使用自己的类加载器只查看自己的jar内部。您是否尝试过将重写的类物理地放在hive jar中,替换原来的类?这很有效,但我不想这样做。可能是hive正在使用自己的类装入器来只查看自己的jar中。您是否尝试过将重写的类物理地放在配置单元jar中,替换原来的类?这很有效,但我不想这样做。
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.support.rowset.SqlRowSet;
JdbcTemplate template = new JdbcTemplate(getDataSource("Hive"));
SqlRowSet sqs = template.queryForRowSet(sqlQuery);
Caused by: java.sql.SQLException: Method not supported
at org.apache.hive.jdbc.HiveResultSetMetaData.isSigned(HiveResultSetMetaData.java:141)
at com.sun.rowset.CachedRowSetImpl.initMetaData(CachedRowSetImpl.java:726)
at com.sun.rowset.CachedRowSetImpl.populate(CachedRowSetImpl.java:640)
at org.springframework.jdbc.core.SqlRowSetResultSetExtractor.createSqlRowSet(SqlRowSetResultSetExtractor.java:66)
at org.springframework.jdbc.core.SqlRowSetResultSetExtractor.extractData(SqlRowSetResultSetExtractor.java:49)
at org.springframework.jdbc.core.JdbcTemplate$1QueryStatementCallback.doInStatement(JdbcTemplate.java:447)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:395)
... 48 more