我在 hive-jdbc-0.13.1-cdh5.3.3.jar 中修改了几个类(如HiveConnection.class,HiveDatabaseMetaData.class,HiveResultSetMetaData.class,HiveStatement.class),并创建了一个新的jar,它只包含修改过的类,并将其命名为 0_modified_hive_jdbc.jar 。
这些类有一些覆盖方法,它们抛出方法不支持异常。相反,我们使用相同的名称创建了类,我们记录了消息,而没有抛出异常。
在tomcat / lib中放置 hive-jdbc-0.13.1-cdh5.3.3.jar (因为org.apache.hive.jdbc.HiveDriver在服务器中被称为JNDI的驱动程序名称.XML)
我已经放置了所有这样的外部罐子,
/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>
在tomcat中部署我的应用程序(myapp.war)。
在myapp.war中提供的find.jsp。
/home/nages/tomcat/webapps/myapp/find.jsp
以下是find.jsp
中提供的一段代码ClassLoader loader = clazz.getClassLoader();
if (loader == null){
throw new Exception("Class Loader is null.");
}
String fileName = className.replace('.','/')+".class";
URL fileUrl = loader.getResource(fileName);
out.println("<b>Location : </b>" + fileUrl);
当我在find.jsp中请求org.apache.hive.jdbc.HiveConnection时,它会返回,
位置:jar:file:/home/nages/external_jar/0_override/0_modified_hive_jdbc.jar!/org/apache/hive/jdbc/HiveConnection.class。
在战争中有一个java类,它有以下代码
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
问题是它为什么不从overriden jar中选择org.apache.hive.jdbc.HiveResultSetMetaData.class? find.jsp表示类加载器从覆盖jar中选择它,而在执行查询时,它从其他地方选择。
Java:1.7_45u tomcat:7.0.35